朴素貝葉斯
朴素貝葉斯方法是一組基於貝葉斯定理的監督學習算法,其“朴素”假設是:給定類別變量的每一對特征之間條件獨立。貝葉斯定理描述了如下關系:
給定類別變量\(y\)以及屬性值向量\(x_1\)至\(x_n\):
\(P(y \mid x_1, \dots, x_n) = \frac{P(y) P(x_1, \dots x_n \mid y)} {P(x_1, \dots, x_n)}\)
依據朴素條件獨立假設可得:
\(P(x_i \mid y, x_1, \dots, x_{i-1}, x_{i+1}, \dots, x_n) = P(x_i \mid y)\)
對 \(i\) 進行遍歷,上式可化為:
\(P(y \mid x_1, \dots, x_n) = \frac{P(y) \prod_{i=1}^{n} P(x_i \mid y)} {P(x_1, \dots, x_n)}\)
由於輸入的\(P(x_1, \dots, x_n)\)是給定的常數值,我們可以得到以下式子:
\(P(y \mid x_1, \dots, x_n) \propto P(y) \prod_{i=1}^{n} P(x_i \mid y)\)
\(\hat{y} = \arg\max_y P(y) \prod_{i=1}^{n} P(x_i \mid y)\)
然后我們可以極大化后驗估計(MAP),來估計\(P(y)\) 和 \(P(x_i \mid y)\),前者就是訓練集中類別\(y\)的相對頻率。
不同的朴素貝葉斯分類器的區別主要在於它們對\(P(x_i \mid y)\)分布的假設不同。
盡管它們的假設顯然過於簡化,但naive Bayes分類器在許多實際情況下都能很好地工作,比如常見的文檔分類和垃圾郵件過濾。
它們需要一些訓練數據來估計必要的參數。
與其他更復雜的方法相比,朴素貝葉斯學習器和分類器執行速度非常快。類別條件特征分布的分解意味着每個分布都可以獨立地作為一維分布進行估計。這反過來又有助於緩解組合爆炸的問題。
另一方面,盡管朴素貝葉斯被認為是一個不錯的分類器,但它是一個糟糕的估計器,所以\(predict\_proba\)輸出的概率並太靠譜。
1. 高斯朴素貝葉斯算法
\(GaussianNB\) 實現了高斯朴素貝葉斯分類算法。假設特征的似然為高斯分布:
\(P(x_i \mid y) = \frac{1}{\sqrt{2\pi\sigma^2_y}} \exp\left(-\frac{(x_i - \mu_y)^2}{2\sigma^2_y}\right)\)
參數\(\sigma_y\)和\(\mu_y\)采用極大似然估計。
以鳶尾花分類為例:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
gnb = GaussianNB()
y_pred = gnb.fit(X_train, y_train).predict(X_test)
print("Number of mislabeled points out of a total %d points : %d" % (X_test.shape[0], (y_test != y_pred).sum()))
Number of mislabeled points out of a total 75 points : 4
2. 多項式貝葉斯算法
\(MultinomialNB\)實現了對多項式分布數據的朴素貝葉斯算法,是文本分類中使用的兩種經典的朴素貝葉斯變體之一(其中數據通常表示為詞向量計數,雖然\(tf-idf\)向量在實踐中也很有效)。
這個分布的每個類別\(y\)的參數向量為\(\theta_y = (\theta_{y1},\ldots,\theta_{yn})\),其中\(n\)是特征數量(在文本分類中是詞典大小),\(\theta_{yi}\)是特征\(i\)在類別\(y\)的一個樣本中出現的概率\(P(x_i \mid y)\)。
參數\(\theta_y\)由最大似然的平滑版本來估計,即相對頻率計數:
\(\hat{\theta}_{yi} = \frac{ N_{yi} + \alpha}{N_y + \alpha n}\)
其中\(N_{yi} = \sum_{x \in T} x_i\)是訓練集\(T\)上特征\(i\)在類別\(y\)的一個樣本中出現的次數。\(N_{y} = \sum_{i=1}^{n} N_{yi}\)是類\(y\)的所有特征的總數。
平滑先驗\(\alpha \ge 0\)讓學習樣本中不存在的特征占一定的比例,並防止在進一步的計算中出現零概率。
\(\alpha = 1\)時為拉普拉斯(Laplace)平滑,\(\alpha < 1\)時為李德斯通(Lidstone)平滑。
以鳶尾花分類為例:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import ComplementNB
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
cnb = ComplementNB()
y_pred = cnb.fit(X_train, y_train).predict(X_test)
print("Number of mislabeled points out of a total %d points : %d" % (X_test.shape[0], (y_test != y_pred).sum()))
Number of mislabeled points out of a total 75 points : 30
3. 伯努利貝葉斯算法
\(BernoulliNB\)是對按多元伯努利分布的數據,實現朴素貝葉斯訓練和分類的算法,即,可能有多個特征,但每個特征都被假定為一個二元(伯努利,布爾)變量。因此,該類別要求樣本用二值特征向量表示;如果傳遞任何其他類型的數據,\(BernoulliNB\)的實例可以對該輸入進行二值化(取決於二值參數)。
基於貝葉斯的決策規則:
\(P(x_i \mid y) = P(i \mid y) x_i + (1 - P(i \mid y)) (1 - x_i)\)
它與多項式NB規則的不同之處在於,它顯式地懲罰了類別\(y\)的指標特征\(i\)的不出現,而多項式貝葉斯變體將簡單地忽略一個不出現的特征。
在文本分類的應用中,可以使用單詞出現向量(而不是單詞計數向量)來訓練和使用這個分類器。BernoulliNB可能在某些數據集上表現得更好,特別是那些文檔更短的數據集。如果時間允許,最好對兩個模型都進行評估。
以鳶尾花分類為例:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import BernoulliNB
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
bnb = BernoulliNB()
y_pred = bnb.fit(X_train, y_train).predict(X_test)
print("Number of mislabeled points out of a total %d points : %d" % (X_test.shape[0], (y_test != y_pred).sum()))
Number of mislabeled points out of a total 75 points : 54
參考文檔
scikit-learn 1.9.1, 1.9.2, 1.9.4 Gaussian/Multinomial/Complement Naive Bayes
