樸素貝葉斯分類——大道至簡

分類問題

已知m個樣本 $(x^1,y^1), ...... (x^m,y^m)$,x是特徵變量,y是對應的類別。
要求一個模型函數h,對於新的樣本 $x^t$,能夠儘量準確的預測出 $y^t = h(x^t)$。

概率角度

很多機器學習算法從誤差角度來構建模型函數h,也就是先假設一個h,然後定義一個h(x)與y的誤差,通過逐步減少h(x)與y的誤差來獲得一個擬合的模型h。

現在我們從概率的角度來考慮一下。
假設y有m個類別,即 $y_1,......y_n ∈ \{C_1,......C_m\}$,
對於樣本 $x^t$,如果能計算出每個類別的條件概率 $P(C_1|x^t),......P(C_m|x^t)$,那麼可以認爲概率最大的那個類別就是 $x^t$ 所屬的類別。(關於條件概率和貝葉斯定理請參考 理解貝葉斯定理)。即

$$ h(x) = C_x = \arg\max \limits_{k \in \{1,2,...K\}} \Big(P(C_k|x) \Big) \quad(1) $$

樸素貝葉斯分類器

已知m個樣本 $(x^1,y^1),(x^2,y^2), ...... (x^m,y^m)$,
x是n維特徵變量,即 $x=(x_1,x_2,......x_n)$,
y是對應的類別,設有K個類別,即 $y^1,y^2,......y^m ∈ \{C_1,C_2,......C_K\}$,

對任一給定的x,我們需要分別計算出x屬於各分類的概率 $P(C_1|x),P(C_2|x),......P(C_K|x)$,其中有最大值的$P(C_k|x)$,x即屬於該分類$C_k$,即樣本x屬於分類

$$ C_x = \arg\max \limits_{k \in \{1,2,...K\}} \Big(P(C_k|x) \Big) \quad(2) $$

現在需要計算 $P(C_k|x)$,應用貝葉斯定理:

$$ P(C_k|x) = \frac{P(C_k)}{P(x)} P(x|C_k) \quad(3) \\ = \frac{P(C_k)}{P(x)} P(x_1,x_2,......x_n|C_k) \quad(4) $$

這裏 $P(x_1,x_2,......x_n|C_k)$ 是一個條件聯合概率,意思是在分類 $C_k$ 中,特徵 $(x_1,x_2,......x_n)$ 取一組特定值(也就是需要預測的樣本x的各特徵的值)的概率。這個概率不容易計算,爲了方便,於是樸素貝葉斯(Naive Bayes) 隆重登場。在這裏樸素的意思是,假定 x 的各特徵 $x_1,x_2,......x_n$ 是條件獨立的。(參考維基百科 - 條件獨立)。因此

$$ P(x_1,x_2,......x_n|C_k) = P(x_1|C_k)P(x_2|C_k)......P(x_n|C_k) \quad(5) $$

這個轉換其實就是 獨立變量的聯合分佈 = 各變量先驗分佈的乘積(參考 維基百科 - 聯合分佈),只不過這裏是條件概率,但是因爲變換前後都有同樣的條件 $C_k$,從樣本空間 $C_k$ 的角度看,其實就是聯合分佈轉換成先驗分佈的乘積。(對樣本空間的理解請參考 理解貝葉斯定理)。

將(5)帶回(4)得

$$ P(C_k|x) = \frac{P(C_k)}{P(x)} P(x_1|C_k)P(x_2|C_k)......P(x_n|C_k) \\ = \frac{P(C_k)}{P(x)} \prod_{j=1}^{n}P(x_j|C_k) \quad(6) $$

對任一給定的樣本x的值是確定的,且x不依賴於C,所以P(x)可以看作常量。所以可以忽略 $P(x)$。

$$ P(C_k|x) \propto P(C_k) \prod_{j=1}^{n}P(x_j|C_k) \\ C_x = \arg\max \limits_{k \in \{1,2,...K\}} \Big(P(C_k) \prod_{j=1}^{n}P(x_j|C_k) \Big) \quad(7) $$

這就是樸素貝葉斯分類的模型函數。

參數估計

上述公式中主要有兩項,分別考察一下如何計算。

參數1:$P(C_k)$

上式中 $P(C_k)$ 比較容易計算,用頻率來估算概率,統計m個樣本中屬於 $C_k$ 的樣本的頻率即可。設m個樣本中有 $m_k$ 個樣本的類別是 $C_k$,則

$$ P(C_k) = m_k / m \quad(8) $$

參數2:$P(x_j|C_k)$

對$P(x_j|C_k)$的計算需要事先假設樣本特徵$x_j$的數據分佈情況。對特徵分佈的假設,我們稱之爲事件模型,通常會採用以下三種假設。

  1. 多項式分佈

如果特徵$x_j$是離散值,可以假設它符合 多項式分佈。可以統計$x_j$的某個特徵在樣本中的頻率來估算其概率。
假設 特徵$x_j$ 有 $S_j$ 個可能的取值(比如天氣有陰、晴、雨三種狀態,則 $S_j=3$),並且在n個樣本中,類別爲 $C_k$、特徵 $x_j$ 取值爲 s 的樣本有 $m_{kjs}$ 個。則

