Hike News
Hike News

機器學習-演算法-Naive Bayes Classifier

Introduction

較常用於文檔的分類,求出一個文本佔不同類別的概率多少,並找出最大的概率

  • 例如在獲得一文檔時,文檔為科技類別的概率
  • 使用sklearn.naive_bayes.MultinomialNB

概率

概率定義為一件事情發生的可能性

聯合概率

包含多個條件,且所有條件同時成立的概率
記作
$$
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必須互相獨立(條件之間互不相影響)
  • 在使用naive bayes演算法時也需確保條件獨立

Bayes Equation

Background

當你在獲得一文檔時,會進行分詞,得到詞1、詞2……等詞,這些詞彙會有不同的重要性
因此便不是像上述 條件概率 所提到的 在單個條件B下發生A1及A2事件的概率
而是得到詞1、詞2……等詞的多個條件下,這些詞屬於單一類別的概率

  • 例如:得到一篇文檔重要性較高的詞為 “雲計算”、”大數據”、”機器學習”,其為科技類別的概率
    可寫成如下:
    $$
    P(科技|雲計算, 大數據, 機器學習)
    $$

公式

因此我們需要Bayes Equation來幫我們計算
$$
P(C|W) = \frac {P(W|C)P(C)} {P(W)}
$$

  • W為給定文檔的特徵值(不同詞的頻數統計)
  • C為文檔類別

可以理解成
$$
P(C|F1,F2,….) = \frac {P(F1,F2,…|C) P(C)}{P(F1,F2,…)}
$$

  • $F$為不同的詞彙
  • $C$為類別
  • 在比較不同類別時,分母的$P(W)$是可以忽略的

從上述的式子可以簡單的分為三部分來看

  • $P(C)$:每個文檔類別的概率
    $$
    \frac {某文檔類別數}{總文檔數量}
    $$

  • $P(W|C)$:給定類別下特徵的概率(特徵:被預測文檔中所出現的詞)
    計算方法:
    $$
    P(F1|C) = \frac {Ni} {N}
    $$

  • $Ni$為該$F1$詞在$C$類別所有文檔中出現的次數
  • $N$為所屬類別$C$下的文檔 所有詞出現的次數和
  • $P(F1,F2,…)$:預測文檔中每個詞的概率

Laplace Smoothing

但在預測文檔中的詞彙 有可能出現在某一類別時概率為0的情況
我們也並不能說此篇文檔與該類別完全沒有關係(不合理)
而是應該說該篇預測文檔屬於該類別的概率較低
要解決分類造成零概率的問題,可使用Laplace Smoothing如下所示
$$
P(F1|C) = \frac {Ni + \alpha} {N + \alpha m}
$$

  • $\alpha$:為指定係數一般為1
  • $m$:為訓練文檔中統計出的特徵詞個數

naive_bayes.MultinomialNB(alpha=1.0)

  • 為naive bayes的一種分類演算法
  • alpha:為Laplace Smoothing係數(並非超參數,對結果不會有影響)

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.datasets import fetch_20newsgroups

def naive_bayes_test():
# 實例化數據集
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-idf方法找出代表性的詞彙,並標與權重
tf = TfidfVectorizer()
x_train = tf.fit_transform(x_train)
x_test = tf.transform(x_test)

# 使用naive bayes進行分類
mlt = MultinomialNB(alpha=1.0)
mlt.fit(x_train,y_train)
y_predict = mlt.predict(x_test)

print("預測的文章類別為:\n",y_predict)
print("準確率:",mlt.score(x_test,y_test))

if __name__ == '__main__':
naive_bayes_test()

result

1
2
3
預測的文章類別為:
[14 2 4 ... 10 14 14]
準確率: 0.8582342954159593

tips

  • 訓練集的誤差大(詞彙並沒有精準的反應文章主題),預測效果也會低落
  • 使用naive bayes算法不需進行調參

優缺點

  • 優點
    • 其模型發源於古典數學理論,有較穩定的分類效率
    • 對缺失數據不太敏感,算法也比較簡單易懂,常用於文本分類
      • 文章中缺少某部分句子影響文意,也不會造成太大影響
    • 分類準確度高,速度快
  • 缺點
    • 由於使用了樣本屬性皆獨立的假設,所以如果樣本屬性有關聯時其效果不好
      • 文章當中具代表性詞彙彼此之間是沒有關係的(假設)
    • 由於是在訓練集當中進行統計詞頻,要是使用含有多樣性內容的文章做訓練集就會對預測造成干擾
      • 挑選類別準確性或代表性較強的文章作為訓練集