1. 程式人生 > >樸素貝葉斯原理及sklearn呼叫

樸素貝葉斯原理及sklearn呼叫

一、原理

與其他大多數的分類演算法不同,如:決策樹、KNN、邏輯迴歸等,它們都是判別方法,直接學習出類別y和特徵x之間的關係。樸素貝葉斯屬於生成方法,它的理論基礎是貝葉斯公式: P ( Y X

) = P ( X Y
) P ( Y )
P ( X
)
P(Y|X')=\frac {P(X'|Y)P(Y)}{P(X)} ,其中P(Y)是先驗知識,P(X’|Y)是已知果,求因出現的概率。而“樸素”一詞指的是假設特徵X之間相互獨立。與頻率學派的不同點在於,貝葉斯加入了先驗知識的影響。貝葉斯演算法計算量不大,在文字分類中有很好的效果。

下面說一下樸素貝葉斯的推導過程:
我們的目標是對給定的樣本特徵X,計算其所屬分類,即求 P ( Y = C k X ) P(Y=C_k|X) ,設 C k C_k 為第k個類別,根據貝葉斯公式,也就是:
P ( Y = C k X t e s t ) = P ( X t e s t Y = C k ) P ( Y = C k ) P ( X ) P(Y=C_k|X^{test})=\frac {P(X^{test}|Y=C_k)P(Y=C_k)}{P(X)}
把所有的類別都計算一遍,最後概率最大的那個就是我們要找的類別了。
對於不同的類別來說,上面公式中的分母P(X)是相同的,所以我們只需要計算分子然後比較概率就可以了。

對分子的第二項 P ( Y = C k ) P(Y=C_k) ,可以看做所有樣本中,類別 C k C_k 出現的頻率,這個很好求。

對分子的第一項 P ( X t e s t Y = C k ) P(X^{test}|Y=C_k) ,要看特徵X是離散還是連續的。
1、若 x i x_i 為離散值,那麼我們只需計算每個屬性取值佔該類別樣本的數量比例就行了:
P ( X t e s t Y = C k ) = i = 1 n D c , x i D c P(X^{test}|Y=C_k)=\prod_{i=1}^{n}\frac {|D_{c,x_i}|}{|D_c|}
D c D_c 表示訓練集D中第c類樣本組成的集合, D c , x i D_{c,x_i} 表示的是第c類樣本組成的集合中在第i個屬性值上取值為 x i x_i 的樣本組成的集合。

2、若 x i x_i 是連續值,就要用概率密度函式,假定X服從高斯分佈:
在這裡插入圖片描述
其中 μ c , i μ_{c,i} σ c , i 2 σ_{c,i}^2 分別是第c類樣本在第i個屬性上取值的均值和方差。

推導過程就是這樣,在實際用的時候,需要注意:
1、防止概率連乘之後太小,以至於為0,往往把連乘取對數。
2、為了防止某個離散型別的屬性值在訓練集的某個類別中沒有出現過,會導致 P ( x i Y = C k ) = 0 P(x_i|Y=C_k)=0 ,這樣是不合理的,因此我們一般會做平滑處理:在這裡插入圖片描述
這樣我們在分母上加上取值的可能性個數,分子上都加1,這就保證了即使是存在某個屬性i的取值 x i x_i 未曾與類別c同時出現過,我們也不會把其概率 P ( x i c ) P(x_i∣c) 算成0。

二、sklearn呼叫

在scikit-learn中,一共有3個樸素貝葉斯的分類演算法類。分別是GaussianNB,MultinomialNB和BernoulliNB。它們的樣本特徵先驗分佈不同,其中GaussianNB的先驗為高斯分佈,MultinomialNB的先驗為多項式分佈,而BernoulliNB的先驗為伯努利分佈。

1、GaussianNB
GaussianNB類的主要引數僅有一個,即類別先驗概率priors ,對應Y的各個類別的先驗概率 P ( Y = C k ) P(Y=C_k) ,預設是 P ( Y = C k ) = m k / m P(Y=C_k)=m_k/m 。其中m為訓練集樣本總數量, m k m_k 為輸出為第 k k 類別的訓練集樣本數。

模型訓練:
fit()
partial_fit(),這個方法的一般用在訓練集資料量非常大,一次不能全部載入記憶體的時候。這時我們可以把訓練集分成若干等分,重複呼叫partial_fit增量式地學習訓練集。

樣本預測:
predict():給出測試集的預測類別輸出。
predict_proba:給出測試集樣本在各個類別上預測的概率。
predict_log_proba:給出測試集樣本在各個類別上預測的概率的對數。

2、MultinomialNB
MultinomialNB假設特徵的先驗概率為多項式分佈:
在這裡插入圖片描述
MultinomialNB引數共有3個。
(1)引數alpha即為上面的常數λ,預設為1,如果發現擬合的不好,需要調優時,可以選擇稍大於1或者稍小於1的數。
(2)布林引數fit_prior表示是否要考慮類別先驗概率,預設是true;如果輸入false,則所有的樣本類別輸出都有相同的類別先驗概率;
(3)class_prior類別先驗概率:預設是 P ( Y = C k ) = m k m P(Y=C_k)=\frac {m_k}{m} ;如果指定為class_prior,則指定的這個作為先驗概率;

模型訓練和樣本預測同GaussianNB。在做文字分類時用的就是這個。

3、BernoulliNB
這個沒有用到過,以後再總結。

總結:如果用樸素貝葉斯做分類,效果不是很好,可能有下面幾個原因:
1、特徵之間關聯度太高。
2、類別先驗概率不合適。