$$ P(x_{js}|C_k) = m_{kjs} / m_k \quad(9) $$

有時候樣本中某個特徵的特定取值的樣本數 $m_{kjs} = 0$,這將導致整個 $P(C_k) \prod_{j=1}^{n}P(x_j|C_k) = 0$,嚴重扭曲了該特徵的概率分佈。因此,通常可以採用拉普拉斯平滑來避免這種情況發生。即

$$ P(x_{js}|C_k) = (m_{kjs} + \lambda) \big/ (m_k + S_j \lambda) \quad(10) $$

通常取 $\lambda = 1$
將(8)和(10)帶入貝葉斯分類器(7),得到

$$ C_x = \arg\max \limits_{k \in \{1,2,...K\}} \Big(P(C_k) \prod_{j=1}^{n}P(x_j|C_k) \Big) \\ k = \arg\max \limits_{k \in \{1,2,...K\}} \Big( \frac{m_k}{m} \prod_{j=1}^{n} \frac{m_{kjs} + \lambda}{m_k + S_j \lambda} \Big) \quad(11) $$

用一個粗略的示意圖來理解一下特徵爲離散值時,條件概率$P(x_{js}|C_k)$如何根據樣本集來進行估算:

特徵爲離散值
圖中表示整個樣本空間,有兩個類別 $C_1, C_2$,每個樣本有兩個特徵 $x_1, x_2$,其中 $x_1$ 有3個可取的離散值 $S_{11}, S_{12}, S_{13}$,$x_2$ 有4個可取的離散值 $S_{21}, S_{22}, S_{23}, S_{24}$。圖中橙色部分就是 $m_{111}$,即 類別=$C_1$,特徵=$x_1$,特徵值=$S_{11}$時(k=1,j=1,s=1)的樣本數,藍色部分就是 $m_{123}$,即 類別=$C_1$,特徵=$x_2$,特徵值=$S_{23}$時(k=1,j=2,s=3)的樣本數。整個灰色部分是 $m_1$,即類別爲 $C_1$的樣本數。

舉例:根據天氣情況決定是否打網球
本案例來自 樸素貝葉斯分類器

打網球樣本

上面表格是某同學在不同天氣情況下的打網球決策數據。
假設今天天氣狀況是:Outlook=sunny, Temperature=cool,Humidity=high,Wind=strong,該同學是否會去打網球呢?
這裏的幾個特徵,天氣、溫度、溼度、風速都是離散型變量,適合採用上面的多項式貝葉斯分類方法。將上面的公式寫在這裏便於查看。

$$ k = \arg\max \limits_{k \in \{1,2,...K\}} \Big( \frac{m_k}{m} \prod_{j=1}^{n} \frac{m_{kjs} + \lambda}{m_k + S_j \lambda} \Big) \quad(11) $$

我們需要計算 $k=\{yes, no\}$ 兩種情況下,$x=(sunny,cool,high,strong)$ 的估算概率。
統計上表中各種情況下的樣本數量可知:
總樣本數 m=14

打球(k=yes)的樣本數 $m_{yes}$ = 9
不打球(k=no)的樣本數 $m_{no}$ = 5

天氣的取值 $S_{Outlook}=3$(Sunny/Overcast/Rain)
晴天打球(k=yes,j=Outlook,s=sunny)的樣本數 $m_{kjs}=2$
晴天不打球(k=no,j=Outlook,s=sunny)的樣本數 $m_{kjs}=3$

溫度的取值 $S_{Temperature}=3$(Hot/Mild/Cool)
冷天打球(k=yes,j=Temperature,s=cool)的樣本數 $m_{kjs}=3$
冷天不打球(k=no,j=Temperature,s=cool)的樣本數 $m_{kjs}=1$

溼度的取值 $S_{Humidity}=2$(High/Normal)
潮溼天打球(k=yes,j=Humidity,s=high)的樣本數 $m_{kjs}=3$
潮溼天不打球(k=no,j=Humidity,s=high)的樣本數 $m_{kjs}=4$

風力的取值 $S_{Wind}=2$(Strong/Weak)
大風天打球(k=yes,j=Wind,s=strong)的樣本數 $m_{kjs}=3$
大風天不打球(k=no,j=Wind,s=strong)的樣本數 $m_{kjs}=3$

將上述數據代入公式(11),對於樣本 $x=(sunny,cool,high,strong)$ ,打球(k=yes)的概率

$$ k=yes \\ \frac{m_k}{m} \prod_{j=1}^{n} \frac{m_{kjs} + \lambda}{m_k + S_j \lambda} \\ = \frac{9}{14} \Big( \frac{2 + 1}{9 + 3} \Big) \Big( \frac{3 + 1}{9 + 3} \Big) \Big( \frac{3 + 1}{9 + 2} \Big) \Big( \frac{3 + 1}{9 + 2} \Big) \\ = 0.007084 $$

不打球(k=nos)的概率

