sk-learn實例-用樸素貝葉斯算法(Naive Bayes)對文本進行分類

簡介

樸素貝葉斯(Naive Bayes)是一個非常簡單,但是實用性很強的分類模型,與基於線性假設的模型(線性分類器和支持向量機分類器)不同,樸素貝葉斯分類器的構造基礎是貝葉斯理論。

抽象一些的說,樸素貝葉斯分類器會單獨考量每一維度特徵被分類的條件概率,進而綜合這些概率並對其所在的特徵向量做出分類預測。因此,這個模型的基本數學假設是:各個維度上的特徵被分類的條件概率之間是相互獨立的。

對樸素貝葉斯算法更深入的理論介紹可以參考這幾篇博客:
帶你徹徹底底搞懂樸素貝葉斯公式
深入理解樸素貝葉斯(Naive Bayes)
樸素貝葉斯分類(Nave Bayes)

樸素貝葉斯模型有着廣泛的實際應用環境,特別是在文本分類的任務中,包括互聯網新聞的分類,垃圾郵件的篩選等。

問題引出

本文使用Scikit-learn中集成的經典的20類新聞文本作爲實驗數據。
需要提醒的是,本文中的數據沒有預存,需要實時從網上下載,而在牆內下載速度有點慢,因此建議翻牆下載。
下面我們先看下數據:

from sklearn import datasets
news = datasets.fetch_20newsgroups(subset='all')
print(len(news.data)) #news.data的數據格式爲list
print(news.data[0])

在這裏插入圖片描述

從圖中我們可以看到,我們的原始數據包含是18846條文本的列表,共有20個類別。由於原始數據中既沒有被設定特徵,也沒有數字化量度。因此在交給樸素貝葉斯分類器學習之前,要對數據進行進一步的處理。

代碼實例

下面開始進行分析

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report

#獲取數據
news = datasets.fetch_20newsgroups(subset='all')

#將數據拆分爲訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(news.data, news.target, 
													test_size=0.25, random_state=33)

#導入文本特徵向量轉化模塊,並將文本特徵向量化
vec = CountVectorizer()
X_train = vec.fit_transform(X_train)
X_test = vec.transform(X_test)    #注意這個函數與上面的不一樣

#使用默認配置初始化樸素貝葉斯模型
mnb = MultinomialNB()
#利用訓練數據對模型參數進行估計,並進行預測
mnb.fit(X_train, y_train)
y_predict = mnb.predict(X_test)

#輸出預測結果
print('The Accuracy of Naive Bayes:', mnb.score(X_test, y_test))
print(classification_report(y_test, y_predict, target_names=news.target_names))

在這裏插入圖片描述

小結

通過上圖的結果可以看出,樸素貝葉斯對4712個測試樣本分類準確性約83.977,結果還是比較不錯的。

  • 樸素貝葉斯被廣泛運用於海量互聯網文本分類任務。
  • 由於其較強的特徵條件獨立假設,使得模型預測所需要估計的參數規模從冪指數量級到線性量級減少,極大的節約了內存消耗和計算時間。
  • 但是也正是受這種強假設的限制,模型訓練時無法將各個特徵之間的練習考量在內,使該模型在特徵之間關聯性較強的分類任務上性能表現不佳。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章