scikit-learn樸素貝葉斯GaussianNB實例

scikit-learn樸素貝葉斯GaussianNB實例

1、什麼是樸素貝葉斯

在所有的機器學習分類算法中,樸素貝葉斯和其他絕大多數的分類算法都不同。對於大多數的分類算法,比如決策樹,KNN,邏輯迴歸,支持向量機等,他們都是判別方法,也就是直接學習出特徵輸出Y和特徵X之間的關係,要麼是決策函數Y=f(X),要麼是條件分佈P(Y|X)。但是樸素貝葉斯卻是生成方法,也就是直接找出特徵輸出Y和特徵X的聯合分佈P(X,Y),然後用P(Y|X)=P(X,Y)/P(X)得出。樸素貝葉斯很直觀,計算量也不大,在很多領域有廣泛的應用。

首先回顧一下樸素貝葉斯相關的統計學知識:

貝葉斯學派的思想可以概括爲先驗概率+數據=後驗概率。也就是說我們在實際問題中需要得到的後驗概率,可以通過先驗概率和數據一起綜合得到。

我們先看看條件獨立公式,如果X和Y相互獨立,則有:P(A,B)=P(A)P(B)

我們接着看看條件概率公式:P(AB)=P(A|B)P(B)=P(B|A)P(A)
在這裏插入圖片描述
2、scikit-learn 樸素貝葉斯類庫

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

這三個類適用的分類場景各不相同,主要根據數據類型來進行模型的選擇。一般來說,如果樣本特徵的分佈大部分是連續值,使用GaussianNB會比較好。如果如果樣本特徵的分大部分是多元離散值,使用MultinomialNB比較合適。而如果樣本特徵是二元離散值或者很稀疏的多元離散值,應該使用BernoulliNB。

a>>>GaussianNB Naive_Bayes
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方法得到類別。

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]]))

此外,GaussianNB一個重要的功能是有 partial_fit方法,這個方法的一般用在如果訓練集數據量非常大,一次不能全部載入內存的時候。這時我們可以把訓練集分成若干等分,重複調用partial_fit來一步步的學習訓練集,非常方便。後面講到的MultinomialNB和BernoulliNB也有類似的功能。

b>>>MultinomialNB Naive_Bayes

MultinomialNB參數比GaussianNB多,但是一共也只有僅僅3個。其中,參數alpha即爲上面的常數λ,如果你沒有特別的需要,用默認的1即可。如果發現擬合的不好,需要調優時,可以選擇稍大於1或者稍小於1的數。布爾參數fit_prior表示是否要考慮先驗概率,如果是false,則所有的樣本類別輸出都有相同的類別先驗概率。否則可以自己用第三個參數class_prior輸入先驗概率,或者不輸入第三個參數class_prior讓MultinomialNB自己從訓練集樣本來計算先驗概率,此時的先驗概率爲P(Y=Ck)=mk/m。其中m爲訓練集樣本總數量,mk爲輸出爲第k類別的訓練集樣本數。
在這裏插入圖片描述

c>>>BernoulliNB Naive_Bayes

BernoulliNB一共有4個參數,其中3個參數的名字和意義和MultinomialNB完全相同。唯一增加的一個參數是binarize。這個參數主要是用來幫BernoulliNB處理二項分佈的,可以是數值或者不輸入。如果不輸入,則BernoulliNB認爲每個數據特徵都已經是二元的。否則的話,小於binarize的會歸爲一類,大於binarize的會歸爲另外一類。

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

3、樸素貝葉斯的主要優缺點

樸素貝葉斯的主要優點有:

1)樸素貝葉斯模型發源於古典數學理論,有穩定的分類效率。

2)對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練,尤其是數據量超出內存時,我們可以一批批的去增量訓練。

3)對缺失數據不太敏感,算法也比較簡單,常用於文本分類。

樸素貝葉斯的主要缺點有:

1) 理論上,樸素貝葉斯模型與其他分類方法相比具有最小的誤差率。但是實際上並非總是如此,這是因爲樸素貝葉斯模型假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的,在屬性個數比較多或者屬性之間相關性較大時,分類效果不好。而在屬性相關性較小時,樸素貝葉斯性能最爲良好。對於這一點,有半樸素貝葉斯之類的算法通過考慮部分關聯性適度改進。

2)需要知道先驗概率,且先驗概率很多時候取決於假設,假設的模型可以有很多種,因此在某些時候會由於假設的先驗模型的原因導致預測效果不佳。

3)由於我們是通過先驗和數據來決定後驗的概率從而決定分類,所以分類決策存在一定的錯誤率。

4)對輸入數據的表達形式很敏感。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章