【sklearn樸素貝葉斯算法】高斯分佈/多項式/伯努利貝葉斯算法以及代碼實例

樸素貝葉斯

樸素貝葉斯方法是一組基於貝葉斯定理的監督學習算法,其「樸素」假設是:給定類別變量的每一對特徵之間條件獨立。貝葉斯定理描述了以下關係: 給定類別變量$y$以及屬性值向量$x_1$至$x_n$:html

$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)}$python

依據樸素條件獨立假設可得:算法

$P(x_i \mid y, x_1, \dots, x_{i-1}, x_{i+1}, \dots, x_n) = P(x_i \mid y)$dom

對 $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)}$spa

因爲輸入的$P(x_1, \dots, x_n)$是給定的常數值,咱們能夠獲得如下式子:code

$P(y \mid x_1, \dots, x_n) \propto P(y) \prod_{i=1}^{n} P(x_i \mid y)$htm

$\hat{y} = \arg\max_y P(y) \prod_{i=1}^{n} P(x_i \mid y)$ci

而後咱們能夠極大化後驗估計(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

相關文章
相關標籤/搜索