樸素貝葉斯與Laplace平滑
樸素貝葉斯(Naive Bayes)
基本理論
樸素貝葉斯模型是生成學習的一種,用於分類問題。作為生成學習,樸素貝葉斯針對每一個分類,生成一個該分類對應的資料的模型,然後判斷一個資料最符合哪一個模型,從而分類。
其核心為貝葉斯公式:
\[P(y\mid x) = \frac{P(x\mid y)P(y)}{P(x)}
\]
目標是
\[\operatorname{argmax}_y\{P(y\mid x)\}=\operatorname{argmax}_y\{P(x\mid y)P(y)\}
\]
這裡的 \(x\) 代表了一系列特徵 \(x_1,\dots,x_n\),於是我們的目標也可以寫作:
\[\operatorname{argmax}_y\{P(y)P(x_1\mid y)P(x_2\mid x_1, y)\dots P(x_n\mid x_1, \dots, x_{n-1}, y)\}
\]
這個式子非常複雜,如果考慮每個特徵都是 \(0/1\) 變數,那麼學習的引數為 \(O(2^n)\)(對於 \(x_{1},\dots,x_{i-1},y\) 的每種取值情況,都有 \(x_i\) 的分佈)。
而樸素貝葉斯採取了一個非常強的假設——\(x_1,\dots,x_n\) 相互獨立,於是上式立即化簡為:
\[\operatorname{argmax}_y\{P(y)P(x_1\mid y)P(x_2\mid y)\dots P(x_n\mid y)\}
\]
引數數量 \(O(n\times \#\text{class})\),這樣就具有可操作性了。
引數推導
以每個特徵都為 \(0/1\) 變數,進行 \(0/1\) 分類為例,推導各個引數的取值。
引數有:
- \(\phi_y\):\(y=1\) 的先驗機率;
- \(\phi_{j\mid y=0},\phi_{j\mid y=1}\):在 \(y=0\) 以及 \(y=1\) 時,\(x_j=1\) 的機率,根據假設,不同的特徵之間的引數是無關的。
仍然採用最大似然估計,用聯合機率定義似然函式(\([x]\) 表示 \(x\) 為真即 \(1\),假即 \(0\)):
\[\begin{aligned}
\mathcal{L}(\phi_{y=0},\phi_{y=1},\phi_y)=&\prod_{i=1}^mP(x^{(i)},y^{(i)})\\
=&\prod_{i=1}^mP(y^{(i)})\prod_{j=1}^nP(x^{(i)}_j\mid y^{(i)})\\
=&\prod_{i=1}^m\phi_y^{[y^{(i)}=1]}(1-\phi_{y})^{[y^{(i)}=0]}\prod_{j=1}^n\Big[\phi_{j\mid y=0}^{[x^{(i)}_j=1]}(1-\phi_{j\mid y=0})^{[x_j^{(i)}=0]}\Big]^{[y^{(i)}=0]}\\
&\Big[\phi_{j\mid y=1}^{[x^{(i)}_j=1]}(1-\phi_{j\mid y=1})^{[x_j^{(i)}=0]}\Big]^{[y^{(i)}=1]}
\end{aligned}
\]
取對數似然(其中 “\(\dots\)” 對 \(y=1\) 的情況省略):
\[\begin{aligned}
\mathcal{l}=&\sum_{i=1}^m[y^{(i)}=1]\ln\phi_y+[y^{(i)}=0]\ln(1-\phi_y)\\
+&\sum_{i=1}^m\sum_{j=1}^n[y^{(i)}=0][x^{(i)}_j=1]\ln\phi_{j\mid y=0}+[x_j^{(i)}=0]\ln(1-\phi_{j\mid y=0})\dots
\end{aligned}
\]
先對 \(\phi_y\) 求偏導並令其為零:
\[0=\frac{1}{\phi_y}\sum_{i=1}^{m}[y^{(i)}=1]-\frac{1}{1-\phi_y}\sum_{i=1}^m[y^{(i)}=0]
\]
從而
\[\phi_y=\frac{1}{m}\sum_{i=1}^m[y^{(i)}=1]
\]
再對 \(\phi_{j\mid y=0}\) 求偏導並令其為零:
\[0=\sum_{i=1}^m[y^{(i)}=0]\left(\frac{[x^{(i)}=1]}{\phi_{j\mid y=0}}-\frac{[x^{(i)}=0]}{1-\phi_{j\mid y=0}}\right)
\]
從而
\[\phi_{j\mid y=0}=\frac{\sum_{i}[y^{(i)}=0][x^{(i)}_j=1]}{\sum_{i}[y^{(i)}=0]}
\]
同理有
\[\phi_{j\mid y=1}=\frac{\sum_{i}[y^{(i)}=1][x^{(i)}_j=1]}{\sum_{i}[y^{(i)}=1]}
\]
實際上這些公式看起來非常顯然,就是以頻率估計機率,但是都是基於MLE推導而來的。
Laplace平滑
樸素貝葉斯模型非常依賴資料的“完整性”——假如訓練集中沒有 \(x^{(i)}_j=1,y^{(i)}=0\) 的資料,那麼我們對 \(P(x_j=1\mid y=0)\) 的估計就是 \(0\),也即在統計上不可能發生,然而這是很不安全的,我們更傾向於說 \(P(x_j=1\mid y=0)\) 很小,而不是為 \(0\)。
以一個例子突出樸素貝葉斯模型的這一問題。
垃圾郵件分類
考慮給定一個純文字郵件,判斷其是否為垃圾郵件。
我們可以用一種很簡單的方法處理資料——預設一個字典,假設郵件的所有單詞都包含在內(如果沒有包含就把它忽略)。設定特徵為“某一個單詞是否在郵件中出現”,出現即為 \(1\),不出現即為 \(0\)。是垃圾郵件,則目標值為 \(1\),否則為 \(0\)。
(其實可以注意到這種特徵設定並不滿足樸素貝葉斯的假設,比如 buy 和 price 這兩個單詞是否出現一般來說是不獨立的。因此直接這樣實現的效果很差,用 UCI 中的資料集 spambase,將其提供的“單詞出現頻次”改為“是否出現”,大概錯誤率為 10%。)
那麼就可能會有一個問題——字典中的某個單詞 \(j\) 沒有在 training set 裡出現,但是出現在了 test set 中。按照我們的方法,
\[P(x_j=1\mid y=1)=P(x_j=1\mid y=0)=0
\]
那麼我們發現模型對 test set 中的這封郵件是垃圾郵件和不是垃圾郵件的機率都是 \(0\)。很有可能這一個單詞與是否是垃圾郵件無關,但是它造成了我們根本無法判斷這封郵件是否是垃圾郵件。
Laplace平滑
一個非常簡單的處理,我們假設每種情況最初都包含有一個資料,也即
\[\phi_{j\mid y=0}=\frac{\sum_{i}[y^{(i)}=0][x^{(i)}_j=1]+1}{\sum_{i}[y^{(i)}=0]+2}
\]
同理
\[\begin{aligned}
\phi_{j\mid y=1}&=\frac{\sum_{i}[y^{(i)}=1][x^{(i)}_j=1]+1}{\sum_{i}[y^{(i)}=1]+2}\\
\phi_y&=\frac{\sum_{i=1}^m[y^{(i)}=1] +1}{m+2}
\end{aligned}
\]
更為普遍地,我們考慮有 \(k\) 個分立取值的變數 \(x_j\in\{1,\dots,k\}\),那麼我們對其機率估計為:
\[P(x_j=t\mid y=0)=\frac{\sum_{i=1}^m[x^{(i)}_j=t][y^{(i)}=0]+1}{\sum_{i=1}^m[y^{(i)}=0]+k}
\]
這樣就直接避免了上述問題,但是同時也會造成一定程度的誤差,在資料較多時造成的誤差不明顯。