1. 程式人生 > >樸素貝葉斯分類器--個人筆記

樸素貝葉斯分類器--個人筆記

樸素貝葉斯分類器作為基於貝葉斯定理的監督學習演算法,曾入選“資料探勘十大演算法”。本文結合個人學習筆記和scikit-learn中樸素貝葉斯演算法的官方文件,總結樸素貝葉斯演算法的基本思想原理和scikit-learn中三種類型的樸素貝葉斯分類器的適用範圍,供以後學習使用。

樸素貝葉斯分類演算法的基本原理:

最小化分類錯誤率的最優貝葉斯分類是使後驗概率P(y|x)最大化,即:

根據貝葉斯公式:

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 | y, x_1, \dots, x_{i-1}, x_{i+1}, \dots, x_n) = P(x_i | y),

所以我們的貝葉斯公式可轉化為:

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)可通過各類樣本出現的頻率來進行估計,所以問題的關鍵就在於如何合理地估計P(x_i \mid y)
。所以根據假設P(x_i \mid y)服從不同的分佈,我們可以得到不同的貝葉斯分類器。這裡介紹scikit-learn官方文件中的3中樸素貝葉斯分類器。

1、Gaussian Naive Bayes(GaussianNB)

Gaussian Naive Bayes演算法假設P(x_i \mid y)服從

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)

所以對於連續屬性,GaussianNB分類器是個不錯的選擇,這裡附上scikit-learn官方文件中的一個例子的Python程式碼:

>>> import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>>> Y = np.array([1, 1, 1, 2, 2, 2])
>>> from sklearn.naive_bayes import GaussianNB
>>> clf = GaussianNB()
>>> clf.fit(X, Y)
GaussianNB(priors=None)
>>> print(clf.predict([[-0.8, -1]]))
[1]
>>> clf_pf = GaussianNB()
>>> clf_pf.partial_fit(X, Y, np.unique(Y))
GaussianNB(priors=None)
>>> print(clf_pf.predict([[-0.8, -1]]))
[1]
2、Multinomial Naive Bayes(MultinomialNB)MultinomialNB分類器假設樣本屬性服從多重伯努利分佈,所以官方文件中特別提到了這種分類器適用於文字分類。所以對於屬性非連續,屬性值取值離散的樣本(一般有多種離散值),MultinomialNB是個不錯的選擇。官方文件中的程式碼:
>>> import numpy as np
>>> X = np.random.randint(5, size=(6, 100))
>>> y = np.array([1, 2, 3, 4, 5, 6])
>>> from sklearn.naive_bayes import MultinomialNB
>>> clf = MultinomialNB()
>>> clf.fit(X, y)
MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
>>> print(clf.predict(X[2:3]))
[3]
3、Bernoulli Naive Bayes(BernoulliNBBernoulliNB分類器顧名思義,伯努利貝葉斯分類器,是一種特殊的MultinomialNB,其樣本的所有特徵只取兩種屬性值(0,1),所以BernoulliNB分類器基於公式:

P(x_i \mid y) = P(i \mid y) x_i + (1 - P(i \mid y)) (1 - x_i)

來計算P(x_i \mid y)。官方文件中的樣例程式碼:
>>> import numpy as np
>>> X = np.random.randint(2, size=(6, 100))
>>> Y = np.array([1, 2, 3, 4, 4, 5])
>>> from sklearn.naive_bayes import BernoulliNB
>>> clf = BernoulliNB()
>>> clf.fit(X, Y)
BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True)
>>> print(clf.predict(X[2:3]))
[3]
三種類型的樸素貝葉斯分類器,其適用的樣本範圍不同。本文參考scikit-learn官方文件的簡單總結,以期以後在使用時能夠用上。