樸素貝葉斯分類器基本代碼 && n折交叉優化

本身也是剛剛入門。。python

沒臉把本身的代碼放上去,先用別人的。正則表達式

加上本身的解析,挺全面的,但願有用。app

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='\n') #使用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='\n')
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)
'''
不一樣的訓練集、測試集分割的方法致使其準確率不一樣.
而交叉驗證的基本思想是:將數據集進行一系列分割,生成一組不一樣的訓練測試集,而後分別訓練模型並計算測試準確率,
最後對結果進行平均處理。這樣來有效下降測試準確率的差別。
'''
相關文章
相關標籤/搜索