常見的機器學習算法(九)樸素貝葉斯分類器

直接調用sklear的API:

from sklearn.naive_bayes import MultinomialNB            #樸素貝葉斯分類器#
module = MultinomialNB()
module.fit(x, y)
predicted = module.predict(test)

 

本文使用康奈爾大學網站的2M影評數據集,下載地址http://download.csdn.net/detail/lsldd/9346233

每一個特徵值就是一個單詞的TF-IDF。當然,也可以簡單的使用單詞出現的次數。

使用這個比較大的數據集,可以做一點點數據預處理的優化來避免每次都去硬盤讀取文件。第一次運行時,把讀入的數據保存起來,以後就不用每次再去讀取了。
 

import scipy as sp
from sklearn.datasets import load_files
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer#文本特徵提取
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import precision_recall_curve##準確率召回率曲線
from sklearn.metrics import classification_report#構建文本報告,用於展示主要的分類metrics。
"""
3種樸素貝葉斯模型:
①高斯分佈樸素貝葉斯 from sklearn.naive_bayes import GaussianNB
用於一般分類問題。
②多項式分佈樸素貝葉斯 from sklearn.naive_bayes import MultinomialNB
適用於文本數據(特徵表示的是次數,例如某個詞語的出現次數)。
③伯努利分佈樸素貝葉斯 from sklearn.naive_bayes import BernoulliNB
適用於伯努利分佈,也適用於文本數據(此時特徵表示的是是否出現,例如某個詞語的出現爲1,不出現爲0),
絕大多數情況下表現不如多項式分佈,但有的時候伯努利分佈表現得要比多項式分佈要好,尤其是對於小數量級的文本數據。
"""

movie_reviews = load_files('data')
#保存
sp.save('movie_data.npy', movie_reviews.data)
sp.save('movie_target.npy', movie_reviews.target)

# 讀取
movie_data = sp.load('movie_data.npy')#數據
movie_target = sp.load('movie_target.npy')#標籤
x = movie_data
y = movie_target

# 測試樣本調用的是transform接口
count_vec = TfidfVectorizer(binary=False, decode_error='ignore', stop_words='english')#構建詞頻(TF)計算

# 加載數據集,切分數據集80%訓練,20%測試
"""
fit():使模型適合訓練數據,並保存到變量(返回 sklearn.feature_extraction.text.TfidfVectorizer ));
transform():使用 fit()轉換爲驗證/測試數據(返回 scipy.sparse.csr.csr_matrix );
fit_transform():fit() + transform()= fit_transform( ),用於直接轉換訓練數據(返回 scipy.sparse.csr.csr_matrix )
"""
x_train, x_test, y_train, y_test = train_test_split(movie_data, movie_target, test_size=0.2)
x_train = count_vec.fit_transform(x_train)#得到TF-IDF權重矩陣
x_test = count_vec.transform(x_test)

# 調用MultinomialNB分類器
mnb = MultinomialNB().fit(x_train, y_train)
doc_class_predicted = mnb.predict(x_test)

"""
預測有三種方法,包括predict,predict_log_proba和predict_proba:
predict就是我們最常用的預測方法,直接給出測試集的預測類別輸出;
predict_proba則不同,它會給出測試集樣本在各個類別上預測的概率。
容易理解,predict_proba預測出的各個類別概率裏的最大值對應的類別,也就是predict方法得到類別;
predict_log_proba和predict_proba類似,它會給出測試集樣本在各個類別上預測的概率的一個對數轉化。
轉化後predict_log_proba預測出的各個類別對數概率裏的最大值對應的類別,也就是predict方法得到類別;
"""
# 準確率,召回率,閾值
precision, recall, thresholds = precision_recall_curve(y_test, doc_class_predicted)
answer = mnb.predict_proba(x_test)[:, 1]
# print(mnb.predict_proba(x_test))
# print('--------------------------')
# print(mnb.predict(x_test))
report = answer > 0.5#True、False
# print(report)
'classification_report(y_true, y_pred, target_names=target_names)'
print(classification_report(y_test, report, target_names=['neg', 'pos']))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章