機器學習實戰(6)—— 樸素貝葉斯代碼實現

在上一篇我們通俗易懂講解了樸素貝葉斯算法,本節我們用 Python 實現一下。

本次實戰內容爲 20 類新聞文本的多分類。

數據可以通過如下代碼直接下載:

#20類新聞文本的數據內容(下載數據需要一定時間)

# 從sklearn.datasets裏導入新聞數據抓取器fetch_20newsgroups。
from sklearn.datasets import fetch_20newsgroups
# 與之前預存的數據不同,fetch_20newsgroups需要即時從互聯網下載數據。
news = fetch_20newsgroups(subset='all')
# 查驗數據規模和細節。
print(len(news.data))
print(news.data[0])

通過上面內容可以看到有 18846 條數據。

然後打印了第一篇新聞的內容。

之後進行訓練集和測試集劃分:

# 從sklearn.cross_validation 導入 train_test_split。
from sklearn.cross_validation import train_test_split
# 隨機採樣25%的數據樣本作爲測試集。
X_train, X_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25, random_state=33)

由於數據是文本,通常將其轉爲向量,然後導入樸素貝葉斯模型進行訓練和預測:

# 從sklearn.feature_extraction.text裏導入用於文本特徵向量轉化模塊將文本轉化爲特徵向量。屬於特徵抽取
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裏導入樸素貝葉斯模型。
from sklearn.naive_bayes import MultinomialNB

# 從使用默認配置初始化樸素貝葉斯模型。
mnb = MultinomialNB()
# 利用訓練數據對模型參數進行估計。
mnb.fit(X_train, y_train)
# 對測試樣本進行類別預測,結果存儲在變量y_predict中。
y_predict = mnb.predict(X_test)

之後打印輸出分類結果報告:

# 從sklearn.metrics裏導入classification_report用於詳細的分類性能報告。
from sklearn.metrics import classification_report
print('The accuracy of Naive Bayes Classifier is', mnb.score(X_test, y_test))
print(classification_report(y_test, y_predict, target_names = news.target_names))

我們可以看到,結果如下:

給出了 20 類和總結果的各項評估指標,包括準確率、召回率、F1 分數、樣本量情況。

這就是樸素貝葉斯的代碼實現,是不是很容易呢?

樸素貝葉斯被廣泛應用於海量互聯網文本分類任務,由於其較強的特徵條件獨立假設,使得模型預測所需要估計的參數規模大大減小,極大節約了內存消耗和計算時間。

但是,正因爲這種強假設的限制,模型訓練時無法將各個特徵之間的聯繫考量在內,使得模型在特徵關聯性較強的分類任務上性能表現不佳!

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/hya2uUSqkRgBG2AIHXSTLg