scikit-learn 朴素贝叶斯类库使用小结
之前在樸素貝葉斯算法原理小結這篇文章中,對樸素貝葉斯分類算法的原理做了一個總結。這里我們就從實戰的角度來看樸素貝葉斯類庫。重點講述scikit-learn 樸素貝葉斯類庫的使用要點和參數選擇。
1. scikit-learn 樸素貝葉斯類庫概述
樸素貝葉斯是一類比較簡單的算法,scikit-learn中樸素貝葉斯類庫的使用也比較簡單。相對于決策樹,KNN之類的算法,樸素貝葉斯需要關注的參數是比較少的,這樣也比較容易掌握。在scikit-learn中,一共有3個樸素貝葉斯的分類算法類。分別是GaussianNB,MultinomialNB和BernoulliNB。其中GaussianNB就是先驗為高斯分布的樸素貝葉斯,MultinomialNB就是先驗為多項式分布的樸素貝葉斯,而BernoulliNB就是先驗為伯努利分布的樸素貝葉斯。
這三個類適用的分類場景各不相同,一般來說,如果樣本特征的分布大部分是連續值,使用GaussianNB會比較好。如果如果樣本特征的分大部分是多元離散值,使用MultinomialNB比較合適。而如果樣本特征是二元離散值或者很稀疏的多元離散值,應該使用BernoulliNB。
2.?GaussianNB類使用總結
GaussianNB假設特征的先驗概率為正態分布,即如下式:
P(Xj=xj|Y=Ck)=12πσ2k????√exp(?(xj?μk)22σ2k)P(Xj=xj|Y=Ck)=12πσk2exp(?(xj?μk)22σk2)
其中CkCk為Y的第k類類別。μk和σ2kμk和σk2為需要從訓練集估計的值。
GaussianNB會根據訓練集求出μk和σ2kμk和σk2。?μkμk為在樣本類別CkCk中,所有XjXj的平均值。σ2kσk2為在樣本類別CkCk中,所有XjXj的方差。
GaussianNB類的主要參數僅有一個,即先驗概率priors?,對應Y的各個類別的先驗概率P(Y=Ck)P(Y=Ck)。這個值默認不給出,如果不給出此時P(Y=Ck)=mk/mP(Y=Ck)=mk/m。其中m為訓練集樣本總數量,mkmk為輸出為第k類別的訓練集樣本數。如果給出的話就以priors 為準。
在使用GaussianNB的fit方法擬合數據后,我們可以進行預測。此時預測有三種方法,包括predict,predict_log_proba和predict_proba。
predict方法就是我們最常用的預測方法,直接給出測試集的預測類別輸出。
predict_proba則不同,它會給出測試集樣本在各個類別上預測的概率。容易理解,predict_proba預測出的各個類別概率里的最大值對應的類別,也就是predict方法得到類別。
predict_log_proba和predict_proba類似,它會給出測試集樣本在各個類別上預測的概率的一個對數轉化。轉化后predict_log_proba預測出的各個類別對數概率里的最大值對應的類別,也就是predict方法得到類別。
下面給一個具體的例子,代碼如下:
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) print "==Predict result by predict==" print(clf.predict([[-0.8, -1]])) print "==Predict result by predict_proba==" print(clf.predict_proba([[-0.8, -1]])) print "==Predict result by predict_log_proba==" print(clf.predict_log_proba([[-0.8, -1]]))結果如下:
==Predict result by predict== [1] ==Predict result by predict_proba== [[ 9.99999949e-01 5.05653254e-08]] ==Predict result by predict_log_proba== [[ -5.05653266e-08 -1.67999998e+01]]從上面的結果可以看出,測試樣本[-0.8,-1]的類別預測為類別1。具體的測試樣本[-0.8,-1]被預測為1的概率為9.99999949e-01 ,遠遠大于預測為2的概率5.05653254e-08。這也是為什么最終的預測結果為1的原因了。
此外,GaussianNB一個重要的功能是有 partial_fit方法,這個方法的一般用在如果訓練集數據量非常大,一次不能全部載入內存的時候。這時我們可以把訓練集分成若干等分,重復調用partial_fit來一步步的學習訓練集,非常方便。后面講到的MultinomialNB和BernoulliNB也有類似的功能。
3.?MultinomialNB類使用總結
MultinomialNB假設特征的先驗概率為多項式分布,即如下式:
P(Xj=xjl|Y=Ck)=xjl+λmk+nλP(Xj=xjl|Y=Ck)=xjl+λmk+nλ
其中,P(Xj=xjl|Y=Ck)P(Xj=xjl|Y=Ck)是第k個類別的第j維特征的第l個個取值條件概率。mkmk是訓練集中輸出為第k類的樣本個數。λλ?為一個大于0的常數,常常取為1,即拉普拉斯平滑。也可以取其他值。
MultinomialNB參數比GaussianNB多,但是一共也只有僅僅3個。其中,參數alpha即為上面的常數λλ,如果你沒有特別的需要,用默認的1即可。如果發現擬合的不好,需要調優時,可以選擇稍大于1或者稍小于1的數。布爾參數fit_prior表示是否要考慮先驗概率,如果是false,則所有的樣本類別輸出都有相同的類別先驗概率。否則可以自己用第三個參數class_prior輸入先驗概率,或者不輸入第三個參數class_prior讓MultinomialNB自己從訓練集樣本來計算先驗概率,此時的先驗概率為P(Y=Ck)=mk/mP(Y=Ck)=mk/m。其中m為訓練集樣本總數量,mkmk為輸出為第k類別的訓練集樣本數。總結如下:
| fit_prior | class_prior | 最終先驗概率 |
| false | 填或者不填沒有意義 | P(Y=Ck)=1/kP(Y=Ck)=1/k |
| true | 不填 | P(Y=Ck)=mk/mP(Y=Ck)=mk/m |
| true | 填 | P(Y=Ck)=P(Y=Ck)=class_prior |
?
在使用MultinomialNB的fit方法或者partial_fit方法擬合數據后,我們可以進行預測。此時預測有三種方法,包括predict,predict_log_proba和predict_proba。由于方法和GaussianNB完全一樣,這里就不累述了。
4.?BernoulliNB類使用總結
BernoulliNB假設特征的先驗概率為二元伯努利分布,即如下式:
P(Xj=xjl|Y=Ck)=P(j|Y=Ck)xjl+(1?P(j|Y=Ck)(1?xjl)P(Xj=xjl|Y=Ck)=P(j|Y=Ck)xjl+(1?P(j|Y=Ck)(1?xjl)
此時ll只有兩種取值。xjlxjl只能取值0或者1。
BernoulliNB一共有4個參數,其中3個參數的名字和意義和MultinomialNB完全相同。唯一增加的一個參數是binarize。這個參數主要是用來幫BernoulliNB處理二項分布的,可以是數值或者不輸入。如果不輸入,則BernoulliNB認為每個數據特征都已經是二元的。否則的話,小于binarize的會歸為一類,大于binarize的會歸為另外一類。
在使用BernoulliNB的fit或者partial_fit方法擬合數據后,我們可以進行預測。此時預測有三種方法,包括predict,predict_log_proba和predict_proba。由于方法和GaussianNB完全一樣,這里就不累述了。
以上就是scikit-learn 樸素貝葉斯類庫的使用的經驗總結。希望可以幫到朋友們。
?原文地址:http://www.cnblogs.com/pinard/p/6074222.html
(歡迎轉載,轉載請注明出處。歡迎溝通交流: pinard.liu@ericsson.com)?
總結
以上是生活随笔為你收集整理的scikit-learn 朴素贝叶斯类库使用小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用scikit-learn和pandas
- 下一篇: K近邻法(KNN)原理小结