zoukankan      html  css  js  c++  java
  • 朴素贝叶斯分类器基本代码 && n折交叉优化

    自己也是刚刚入门。。

    没脸把自己的代码放上去,先用别人的。

    加上自己的解析,挺全面的,希望有用。

    import re
    import pandas as pd
    import numpy as np
    from sklearn.metrics import roc_auc_score
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.naive_bayes import MultinomialNB as MNB #朴素贝叶斯公式
    from sklearn.model_selection  import cross_val_score
    def proces(review):
        #把review转成词序列
        review_text=re.sub("[^a-zA-Z]"," ",review) #非大小写字母的字符替换成空格
        #re.sub是正则表达式的函数,实现比普通字符串更强大的替换功能
        #print(review_text)
        words=review_text.lower().split() #全转换为小写后,根据空格分割单词
        #print(words)
        return words
    train=pd.read_csv('train.csv',lineterminator='
    ') #使用pandas的read读取文件,以换行符号为止为一段数据
    '''
    官方文件:
    pandas.read_csv(filepath_or_buffer, sep=', ', delimiter=None, header='infer', 
    names=None, index_col=None, usecols=None, squeeze=False, prefix=None, 
    mangle_dupe_cols=True, dtype=None, engine=None, converters=None, 
    true_values=None, false_values=None, skipinitialspace=False, 
    skiprows=None, nrows=None, na_values=None, keep_default_na=True,
     na_filter=True, verbose=False, skip_blank_lines=True, 
     parse_dates=False, infer_datetime_format=False, keep_date_col=False, 
     date_parser=None, dayfirst=False, iterator=False, chunksize=None, 
     compression='infer', thousands=None, decimal=b'.', lineterminator=None,
      quotechar='"', quoting=0, escapechar=None, comment=None, encoding=None, 
      dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True,
       skipfooter=0, doublequote=True, delim_whitespace=False, 
       low_memory=True, memory_map=False, float_precision=None)
       
       https://blog.csdn.net/sinat_35562946/article/details/81058221
       这个博客讲的还行
    '''
    print(train.head(5))
    x=train['review']
    #print(x)
    y=train['label']
    #print(y)
    '''
    x与y分离train中的记录和标签
    '''
    class_mapping = {'Negative': 0, 'Positive': 1}
    
    y=y.map(class_mapping)
    #把label中的Negative,Positive转换成0,1标签
    test=pd.read_csv('test.csv', lineterminator='
    ')
    z=test['review']
    w=test['label']
    '''
    x与y分离test中的记录和标签
    '''
    w=w.map(class_mapping)
    train_data=[]
    for i in range(len(x)):
        train_data.append(' '.join(proces(x[i]))) #用空格将train.data的list里的words串联在一起
        pass
    test_data=[]
    for i in range(len(z)):
        test_data.append(' '.join(proces(z[i]))) #用空格将test_data的list里的words串联在一起
        pass
    
    data_all=train_data+test_data #所有词合并成大表data
    #print(data_all)
    #TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
    count_vec = TfidfVectorizer(min_df=2, #严格忽略低于给出阈值的文档频率的词条,语料指定的停用词。
                                analyzer='word', #定义特征为词(word)
                                ngram_range=(1, 3), #ngram_range(min,max)是指将text分成min,min+1,min+2,.........max 个不同的词组
                                use_idf=1, #使用idf重新计算权重
                                smooth_idf=1, #分母加一
                                sublinear_tf=1, #线性缩放TF
                                stop_words='english' #忽略英文停用词
                                )
    '''
        min_df:float in range [0.0, 1.0] or int, optional, 1.0 by default
        当构建词汇表时,严格忽略低于给出阈值的文档频率的词条,语料指定的停用词。
        如果是浮点值,该参数代表文档的比例,整型绝对计数值,如果词汇表不为None,此参数被忽略。
        
        analyzer:string,{‘word’, ‘char’} or callable
        定义特征为词(word)或n-gram字符,如果传递给它的调用被用于抽取未处理输入源文件的特征序列
        
        ngram_range: tuple(min_n, max_n)
        要提取的n-gram的n-values的下限和上限范围,在min_n <= n <= max_n区间的n的全部值
        中ngram_range(min,max)是指将text分成min,min+1,min+2,.........max 个不同的词组
    
        比如'Python is useful'中ngram_range(1,3)之后可得到:
        'Python'  'is'  'useful'  'Python is'  'is useful' 和'Python is useful'如果是ngram_range (1,1) 则只能得到单个单词'Python'  'is'和'useful'
        
        use_idf:boolean, optional
        启动inverse-document-frequency重新计算权重
        
        smooth_idf:boolean,optional
        通过加1到文档频率(底数)平滑idf权重,为防止除零 <-> 加入一个额外的文档
        
        sublinear_tf:boolean, optional
        应用线性缩放TF,例如,使用1+log(tf)覆盖tf。注意,python中log默认取自然对数!
    '''
    lenth=len(train_data)
    count_vec.fit(data_all)
    data_all=count_vec.transform(data_all)
    train_data=data_all[:lenth]
    test_data=data_all[lenth:]
    
    #训练朴素贝叶斯分类器
    model=MNB()
    model.fit(train_data,y)
    pred=model.predict(test_data)
    MNB(alpha=1.0, class_prior=None, fit_prior=True)
    #print("roc_auc",roc_auc_score(w, pred))
    MX = 0;
    for i in range(5, 10):
        MX = max(MX, np.mean(cross_val_score(model, train_data, y, cv=i, scoring='roc_auc'))) #2分类模型
    print("多项式贝叶斯分类器10折交叉验证得分: ", MX)
    '''
    不同的训练集、测试集分割的方法导致其准确率不同.
    而交叉验证的基本思想是:将数据集进行一系列分割,生成一组不同的训练测试集,然后分别训练模型并计算测试准确率,
    最后对结果进行平均处理。这样来有效降低测试准确率的差异。
    '''
    化繁为简 大巧不工
  • 相关阅读:
    Apache虚拟主机(VirtualHost)配置
    LAMP源码安装
    SUSE上配置SAMBA服务
    Linux下安装或升级Python 2.7
    HTML5,CSS3,JS绘制饼图
    Single Number
    Reverse Words in a String
    C++控制台日历
    百度JS破盗链
    腾讯前端突击队Ⅱ
  • 原文地址:https://www.cnblogs.com/mpeter/p/11165182.html
Copyright © 2011-2022 走看看