scikit-learn 樸素貝葉斯類庫使用小結

以前在樸素貝葉斯算法原理小結這篇文章中,對樸素貝葉斯分類算法的原理作了一個總結。這裏咱們就從實戰的角度來看樸素貝葉斯類庫。重點講述scikit-learn 樸素貝葉斯類庫的使用要點和參數選擇。javascript

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

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

    這三個類適用的分類場景各不相同,通常來講,若是樣本特徵的分佈大部分是連續值,使用GaussianNB會比較好。若是若是樣本特徵的分大部分是多元離散值,使用MultinomialNB比較合適。而若是樣本特徵是二元離散值或者很稀疏的多元離散值,應該使用BernoulliNB。html

2、2. GaussianNB類使用總結

    GaussianNB假設特徵的先驗機率爲正態分佈,即以下式:java

\[ P(X_j=x_j|Y=C_k) = \frac{1}{\sqrt{2\pi\sigma_k^2}}exp\Bigg{(}-\frac{(x_j - \mu_k)^2}{2\sigma_k^2}\Bigg{)} \]python

    其中\(C_k\)爲Y的第k類類別。\(\mu_k和\sigma_k^2\)爲須要從訓練集估計的值。git

    GaussianNB會根據訓練集求出\(\mu_k和\sigma_k^2\)\(\mu_k\)爲在樣本類別\(C_k\)中,全部\(X_j\)的平均值。\(\sigma_k^2\)爲在樣本類別\(C_k\)中,全部\(X_j\)的方差。github

    GaussianNB類的主要參數僅有一個,即先驗機率priors ,對應Y的各個類別的先驗機率\(P(Y=C_k)\)。這個值默認不給出,若是不給出此時\(P(Y=C_k) = m_k/m\)。其中m爲訓練集樣本總數量,\(m_k\)爲輸出爲第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方法獲得類別。

    下面給一個具體的例子,代碼以下,亦可見個人github

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、3. MultinomialNB類使用總結

    MultinomialNB假設特徵的先驗機率爲多項式分佈,即以下式:

\[ P(X_j=x_{jl}|Y=C_k) = \frac{x_{jl} + \lambda}{m_k + n\lambda} \]

    其中,\(P(X_j=x_{jl}|Y=C_k)\)是第k個類別的第j維特徵的第l個個取值條件機率。\(m_k\)是訓練集中輸出爲第k類的樣本個數。\(\lambda\) 爲一個大於0的常數,經常取爲1,即拉普拉斯平滑。也能夠取其餘值。

    MultinomialNB參數比GaussianNB多,可是一共也只有僅僅3個。其中,參數alpha即爲上面的常數\(\lambda\),若是你沒有特別的須要,用默認的1便可。若是發現擬合的很差,須要調優時,能夠選擇稍大於1或者稍小於1的數。布爾參數fit_prior表示是否要考慮先驗機率,若是是false,則全部的樣本類別輸出都有相同的類別先驗機率。不然能夠本身用第三個參數class_prior輸入先驗機率,或者不輸入第三個參數class_prior讓MultinomialNB本身從訓練集樣原本計算先驗機率,此時的先驗機率爲\(P(Y=C_k) = m_k/m\)。其中m爲訓練集樣本總數量,\(m_k\)爲輸出爲第k類別的訓練集樣本數。總結以下:

fit_prior

class_prior 最終先驗機率
false 填或者不填沒有意義 \(P(Y=C_k) = 1/k\)
true 不填 \(P(Y=C_k) = m_k/m\)
true $P(Y=C_k) = $class_prior

 

    在使用MultinomialNB的fit方法或者partial_fit方法擬合數據後,咱們能夠進行預測。此時預測有三種方法,包括predict,predict_log_proba和predict_proba。因爲方法和GaussianNB徹底同樣,這裏就不累述了。 

4、4. BernoulliNB類使用總結

    BernoulliNB假設特徵的先驗機率爲二元伯努利分佈,即以下式:

\[ P(X_j=x_{jl}|Y=C_k) = P(j|Y=C_k)x_{jl} + (1 - P(j|Y=C_k)(1-x_{jl}) \]

    此時\(l\)只有兩種取值。\(x_{jl}\)只能取值0或者1。

    BernoulliNB一共有4個參數,其中3個參數的名字和意義和MultinomialNB徹底相同。惟一增長的一個參數是binarize。這個參數主要是用來幫BernoulliNB處理二項分佈的,能夠是數值或者不輸入。若是不輸入,則BernoulliNB認爲每一個數據特徵都已是二元的。不然的話,小於binarize的會歸爲一類,大於binarize的會歸爲另一類。

    在使用BernoulliNB的fit或者partial_fit方法擬合數據後,咱們能夠進行預測。此時預測有三種方法,包括predict,predict_log_proba和predict_proba。因爲方法和GaussianNB徹底同樣,這裏就不累述了。

    以上就是scikit-learn 樸素貝葉斯類庫的使用的經驗總結。但願能夠幫到朋友們。

 

(歡迎轉載,轉載請註明出處。歡迎溝通交流: 微信:nickchen121)

posted @ 2019-07-19 17:51  十七歲的有德 閱讀( ...) 評論( ...) 編輯 收藏
相關文章
相關標籤/搜索