# 07 樸素葉貝斯算法

07 樸素葉貝斯算法

機率基礎

  1. 機率: 一件事情發生的可能性
  2. 聯合機率: 包含多個條件,且全部條件同時成立的機率。P(A,B)
    P(A, B) = P(A)P(B)
  3. 條件機率:事件A在另一個事件B已經發生條件下發生的機率。 P(A|B)
    P(A1,A2 | B) = P(A1 | B) * P(A2 | B)
    注意: 此條件機率的成立,是因爲A1, A2相互獨立的結果

樸素貝葉斯

  1. 樸素: 特徵獨立,經常使用文檔分類
    • 在給定詞比例的基礎上,求各種型文檔的比例
  2. 貝葉斯公式: (多個條件下一個結果)
    貝葉斯公式
  • 公式分爲3個部分:
    • P(C): 每一個文檔類別的機率 (某類文檔數/總文檔數)
    • P(W | C):給定類別下特徵(被預測文檔中出現的詞)的機率:計算方法:P(F1|C) = Ni/N
      • Ni : F1詞在C類別文檔全部文檔出現的次數
      • N: 所屬C類別下的文檔全部詞出現的次數和
    • P(F1,F2,F3) : 預測文檔中每一個詞的機率
  1. 文檔分類: 給定一個文檔的條件下,求文檔所屬於科技、娛樂等類別的機率。哪一個類別的機率大,則歸爲某個類別。
  • 文檔:詞1, 詞2 , 詞3 (詞出現的數量的狀況下,判斷類別)
    • P(科技|詞1,詞2,詞3) = P(f1,f2,f3 | 科技)*P(科技)/P(W)
    • P(娛樂|詞1,詞2,詞3) = P(f1,f2,f3 | 娛樂)*P(娛樂)/P(W)
  • 因爲是機率大小,則P(W)能夠同時約去

文檔分類實例

特徵 科技(30篇) 娛樂(60篇) 彙總(90篇)
商場 9 51 60
影院 8 56 64
支付寶 20 15 35
雲計算 63 0 63
彙總(求和) 100 121 221

現有一篇預測文檔,出現了影院支付寶雲計算,計算屬於科技、娛樂的機率。python

  • 科技: P(科技 |影院,支付寶,雲計算)= P(影院,支付寶,雲計算| 科技)* P(科技)= P(影院|科技)P(支付寶|科技) P(雲計算|科技)P(科技)= (8/100)* (20/100)* (63/100)*(30/90) = 0.00456109
  • 娛樂:P(娛樂 |影院,支付寶,雲計算)= (56/121)(15/121)(0/121)(60/90)= 0

拉普拉斯平滑

  1. 目的:避免單個特徵詞出現次數爲0 ,致使最終的計算結果爲0 。
  2. 緣由:其餘的詞在這個類型文檔中出現過,則仍是有可能屬於這個文檔。
  3. P(F1|C) = (Ni +a) /(N+am)
    • a爲指定的係數,通常取1
    • m爲訓練文檔中統計出的特徵詞的個數 (上述例子中爲4)

sklearn樸素貝葉斯API

sklearn.naive_bayes.MultinomialNB (alpha = 1.0)算法

樸素貝葉斯算法案例 (sklearn 20類新聞分類)

案例流程

  1. 加載數據,進行分割
  2. 生成文章特徵詞
  3. 樸素貝葉斯estimator進行預估

算法總結

  1. 訓練集偏差大,結果確定很差
  2. 不須要調參
  3. 優勢:
    • 發源於古典數學理論,有穩定的分類效率
    • 對缺失數據不太敏感,算法也比較簡單,經常使用於文本分類
    • 分類準確率高,速度快
  4. 缺點:
    • 因爲使用樣本獨立性假設,對樣本屬性有關聯時效果很差

分類模型評估

常見評估方法

  1. estimator.score() - 準確率,預測結果正確的百分比
  2. 精確率(precision) - 預測結果爲正例樣本中真實爲正例的比例(查的準)
  3. 召回率(recall) - 真實爲正例的樣本中預測結果爲正例的比例(查的全)
    精確率和召回率api

  4. F1-score - 反映了模型的穩定性fetch

F1-score

混淆矩陣

  1. 定義:在分類任務中,預測結果(Predicted condition) 與正確標記 (True condition)之間存在四種不一樣的組合,構成混淆矩陣。
    混淆矩陣

分類評估API

sklearn.metrics.classification_report(y_true, y_pred, target_names=None)雲計算

  • y_true: 真實目標值
  • y_pred: 估計器預測目標值
  • target_names: 目標類別名稱
  • return: 每一個類別精確率和召回率

案例代碼

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report


def naivebayes():
    """
    樸素貝葉斯進行文本分類
    :return: None
    """
    news = fetch_20newsgroups(subset='all')
    # 進行數據分割
    x_train, x_test, y_train, y_test = train_test_split(news.data, news.target_names, test_size=0.25 )

    # 對數據集進行特徵抽取
    tf = TfidfVectorizer()

    # 以訓練集當中的詞的列表進行每篇文章重要性統計
    x_train = tf.fit_transform(x_train)
    print(tf.get_feature_names())
    x_test = tf.transform(x_test)

    # 進行樸素貝葉斯算法的計算
    mlt = MultinomialNB(alpha=1.0)
    mlt.fit(x_train, y_train)
    print(x_train)
    y_predict = mlt.predict(x_test)

    print("預測的文章類別爲:", y_predict)
    score = mlt.score(x_test, y_test)
    print("分類準確率爲:", score)

    print("每一個類別的精確率和召回率:", classification_report
    (y_test,y_predict,target_names=news.target_names))
    return None


if __name__ == '__main__':
    naivebayes()
相關文章
相關標籤/搜索