機器學習Sklearn系列:(四)樸素貝葉斯

Neo0oeN發表於2021-07-18

3--樸素貝葉斯

原理

樸素貝葉斯本質上就是通過貝葉斯公式來對得到類別概率,但區別於通常的貝葉斯公式,樸素貝葉斯有一個預設條件,就是特徵之間條件獨立。

條件概率公式:

\[P(B|A) = \frac{P(A|B)P(B)}{P(A)} \]

貝葉斯公式可以寫成:

\[p(y_i|x) = \frac{p(x|y_i)p(y_i)}{p(x)} \]

如果A和B相對於C是條件獨立的,那麼滿足\(P(A|C) = P(A|B,C)\)。 如果樣本的兩個特徵\(x_1\)\(x_2\)相對於y條件獨立,那麼可以得到\(p(x_1,x_2|y) = p(x_1|y)p(x_2|y)\)

通過條件獨立公式,上述貝葉斯公式中,\(p(x|y_i)\)的計算則可以簡化成如下公式:

\[p(x|y_i) = p(x_1|yi)p(x_2|yi)p(x_3|yi)...p(x_n|yi) \]

實現細節

對於離散型別資料, \(p(x_i|y)\)可以通過計算特徵的數量得到概率。

\[p(x_i|y) = \frac{N_{yi}}{N_y} \]

唯一需要注意的就是拉普拉斯修正(Laplacian Correction),如果莫一個新的特徵x從來沒有出現過,那麼分母就有可能為0,為了避免這種情況,可以做如下操作:

\[p(x_i|y)= \frac{N_{yi}+\alpha}{N_y+an} \]

而對於連續型資料,計算方法則不太相同,高斯貝葉斯認為資料服從高斯分佈,所以預設為某一列特徵服從高斯分佈,然後通過高斯概率密度函式,就可以得到相應的概率。

假設某一列特徵服從整體分佈

\[p(x_i|y)\sim N(\mu_{y,i},\sigma_{y,i}^2) \]

其中\(\mu\)\(\sigma\)為y類樣本在樣本x第i個屬性的均值和方差,那麼其計算方法如下:

首先計算出標籤y在特徵\(x_i\)上的均值和方差,然後就可以得到其概率的計算公式了:

\[p(x_i|y) = \frac{1}{\sqrt{2\pi}\sigma_{y,i}}exp(-\frac{(x_i-\mu_{y,i})^2}{2\sigma^2_{y,i}}) \]

當具體計算的時候,可以直接對區間進行積分,然後進行化簡,可以得到最終的概率值:

\(P(x_i<x<x_i+\epsilon) = \int_{x_i}^{x_i+\epsilon}f(x)dx \approx f(x_i)*\epsilon\)

這裡就是使用高斯概率密度函式對概率進行估計的樸素貝葉斯計算方法,對於sklearn中的GaussionNB函式。

sklearn中的樸素貝葉斯方法

sklearn中的樸素貝葉斯有幾種方法:

描述
naive_bayes.BernoullNB 伯努利分佈下的樸素貝葉斯
naive_bayes.GaussianNB 高斯分佈下的樸素貝葉斯
naive_bayes.MultinomialNB 多項式分佈下的樸素貝葉斯
naive_bayes.ComplementNB 補集樸素貝葉斯
linear_model.BayesianRidge 貝葉斯嶺迴歸,在引數估計過程中使用貝葉斯迴歸技術來包括正則化引數

sklearn中的樸素貝葉斯演算法,就如上述所提到的,對於連續型變數,可以使用高斯正太分佈進行概率估計(這裡對應高斯樸素貝葉斯),當然可以使用其他不同的分佈進行概率估計,比如使用伯努利分佈估計的話,則對應下表中的伯努利樸素貝葉斯演算法。也就是說,其差別主要在於使用不同的方法來估計概率。

使用示例:

from sklearn import naive_bayes as nb

from sklearn.preprocessing import LabelEncoder

#由於sklearn中的樸素貝葉斯預設不支援字串形式的特徵,需要將字串編碼成數字特徵,
所以這裡可以使用LabelEncoder,例如下面所示,會自動將字串從0到N進行編碼

X[:,1] = LabelEncoder().fit_transform(X[:,1]))

使用樸素貝葉斯:
model = nb.GaussianNB()

model.fit(X,y) 

相關文章