機器學習-------算法(五)

分類算法----樸素貝葉斯算法

貝葉斯公式:

 P(C):每個文檔類別的概率(某文檔類別詞數/總文檔詞數)
 
 P(W│C):給定類別下特徵(被預測文檔中出現的詞)的概

計算方法𝑃𝐹1𝐶=𝑁𝑖/𝑁方法:P(F1│C)=Ni/N  (訓練文檔中去計算)

       𝑁𝑖𝐹1Ni爲F1詞C類別所有文檔中出現的次數

        N爲所屬類別C下的文檔所有詞出現的次數和

𝑃𝐹1,𝐹2,…    預測文檔每個詞概率 P(F1,F2,…)     預測文檔中每個詞的概率

例如:求一篇文章是屬於科技還是屬於娛樂,分別求他的樸素貝葉斯值進行判別屬於哪一類別:

特徵\統計

科技

娛樂

彙總(求和)

影院

8

56

64

支付寶

20

15

35

雲計算

63

0

63

彙總(求和)

100

121

221

科技: P(影院,支付寶,雲計算 │科技)∗P(科技)=8/100∗20/100∗63/100∗(100/221) =0.00456109

 

娛樂: P(影院,支付寶,雲計算│娛樂)∗P(娛樂)=56/121∗15/121∗0/121∗(121/221)=0

上面顯示娛樂概率爲0,這顯然不合理,爲解決這個問題,我們需要新的方法-----拉普拉斯平滑

拉普拉斯平滑:

           P(F1│C)=(Ni+α)/(N+αm)                        

           𝛼指定係數α指定係數一般爲1m爲訓練文檔中統計出的特徵詞個數

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


def naviebayes():
    """樸素貝葉斯"""
    # 獲取數據
    news = fetch_20newsgroups(subset="all")
    # 進行數據分割  特徵值 = 文章,目標值 = 文章匪類
    train_x, test_x, train_y, test_y = train_test_split(news.data, news.target, test_size=0.25)
    # 特徵抽取
    tf = TfidfVectorizer()
    # 以訓練集中的詞的列表進行每篇文章的重要性統計
    train_x = tf.fit_transform(train_x)
    # 因爲都是以訓練集進行統計,所以測試集只需要統計訓練集中的關鍵詞就可以啦
    test_x = tf.transform(test_x)
    # 進行樸素貝葉斯計算
    # 實例化貝葉斯
    mlt = MultinomialNB(alpha=1.0)
    # 對訓練集進行訓練
    mlt.fit(train_x, train_y)
    # 測試集進行結果判斷,得出預測類別
    y_predict = mlt.predict(test_x)
    print("預測類別:", y_predict)
    # 準確率,模型的準確率
    print(mlt.score(test_x, test_y))


if __name__ == '__main__':
    naviebayes()

 

優點:
樸素貝葉斯模型發源於古典數學理論,有穩定的分類效率。

 

對缺失數據不太敏感,算法也比較簡單,常用於文本分類。
分類準確度高,速度快
缺點:
需要知道先驗概率P(F1,F2,…|C),因此在某些時候會由於假設的先驗

模型的原因導致預測效果不佳。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章