樸素貝葉斯算法的Python實現

樸素貝葉斯算法的Python實現

樸素貝葉斯分類算法被廣泛應用於文本分類場景中、包含垃圾郵件、互聯網新聞等分類任務,屬於有監督學習算法。它獨立考量每一維度特徵被分類的條件概率,然後綜合這些概率對其所在的特徵向量做出分類預測,即“假設各個維度上的特徵被分類的條件概率之間是相互獨立的”,該假設使得模型預測需要計算的參數規模從指數級降至線性級,極大地提升計算效率。該算法在模型訓練過程中沒考慮各個維度特徵的相互聯繫,對於關聯性較強的數據特徵分類效果較差。

樸素貝葉斯的優缺點

優點:數據集較小時模型表現很好,適合增量式訓練、多分類任務。

缺點:對輸入數據的表達形式很敏感,由於其“樸素”的特點,也會帶來一些準確率上的損失。


MultinomialNB算法的一般流程

  1. 數據採集:使用NumPy與pandas以及sklearn.datasets等方式獲取或處理數據集
  2. 數據預處理:測試集、訓練集構建,進行數據標準化處理,提取文本特徵向量矩陣。
  3. 模型訓練:MultinomialNB算法
  4. 模型測試:使用測試集,驗證模型性能。
  5. 模型優化:使用交叉驗證法優化K值取值。

MultinomialNB(多項式模型)的Python實現

1. 數據採集

該數據集包含分佈在20個不同新聞組中的18846篇文檔,

數據來源:from sklearn.datasets import fetch_20newsgroups

數據標籤:

'alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware', 'comp.windows.x', 'misc.forsale', 'rec.autos', 'rec.motorcycles', 'rec.sport.baseball', 'rec.sport.hockey', 'sci.crypt', 'sci.electronics', 'sci.med', 'sci.space', 'soc.religion.christian', 'talk.politics.guns', 'talk.politics.mideast', 'talk.politics.misc', 'talk.religion.misc'

數據樣例:

From: Alexander Samuel McDiarmid <am2o>

Subject: driver ??

Organization: Sophomore, Mechanical Engineering, Carnegie Mellon, Pittsburgh, PA

Lines: 15

NNTP-Posting-Host: po4.andrew.cmu.edu

1) I have an old Jasmine drive which I cannot use with my new system ……

使用sklearn.datasets.fetch_20newsgroups(新聞數據抓取器),加載數據集,Python實現如下:

樸素貝葉斯算法的Python實現

2. 數據預處理

使用 sklearn.model_selection.train_test_split方式,將整個數據集隨機抽取80%作為訓練集、剩餘的20%作為測試集,並且進行數據標準化處理,且重複運行時,訓練集與測試集不發生變化,Python實現如下:

樸素貝葉斯算法的Python實現

嘗試使用四種方式實現文本特徵向量的提取,並查看不同文本特徵提取方式對算法分類識別率的影響:

  • CountVectorizer提取特徵向量。
  • CountVectorizer提取特徵向量且去掉停詞。
  • TfidfVectorizer提取文本特徵向量。
  • TfidfVectorizer提取文本特徵向量且去掉停詞。

CountVectorizer只考慮每種詞彙在訓練文本中出現的頻率,而TfidfVectorizer除了考量某詞彙在訓練文本中出現的頻率之外,能夠降低出現頻率高沒有意義的詞彙出現帶來的影響,訓練文本的數量越多,TfidfVectorizer方式更有優勢,Python實現如下:

樸素貝葉斯算法的Python實現

3. 模型訓練及測試

樸素貝葉斯算法的Python實現

測試集驗證結果如下:

樸素貝葉斯算法的Python實現

擴展:生成模型和判別模型的區別

有監督機器學習方法可以分為生成模型和判別模型。

生成模型

無窮樣本 -> 概率密度模型 = 產生式模型 -> 預測

生成式模型求得聯合概率P(Y,X),對於未見示例X,需要求出X與不同標籤之間的聯合概率分佈,然後概率大的獲勝。

  • 常見生成模型:樸素貝葉斯、KNN、高斯混合模型、隱馬爾可夫模型、限制玻爾茲曼機、文檔主題生成模型(LDA)
  • 生成模型舉例:利用生成模型是根據哈士奇的特徵首先學習出一個哈士奇的模型,然後根據邊境牧羊犬的特徵學習出一個邊境牧羊犬的模型,然後從這隻羊中提取特徵,放到哈士奇羊模型中看概率是多少,在放到邊境牧羊犬模型中看概率是多少,哪個概率大就是哪種品種的狗,求的是P(X,Y),即聯合概率。

判別模型

有限樣本 -> 判別函數 = 判別式模型 -> 預測

對於判別式模型來說求得P(Y|X),對未見示例X,根據P(Y|X)可以求得標記Y,即可以直接判別出標籤。

  • 常見判別模型:K-近鄰、決策樹、SVM、線性判別分析(LDA)、支持向量機、線性迴歸、傳統的神經網絡、邏輯斯蒂迴歸。
  • 判別模型舉例:要確定一個狗是哈士奇還是邊境牧羊犬,用判別模型的方法是從訓練集中學習到模型,然後通過提取這隻狗的特徵來直接預測出這隻狗的品種(正例)概率,其根據X“判別”Y,求的是P(Y|X),即後驗概率。

判別式模型是根據一隻狗的特徵可以直接給出這隻狗品種(正例)的概率(比如 概率為0.8),而生成式模型是要都試一試((X,Y¹), (X,Y²), (X,Y³),…),概率最大的那個就是這隻狗的品種結果。

樸素貝葉斯算法的Python實現

後續會繼續分享線性、決策樹、SVM、隨機森林、K均值聚類等算法介紹及Python實現,若對你有所幫助,歡迎大家評論、留言、關注,感謝支持!

樸素貝葉斯算法的Python實現


分享到:


相關文章: