基於scikit-learn的樸素貝葉斯實戰
寫在前面
學完了樸素貝葉斯的基本原理(機器學習演算法總結之樸素貝葉斯法),現在利用sklearn平臺的樸素貝葉斯類庫來實戰一下,加深印象。
1.sklearn中樸素貝葉斯(NB)簡介
相比於前面的決策樹以及整合演算法,NB所需要調節的引數還是比較少的。在scikit-learn中,一共有3個樸素貝葉斯的分類演算法類。分別是GaussianNB,MultinomialNB和BernoulliNB。其中GaussianNB就是先驗為高斯分佈的樸素貝葉斯,MultinomialNB就是先驗為多項式分佈的樸素貝葉斯,而BernoulliNB就是先驗為伯努利分佈的樸素貝葉斯。
這三個類適用的分類場景各不相同,一般來說,如果樣本特徵的分佈大部分是連續值,使用GaussianNB會比較好。如果如果樣本特徵的分大部分是多元離散值,使用MultinomialNB比較合適。而如果樣本特徵是二元離散值或者很稀疏的多元離散值,應該使用BernoulliNB。
下面分別從這三個不同的類來進行實戰。
2. GaussianNB實戰
GaussianNB假設特徵的先驗概率為正態分佈:GaussianNB會根據訓練集求出μk和σ2k。 μk為在樣本類別Ck中,所有Xj的平均值。σ2k為在樣本類別Ck中,所有Xj的方差。
GaussianNB類的主要引數僅有一個,即先驗概率priors ,對應Y的各個類別的先驗概率P(Y=Ck)。這個值預設不給出,如果不給出此時P(Y=Ck)=mk/m。其中m為訓練集樣本總數量,mk為輸出為第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方法得到類別。
此外,GaussianNB一個重要的功能是有 partial_fit方法,這個方法的一般用在如果訓練集資料量非常大,一次不能全部載入記憶體的時候。這時我們可以把訓練集分成若干等分,重複呼叫partial_fit來一步步的學習訓練集,非常方便。後面講到的MultinomialNB和BernoulliNB也有類似的功能。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]]))
3.MultinomialNB實戰
MultinomialNB假設特徵的先驗概率為多項式分佈:
MultinomialNB引數比GaussianNB多,但是一共也只有僅僅3個。其中,引數alpha即為上面的常數λ,如果你沒有特別的需要,用預設的1即可。如果發現擬合的不好,需要調優時,可以選擇稍大於1或者稍小於1的數。布林引數fit_prior表示是否要考慮先驗概率,如果是false,則所有的樣本類別輸出都有相同的類別先驗概率。否則可以自己用第三個引數class_prior輸入先驗概率,或者不輸入第三個引數class_prior讓MultinomialNB自己從訓練集樣本來計算先驗概率,此時的先驗概率為P(Y=Ck)=mk/m。其中m為訓練集樣本總數量,mk為輸出為第k類別的訓練集樣本數。
4.BernoulliNB實戰
BernoulliNB假設特徵的先驗概率為二元伯努利分佈:BernoulliNB一共有4個引數,其中3個引數的名字和意義和MultinomialNB完全相同。唯一增加的一個引數是binarize。這個引數主要是用來幫BernoulliNB處理二項分佈的,可以是數值或者不輸入。如果不輸入,則BernoulliNB認為每個資料特徵都已經是二元的。否則的話,小於binarize的會歸為一類,大於binarize的會歸為另外一類。
以上~
2018.04.21