01.17 機器學習實戰:樸素貝葉斯算法在新聞文本數據上的分類表現

大家好,今天跟大家學習一下通過sklearn的樸素貝葉斯模型實戰。前面在 中介紹了樸素貝葉斯的分類原理。想了解的同學可以去看看。

機器學習實戰:樸素貝葉斯算法在新聞文本數據上的分類表現

樸素貝葉斯模型有著廣泛的應用場景,尤其在文本分類任務中表現突出,如新聞分類、垃圾郵件的區分等,本文將學習研究一下 如何對新聞文本數據進行分類。

機器學習實戰:樸素貝葉斯算法在新聞文本數據上的分類表現

本次使用的數據為經典的20類新聞文本數據,來源於sklearn.data。獲取數據代碼如下:

from sklearn.datasets import fetch_20newsgroups
news_data = fetch_20newsgroups(subset = 'all')
print("本次下載的新聞條數為:",len(news_data.data))
#本次下載的新聞條數為: 18846
print("第一篇文章內容的字符數量為:",len(news_data.data[0]))
#第一篇文章內容的字符數量為: 902
print(news_data.data[0]
機器學習實戰:樸素貝葉斯算法在新聞文本數據上的分類表現

由上可知,本次下載的新聞共有18846條,這些文本數據沒有數字化的量度,也沒有具體的特徵,因此需要對數據進行向量處理。首先對數據進行分割,並隨機採樣出一部分數據用於對訓練模型進行測試。

x = news_data.data
y = news_data.target
from sklearn.cross_validation import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25,random_state=33)

通過sklearn.feature_extraction.text 中的CountVectorizer模塊將文本轉化為特徵向量。

from sklearn.feature_extraction.text import CountVectorizer
#文本數據向量化
vec = CountVectorizer()
x_train=vec.fit_transform(x_train)
x_test=vec.transform(x_test)

通過 sklearn.naive_bayes 導入 樸素貝葉斯分類模型(MultinomialNB),並對訓練數據進行參數估計,再通過向量化後的測試數據進行預測。

from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB() #初始化模型
model.fit(x_train,y_train) #調用fit函數進行模型訓練
y_predict = model.predict(x_test) #使用predict 函數進行預測

模型評估在 一文中介紹過,可以使用準確率、召回率、精確率 和 F1指標對分類問題進行評估。

from sklearn.metrics import classification_report
print("模型得分:%.2f" % (float(model.score(x_test,y_test))*100))
模型得分:83.98
print(classification_report(y_test,y_predict,target_names= news_data.target_names))
機器學習實戰:樸素貝葉斯算法在新聞文本數據上的分類表現

從上圖中可以看出,樸素貝葉斯模型對4712條測試樣本新聞進行分類的精確率為83.98%,平均的精確率(0.86)、召回率 (0.84)和 F1指標(0.82) 都在0.8以上,效果還不錯。

機器學習實戰:樸素貝葉斯算法在新聞文本數據上的分類表現

由於其較強的特徵條件獨立假設,使得計算規模極大的降低,極大的降低資源消耗和時間開銷,因此被廣泛的用於海量的文本分類中,但正是這個優點導致了在該模型在關聯性較強的分類任務上表現不好。

好了,今天就到這裡,如有疑問,歡迎大家關注留言。


分享到:


相關文章: