樸素貝葉斯原理及sklearn呼叫
一、原理
與其他大多數的分類演算法不同,如:決策樹、KNN、邏輯迴歸等,它們都是判別方法,直接學習出類別y和特徵x之間的關係。樸素貝葉斯屬於生成方法,它的理論基礎是貝葉斯公式: ,其中P(Y)是先驗知識,P(X’|Y)是已知果,求因出現的概率。而“樸素”一詞指的是假設特徵X之間相互獨立。與頻率學派的不同點在於,貝葉斯加入了先驗知識的影響。貝葉斯演算法計算量不大,在文字分類中有很好的效果。
下面說一下樸素貝葉斯的推導過程:
我們的目標是對給定的樣本特徵X,計算其所屬分類,即求
,設
為第k個類別,根據貝葉斯公式,也就是:
把所有的類別都計算一遍,最後概率最大的那個就是我們要找的類別了。
對於不同的類別來說,上面公式中的分母P(X)是相同的,所以我們只需要計算分子然後比較概率就可以了。
對分子的第二項 ,可以看做所有樣本中,類別 出現的頻率,這個很好求。
對分子的第一項
,要看特徵X是離散還是連續的。
1、若
為離散值,那麼我們只需計算每個屬性取值佔該類別樣本的數量比例就行了:
表示訓練集D中第c類樣本組成的集合,
表示的是第c類樣本組成的集合中在第i個屬性值上取值為
的樣本組成的集合。
2、若
是連續值,就要用概率密度函式,假定X服從高斯分佈:
其中
和
分別是第c類樣本在第i個屬性上取值的均值和方差。
推導過程就是這樣,在實際用的時候,需要注意:
1、防止概率連乘之後太小,以至於為0,往往把連乘取對數。
2、為了防止某個離散型別的屬性值在訓練集的某個類別中沒有出現過,會導致
,這樣是不合理的,因此我們一般會做平滑處理:
這樣我們在分母上加上取值的可能性個數,分子上都加1,這就保證了即使是存在某個屬性i的取值
未曾與類別c同時出現過,我們也不會把其概率
算成0。
二、sklearn呼叫
在scikit-learn中,一共有3個樸素貝葉斯的分類演算法類。分別是GaussianNB,MultinomialNB和BernoulliNB。它們的樣本特徵先驗分佈不同,其中GaussianNB的先驗為高斯分佈,MultinomialNB的先驗為多項式分佈,而BernoulliNB的先驗為伯努利分佈。
1、GaussianNB
GaussianNB類的主要引數僅有一個,即類別先驗概率priors ,對應Y的各個類別的先驗概率
,預設是
。其中m為訓練集樣本總數量,
為輸出為第
類別的訓練集樣本數。
模型訓練:
fit()
partial_fit(),這個方法的一般用在訓練集資料量非常大,一次不能全部載入記憶體的時候。這時我們可以把訓練集分成若干等分,重複呼叫partial_fit增量式地學習訓練集。
樣本預測:
predict():給出測試集的預測類別輸出。
predict_proba:給出測試集樣本在各個類別上預測的概率。
predict_log_proba:給出測試集樣本在各個類別上預測的概率的對數。
2、MultinomialNB
MultinomialNB假設特徵的先驗概率為多項式分佈:
MultinomialNB引數共有3個。
(1)引數alpha即為上面的常數λ,預設為1,如果發現擬合的不好,需要調優時,可以選擇稍大於1或者稍小於1的數。
(2)布林引數fit_prior表示是否要考慮類別先驗概率,預設是true;如果輸入false,則所有的樣本類別輸出都有相同的類別先驗概率;
(3)class_prior類別先驗概率:預設是
;如果指定為class_prior,則指定的這個作為先驗概率;
模型訓練和樣本預測同GaussianNB。在做文字分類時用的就是這個。
3、BernoulliNB
這個沒有用到過,以後再總結。
總結:如果用樸素貝葉斯做分類,效果不是很好,可能有下面幾個原因:
1、特徵之間關聯度太高。
2、類別先驗概率不合適。