$$ k=no \\ \frac{m_k}{m} \prod_{j=1}^{n} \frac{m_{kjs} + \lambda}{m_k + S_j \lambda} \\ = \frac{5}{14} \Big( \frac{3 + 1}{5 + 3} \Big) \Big( \frac{1 + 1}{5 + 3} \Big) \Big( \frac{4 + 1}{5 + 2} \Big) \Big( \frac{3 + 1}{5 + 2} \Big) \\ = 0.01822 $$

這裏 0.01822 > 0.007084,所以該同學可能不會去打球。經過歸一化,
不打球的概率 = 0.01822 / (0.01822 + 0.007084) = 72%
(注:這裏計算結果與原案例中的數值不同,因爲這裏有做拉普拉斯平滑,原案例中沒有。本案例中其實沒有出現特定特徵的樣本數爲0的情況,可以不用做拉普拉斯平滑,不過這裏是按照公式寫下來的,就按公式計算了)

  1. 伯努利分佈

如果特徵$x_j$是稀疏二項離散值,可以假設它符合 伯努利分佈。上面打網球的案例中,溼度取值是 {high,normal},風力取值是 {strong,weak},這兩個特徵都是二項離散值。
伯努利分佈只有兩種可能的取值,我們將其編碼爲 {0,1},則

$$ P(x_{js}|C_k) = \begin{cases} P(x_{js}=1|C_k) \\ P(x_{js}=0|C_k) = 1 - P(x_{js}=1|C_k) \end{cases} \quad(12) $$

另外注意到伯努利分佈其實是多項式分佈的特例,所以我們可以用上面公式(12)計算,也可以用之前多項式分佈公式(11)計算。

垃圾郵件分類等涉及文本的任務中可以採用伯努利分佈,比如構造一個5000個不同單詞的向量作爲輸入特徵x,對於一段文本,其中有出現的單詞,在x中對應單詞的位置設爲1,其它位置爲0,這樣x中的每個特徵(單詞)的取值爲1或0,符合伯努利分佈。

  1. 高斯分佈

如果特徵$x_j$是連續變量,可以假設它符合 高斯分佈(正態分佈)。準確點說,是假設每個類別 $C_k$ 下的 $x_{kj}$ 符合高斯分佈。這樣,我們可以通過高斯分佈的概率密度函數來計算樣本中 $x_j$ 某個特定值的條件概率 $P(x_{js}|C_k)$。高斯分佈的概率密度函數爲:

$$ f(x;\mu,\sigma) = \frac{1}{\sigma \sqrt{2 \pi}} exp \Big( - \frac{(x-\mu)^2}{2 \sigma ^2} \Big) $$

其中 $\mu$ 是均值,$\sigma^2$是方差。
假設在類別 $C_k$ 中,特徵 $x_j$ 的均值爲 $\mu_{kj}$,方差爲 $\sigma_{kj}^2$(這兩項可以通過樣本數據統計出來)。則

$$ P(x_{j}|C_k) = \frac{1}{\sigma_{kj} \sqrt{2 \pi}} exp \Big( - \frac{(x_j-\mu_{kj})^2}{2 \sigma_{kj} ^2} \Big) $$

案例請參考 維基百科 - 案例 - 性別分類

處理連續數值問題的另一種常用的技術是通過離散化連續數值的方法。通常,當訓練樣本數量較少或者是精確的分佈已知時,通過概率分佈的方法是一種更好的選擇。
而在大量樣本的情形下離散化的方法表現更優,因爲大量的樣本可以學習到數據的實際分佈,而不用“樸素”的假設其分佈。典型情況下很多任務都會提供大量的樣本,所以這時選擇離散化方法會比概率分佈估計的方法更好。

題外話

順便說一句,每次看到樸素這個詞,我就彷彿看到貝葉斯穿着一身打滿補丁衣服的樣子。而naive意思是缺乏經驗的;幼稚的;無知的;輕信的。從公式推導過程來看,樸素貝葉斯分類器採用了一些簡化條件的假設,比如假設 x 的各特徵 $x_1,x_2,......x_n$ 是條件獨立的,假設樣本特徵數據符合多項式分佈、伯努利分佈、高斯分佈等,這些假設都可能不完全符合實際情況,因爲對險惡的現實世界的無知從而採用了一些天真的假設。
不過,樸素還有一層含義是專一、純粹,在這個意義上,貝葉斯分類也算大道至簡,大智若愚了。

優缺點

樸素貝葉斯的主要優點有:

1)算法簡單,有穩定的分類效率。
2)對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練,尤其是數據量超出內存時,我們可以一批批的去增量訓練。
3)對缺失數據不太敏感。

樸素貝葉斯的主要缺點有:   
1)“樸素”的假設如果與實際情況不符,會影響模型效果。
2)輸入特徵數據的表現形式,比如是連續特徵,離散特徵還是二元特徵,會影響概率計算和模型的分類效果。

參考

樸素貝葉斯算法原理小結
樸素貝葉斯分類器
維基百科 - Naive Bayes classifier
理解貝葉斯定理

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