python機器學習(三)分類算法-朴素貝葉斯


 

一、概率基礎

概率定義:
概率定義為一件事情發生的可能性,例如,隨機拋硬幣,正面朝上的概率。

聯合概率:
包含多個條件,且所有條件同時成立的概率,記作:𝑃(𝐴,𝐵) 。

條件概率:
事件A在另外一個事件B已經發生條件下的發生概率,記作:𝑃(𝐴|𝐵) 。P(A1,A2|B) = P(A1|B)P(A2|B),需要注意的是:此條件概率的成立,是由於A1,A2相互獨立的結果。

二、朴素貝葉斯介紹

公式:

 
朴素貝葉斯公式

其中,w為給定文檔的特征值(頻數統計,預測文檔提供),c為文檔類別。
公式可以理解為:

 

 
朴素貝葉斯公式的理解

其中c可以是不同類別。

公式分為三個部分:

𝑃(𝐶):每個文檔類別的概率(某文檔類別詞數/總文檔詞數)
𝑃(𝑊│𝐶):給定類別下特征(被預測文檔中出現的詞)的概率
計算方法:𝑃(𝐹1│𝐶)=𝑁𝑖/𝑁 (訓練文檔中去計算)
𝑁𝑖為該𝐹1詞在C類別所有文檔中出現的次數
N為所屬類別C下的文檔所有詞出現的次數和
𝑃(𝐹1,𝐹2,…): 預測文檔中每個詞的概率

舉個栗子:

現有一篇被預測文檔:出現了都江宴,武漢,武松,計算屬於歷史,地理的類別概率?


 
image

歷史:𝑃(都江宴,武漢,武松│歷史)∗P(歷史)=(10/108)∗(22/108)∗(65/108)∗(108/235) =0.00563435
地理:𝑃(都江宴,武漢,武松│地理)∗P(地理)=(58/127)∗(17/127)∗(0/127)∗(127/235)=0

拉普拉斯平滑:
思考:屬於某個類別為0,合適嗎?
從上面的例子我們得到地理概率為0,這是不合理的,如果詞頻列表里面有很多出現次數都為0,很可能計算結果都為零。
解決方法:拉普拉斯平滑系數。

 
image

𝛼為指定的系數一般為1,m為訓練文檔中統計出的特征詞個數

 

sklearn朴素貝葉斯實現API:

sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
alpha:拉普拉斯平滑系數

案例:新聞分類

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

news = fetch_20newsgroups(subset='all')
# 進行數據分割
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)
# 對數據集進行特征抽取
tf = TfidfVectorizer()
# 以訓練集當中的詞的列表進行每篇文章重要性統計['a','b','c','d']
x_train = tf.fit_transform(x_train)
x_test = tf.transform(x_test)

# 進行朴素貝葉斯算法的預測
mlt = MultinomialNB(alpha=1.0)
print(x_train)

  (0, 120993)   0.0838226531816039
  (0, 36277)    0.028728297074726128
  (0, 118261)   0.051733692584494416
  (0, 118605)   0.08660213360333731
  (0, 78914)    0.10725171098177662
  (0, 120174)   0.07226288195761017
  (0, 146730)   0.03649798864200877
  (0, 49960)    0.09535813190987927
  (0, 108029)   0.10406938034117505
  (0, 151947)   0.1081016719923428
  (0, 120110)   0.13513684031456163
  (0, 34588)    0.06453595223748614
  (0, 133893)   0.04993313285348771
  (0, 31218)    0.07845873103784344
  (0, 108032)   0.08430822316250115
  (0, 30921)    0.11806736198114927
  (0, 33267)    0.030864914635712264
  (0, 36137)    0.0714722249527062
  (0, 57776)    0.07110907374703304
  (0, 77937)    0.026514922107534245
  (0, 90944)    0.09746338158610199
  (0, 135824)   0.09394365947415394
  (0, 49956)    0.09183375914922258
  (0, 151957)   0.07203295034824395
  (0, 33356)    0.07203295034824395
  : :
  (14133, 45099)    0.030803124311834594
  (14133, 135309)   0.02305588722190138
  (14133, 135472)   0.06570104508511963
  (14133, 52014)    0.05222321951090842
  (14133, 108029)   0.05584161408783517
  (14133, 36137)    0.07670122356304401
  (14133, 34063)    0.12187079805145053
  (14133, 106978)   0.0851182715752145
  (14133, 106534)   0.03378056586331488
  (14133, 105921)   0.09707364301640503
  (14133, 103839)   0.07144955527096918
  (14133, 136535)   0.03801377630817533
  (14133, 42966)    0.028558472354146207
  (14133, 81075)    0.02180715538325887
  (14133, 135641)   0.025875408277197205
  (14133, 148185)   0.028450089379106706
  (14133, 78894)    0.020030955308174968
  (14133, 147914)   0.047259202253661425
  (14133, 90152)    0.017166154294786778
  (14133, 45598)    0.05645818387150284
  (14133, 135325)   0.03667700550640032
  (14133, 118218)   0.02343357701502816
  (14133, 131632)   0.01710795977554328
  (14133, 59957)    0.0485327006460036
  (14133, 67480)    0.01710795977554328

mlt.fit(x_train, y_train)   #MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
y_predict = mlt.predict(x_test)
print("預測的文章類別為:", y_predict)
#預測的文章類別為: [ 3 16  5 ...  0  5  8]
# 得出准確率
print("准確率為:", mlt.score(x_test, y_test))
#准確率為: 0.8414685908319185
print("每個類別的精確率和召回率:", classification_report(y_test, y_predict, target_names=news.target_names))

 

每個類別的精確率和召回率:                           precision    recall  f1-score   support

             alt.atheism       0.89      0.75      0.81       210
           comp.graphics       0.87      0.81      0.84       225
 comp.os.ms-windows.misc       0.77      0.90      0.83       209
comp.sys.ibm.pc.hardware       0.77      0.78      0.78       258
   comp.sys.mac.hardware       0.86      0.88      0.87       223
          comp.windows.x       0.97      0.76      0.85       260
            misc.forsale       0.92      0.68      0.78       233
               rec.autos       0.91      0.89      0.90       263
         rec.motorcycles       0.94      0.96      0.95       260
      rec.sport.baseball       0.93      0.92      0.92       230
        rec.sport.hockey       0.89      0.97      0.93       234
               sci.crypt       0.64      0.99      0.78       235
         sci.electronics       0.94      0.68      0.79       275
                 sci.med       0.96      0.89      0.93       241
               sci.space       0.89      0.97      0.93       246
  soc.religion.christian       0.56      0.99      0.72       257
      talk.politics.guns       0.84      0.94      0.89       256
   talk.politics.mideast       0.92      0.98      0.94       245
      talk.politics.misc       0.98      0.67      0.80       182
      talk.religion.misc       1.00      0.17      0.29       170

                accuracy                           0.84      4712
               macro avg       0.87      0.83      0.83      4712
            weighted avg       0.87      0.84      0.84      4712

 

三、總結

優點:

  • 朴素貝葉斯模型發源於古典數學理論,有穩定的分類效率。
  • 對缺失數據不太敏感,算法也比較簡單,常用於文本分類。
  • 分類准確度高,速度快

缺點:

  • 需要知道先驗概率P(F1,F2,…|C),因此在某些時候會由於假設的先驗模型的原因導致預測效果不佳。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM