1. 程式人生 > >機器學習系列之樸素貝葉斯演算法(監督學習-分類問題)

機器學習系列之樸素貝葉斯演算法(監督學習-分類問題)

'''
@description :一級分類:監督學習,二級分類:分類(離散問題),三級分類:貝葉斯演算法
    演算法優點:
        a 樸素貝葉斯模型發源於古典數學理論,有穩定的分類效率
        b 對缺失的資料不太敏感,演算法也比較簡
        c 分類問題準確度高、速度快
    演算法缺點:
        a 由於使用了樣本屬性獨立性的假設,所以如果樣本屬性有關聯時其效果不好
    應用場景:常用於文字分類問題
@author wolf
@time   2018-05-02
'''

from sklearn.datasets import fetch_20newsgroups
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 classification_report def naivebases(): # 1 讀取資料,載入sscikitLearn官方資料集 ''' 資料集官方地址:http://sklearn.apachecn.org/cn/0.19.0/datasets/twenty_newsgroups.html 資料集背景:20類別,18846篇文章 資料集類別:news.target_names,news.target 檢視文章內容: orign_data = list(news.data) for x in range(10): print(orign_data[x]) print("*" * 100) type(news.data) 是list不是ndarray '''
news = fetch_20newsgroups(subset='all') # 2 資料集分割:訓練集、測試集 ''' 通用標準:測試集佔比25% type(x_train) 是list不是ndarray ''' x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25) # 3 特徵工程:資料集特徵抽取 ''' 使用tf-idf演算法: a 提取文章內容中分詞(通用規則按空格,英文文章不需要處理,中文需要藉助開源工具jieba按中文語義拆分中文分詞) b 計算分詞在文章中重要性(大部分語氣詞詞頻很高,但不能代表文件的屬性) c tf-idf = tf(term frequnce分詞在文章中詞頻) * idf(inverse document frequnce) idf = log(總文件數/該分詞出現的文件數) log:對資料函式 d 返回所有分詞(特徵)相對於文章的重要性矩陣 tf.get_feature_names(),返回結果預設是sparse矩陣: x_train.toarray() e type(x_train) <class 'scipy.sparse.csr.csr_matrix'>,scipy基於numpy,最終資料結構ndarray x_train.shape:(14134, 149647) '''
tf = TfidfVectorizer() # 訓練集 x_train = tf.fit_transform(x_train) # 測試集 x_test = tf.transform(x_test) # 4 樸素貝葉斯演算法 ''' 演算法思想:根據目標(測試集)分詞-特徵(根據tf-idf演算法計算出重要性的分詞並在分詞中刷選重要的分詞,預設是刷選出的 全部重要分詞)在資料集(訓練集、測試集) 計算文章歸屬類別的概率(貝葉斯概率),最終選中概率最大類別。為了保證計算出的概率不為0,概率計算中增加拉普拉 斯平滑係數 數學原理: 聯合概率:P(A&B) = P(A) * P(B) 條件概率:P(A|C, B|C) = P(A|C) * P(B|C) 貝葉斯公式:P(C|F1,F2...) = P(F1,F2...|C) * P(C) / P(F1,F2...) Ni = P(F1,F2...|C) * P(C) 指定分類特徵分詞概率 P(C) 總文章數指定類別的概率 P(W) = P(F1,F2...) 指定特徵分詞概率 拉普拉斯平滑係數: (Ni + a) / (m * a) a常為1、 m常為總特徵分詞數 ''' # 樸素貝葉斯模型 mlt = MultinomialNB(alpha=1.0) mlt.fit(x_train, y_train) # 預測測試集類別 y_predict = mlt.predict(x_test) print("預測的文章類別為:", y_predict) # 模型評估 ''' TP、FP、TN、FN構成混淆矩陣 準確率(accuracy) = (TP+TN) / ALL 精確率(precision) = TP / (TP + FP) 召回率(recall) = TP / (TP + FN) F1-score = 2 * precision * recall / (precision + recall)表示模型的穩定性 ''' print("準確率:", mlt.score(x_test, y_test)) rp = classification_report(y_test, y_predict, target_names=news.target_names) print(rp) if __name__ == "__main__": naivebases()