朴素貝葉斯算法 👉 naive_bayes.MultinomialNB
朴素貝葉斯算法,主要用於分類. 例如:需要對垃圾郵件進行分類

分類思想 , 如何分類 , 分類的評判標准???

預測文章的類別概率, 預測某個樣本屬於 N個目標分類的相應概率,找出最大的可能性.也就是找出准確率最高的.
概率基礎 :
概率定義為 一件事情發生的可能性. 例如: 扔一枚硬幣,結果是頭像朝上. 又或者 明天是晴天
有這樣一個樣本數據,要我們算出如下結果.

- 女神喜歡的概率? (4/7)
- 職業是程序員, 並且體型勻稱的概率? (3/7*4/7)
- 在女神喜歡的條件下,職業是程序員的概率? (2/4)
- 在女神喜歡的條件下,職業是產品, 體重是超重的概率? (2/4*1/4=1/8)
聯合概率和條件概率:
聯合概率 :
包含多個條件,且所有條件同時成立的概率,記作: P(A,B) ; P(A,B)=P(A)P(B)
條件概率:
事件A在另外一個事件B已經發生條件下的發生概率,記作P(A|B);P(A1,A2|B)=P(A1|B)P(A2|B)
此條件概率的成立, 是由於A1,A2相互獨立的結果. (即所有特征之間是條件獨立的)
朴素貝葉斯介紹
- 前提就是 特征獨立
- 最常用在文檔分類的問題中. P(科技|文檔), P(娛樂|文檔)...
貝葉斯公式:

公式分為三部分:
P(C) : 每個文檔類別的概率 (某文檔類別數/總文檔數量).
P(W|C) : 給定類別下的特征 (被預測文檔中出現的詞) 的概率.
計算方法:
P(F1|C) = Ni/N (訓練文檔中去計算)
Ni 為該F1詞在C類別所有文檔中出現的次數.
N 為所屬類別C下的文檔所有詞出現的次數和P(F1,F2,...)預測文檔中每個詞的概率.

從上面的例子我們得到娛樂概率為0, 這是不合理的. 如果詞頻列表里面有很多出現次數都為0. 很可能計算結果都為零!!!
解決方法 : 拉普拉斯平滑

添加了拉普拉斯平滑系數,那么值會變大,但是不影響結果並改變了結果為0的值不為零.
sklearn 朴素貝葉斯API
sklearn.naive_bayes.MultinomialNB MultinomialNB(alpha = 1.0) 朴素貝葉斯分類 alpha:拉普拉斯平滑系數,默認為1.0
案例 :案例 :案例 :案例 :
# 案例: sklearn 20類新聞分類 # 20個新聞組數據集包含20個主題的18000個帖子 # 流程 # 1. 加載20類新聞數據,並進行分割 # 2. 生成文章特征詞 # 3. 朴素貝葉斯estimator 流程進行預估 # 代碼 from sklearn.datasets import fetch_20newsgroups # 20類新聞數據 from sklearn.model_selection import train_test_split # 數據分割API from sklearn.feature_extraction.text import TfidfVectorizer # 特征抽取API from sklearn.naive_bayes import MultinomialNB # 朴素貝葉斯API
# 1.獲取所有數據 news = fetch_20newsgroups(subset='all') # 2.進行數據分割 x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)
# 👆 先分割是因為不知道要預測哪些值,所以先分割
# 3.對數據集進行特征抽取 tf = TfidfVectorizer() # 以訓練集當中的詞的列表進行每篇文章重要性統計 x_train = tf.fit_transform(x_train) x_test = tf.transform(x_test) # 4.進行朴素貝葉斯算法 bys = MultinomialNB(alpha=0.1) bys.fit(x_train, y_train) # 5.進行預測 y_predict = bys.predict(x_test) print("預測的文章類別為:", y_predict) print("准確率為:", bys.score(x_test, y_test))

朴素貝葉斯算法總結:
優點:
- 朴素貝葉斯模型發源於古典數學理論,有穩定的分類效率。
- 對缺失數據不敏感,算法也比較簡單,常用於文本分類。
- 分類准確度高,速度快。
缺點:
- 由於使用樣本獨立性假設,所以 如果樣本屬性有關聯時 其效果不好。
- 因為是使用訓練集中的數據進行統計詞,所以訓練集的准確度對結果的影響很大。
