天天看點

sklearn調包俠之樸素貝葉斯

sklearn調包俠之樸素貝葉斯

文檔處理

樸素貝葉斯算法常用于文檔的分類問題上,但計算機是不能直接了解文檔内容的,怎麼把文檔内容轉換為計算機可以計算的數字,這是自然語言處理(NLP)中很重要的内容。

TF-IDF方法

今天我們簡單講解TF-IDF方法,将文本資料轉換為數字。TF-IDF是一個統計方法,用來評估單個單詞在文檔中的重要程度。

TF表示詞頻,對一個文檔而言,詞頻就是詞在文檔出現的次數除以文檔的詞語總數。例如:一篇文檔有1000個字,“我”字出現25次,那就是0.025;“Python”出現5次就是0.005。

IDF表示一個詞的逆向文檔頻率指數。可以由總文檔數除以包含該詞出現的文檔數目,然後取對數。例如:有10000個文檔,“Python”隻出現了10篇文章,則IDF=log(10000/10)=3;“我”字在所有文檔都出現過,則IDF為0。

詞頻和權重指數相乘,就是詞在文檔中的重要程度。可以看出,詞語的重要性随它在文檔中出現的次數呈正比例增加,但同時會随着它在語料庫中出現的頻率呈反比下降。

實戰——文檔分類

資料導入和TF-IDF

在sklearn中,通過load_files方法可以将子目錄的名字轉換為文檔類别(target),将目錄所有文檔讀入記憶體(data)。

from sklearn.datasets import load_files
news_train = load_files('data/379/train')
           
sklearn調包俠之樸素貝葉斯
sklearn調包俠之樸素貝葉斯

通過TfidfVectorizer方法,将文檔資料進行轉換:

from sklearn.feature_extraction.text import TfidfVectorizer

vect = TfidfVectorizer(encoding='latin-1')
X_train = vect.fit_transform(news_train.data)
           
模型訓練

樸素貝葉斯算法使用sklearn.naive_bayes子產品中的MultinomialNB方法。

from sklearn.naive_bayes import MultinomialNB
y_train = news_train.target
clf = MultinomialNB(alpha=0.0001)
clf.fit(X_train, y_train)
train_score = clf.score(X_train, y_train)

# result 
# 0.99787556904400609
           
模型評估

簡單的,可以通過score方法來評估整個模型的精度。

news_test = load_files('data/379/test')
X_test = vect.transform(news_test.data)
y_test = news_test.target

clf.score(X_test, y_test)

# result 
# 0.90881728045325783
           

我們也可以通過classification_report方法來檢視全方位的評價。

from sklearn.metrics import classification_report

pred = clf.predict(X_test)

print(classification_report(y_test, pred, target_names=news_test.target_names))
           
sklearn調包俠之樸素貝葉斯

也可以檢視我們的混淆矩陣。

from sklearn.metrics import confusion_matrix

cm = confusion_matrix(y_test, pred)

print(cm)
           
sklearn調包俠之樸素貝葉斯