天天看點

機器學習之樸素貝葉斯Naïve Bayes (二) scikit-learn算法庫

參考:http://www.cnblogs.com/pinard/p/6074222.html

一、scikit-learn 樸素貝葉斯類庫概述

        樸素貝葉斯是一類比較簡單的算法,scikit-learn中樸素貝葉斯類庫的使用也比較簡單。相對于決策樹、KNN之類的算法,樸素貝葉斯需要關注的參數是比較少的,這樣也比較容易掌握。在scikit-learn中,一共有三個樸素貝葉斯的分類算法類,分别是GaussianNB,MultinomialNB和BernoulliNB。其中GaussianNB就是先驗為高斯分布的樸素貝葉斯,MultinomialNB就是先驗為多項式分布的樸素貝葉斯,而BernoulliNB就是先驗為伯努利分布的樸素貝葉斯。

        這三個類适用的分類場景各不相同,一般來說,如果樣本特征的分布大部分是連續值,使用GaussianNB會比較好;如果樣本特征的分布大部分是多元離散值,使用MultinomialNB比較合适;如果樣本特征是二進制離散值或者很稀疏的多元離散值,應該使用BernoulliNB。

二、GaussianNB類使用總結

        GaussianNB假設特征的先驗機率為正态分布,即如下式:

機器學習之樸素貝葉斯Naïve Bayes (二) scikit-learn算法庫

        其中

機器學習之樸素貝葉斯Naïve Bayes (二) scikit-learn算法庫

機器學習之樸素貝葉斯Naïve Bayes (二) scikit-learn算法庫

分别表示類别為yk的樣本中第i維特征的均值和方差,需要從訓練集中估計。

        GaussianNB類的主要參數僅有一個,即先驗機率priors ,對應Y的各個類别的先驗機率

機器學習之樸素貝葉斯Naïve Bayes (二) scikit-learn算法庫

。這個值預設不給出,如果不給出,此時

機器學習之樸素貝葉斯Naïve Bayes (二) scikit-learn算法庫

。其中N為訓練集樣本總數量,Nyk為輸出為第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也有類似的功能。

三、MultinomialNB類使用總結

        MultinomialNB假設特征的先驗機率為多項式分布,即如下式:

機器學習之樸素貝葉斯Naïve Bayes (二) scikit-learn算法庫

        其中,

機器學習之樸素貝葉斯Naïve Bayes (二) scikit-learn算法庫

是第yk個類别的第i維特征取值為xi的條件機率。Nyk是訓練集中輸出為第yk類的樣本個數。λ為一個大于0的常數,常常取為1,即拉普拉斯平滑。也可以取其他值。

        MultinomialNB參數比GaussianNB多,但是一共也隻有三個。其中,參數alpha即為上面的常數λ,如果沒有特别的需要,用預設的1即可。如果發現拟合的不好,需要調優時,可以選擇稍大于1或者稍小于1的數。布爾參數fit_prior表示是否要考慮先驗機率,如果是false,則所有的樣本類别輸出都有相同的類别先驗機率。否則可以自己用第三個參數class_prior輸入先驗機率,或者不輸入第三個參數class_prior讓MultinomialNB自己從訓練集樣本來計算先驗機率,此時的先驗機率為

機器學習之樸素貝葉斯Naïve Bayes (二) scikit-learn算法庫

。其中N為訓練集樣本總數量,Nyk為輸出為第yk類别的訓練集樣本數。總結如下:

fit_prior class_priot 最終先驗機率
false 填或不填均可 P(yk)=1/k
true 不填 P(yk)=Nyk/N
true P(yk)-class_prior

        在使用MultinomialNB的fit方法或者partial_fit方法拟合資料後,可以進行預測。此時預測有三種方法,包括predict,predict_log_proba和predict_proba。由于方法和GaussianNB完全一樣,這裡就不累述了。

四、BernoulliNB類使用總結

        BernoulliNB假設特征的先驗機率為二進制伯努利分布,即如下式:

機器學習之樸素貝葉斯Naïve Bayes (二) scikit-learn算法庫

        此時xi隻能取值0或者1。

        BernoulliNB一共有四個參數,其中三個參數的名字和意義和MultinomialNB完全相同,唯一增加的一個參數是binarize。這個參數主要是用來幫BernoulliNB處理二項分布的,可以是數值或者不輸入。如果不輸入,則BernoulliNB認為每個資料特征都已經是二進制的;否則的話,小于binarize的會歸為一類,大于binarize的會歸為另外一類。

    在使用BernoulliNB的fit或者partial_fit方法拟合資料後,我們可以進行預測。此時預測有三種方法,包括predict,predict_log_proba和predict_proba。由于方法和GaussianNB完全一樣,這裡就不累述了。

繼續閱讀