項目地址:https://github.com/Daya-Jin/ML_for_learner/blob/master/naive_bayes/Gaussian Naive Bayes.ipynb
原博客:https://daya-jin.github.io/2018/10/04/NaiveBayes/
模型概述
首先回顧一下貝葉斯公式:
P(A∣B)=P(B)P(AB)=P(B)P(B∣A)P(A)
以二分類爲例,上述公式以機器學習任務的形式來寫的話就成爲了:
P(y=0∣x)=P(x)P(x∣y=0)P(y=0)P(y=1∣x)=P(x)P(x∣y=1)P(y=1)
其中x爲待預測樣本。對於需要算的幾個概率,一個一個來看。
P(x∣y=0),注意到樣本x是一個同時有多個值的向量,x=[x0x1⋯xn],在數據集中很可能沒有跟待預測樣本x(i)完全相同的樣本,那麼就沒法直接計算P(x∣y=0)。注意到在各特徵相互獨立的前提下,有:
P(x∣y=0)=P(x0D=x0∣y=0)P(x1D=x1∣y=0)...P(xnD=xn∣y=0)
P(y=0),這個好辦,直接計算樣本中負樣本出現的頻率,相對應地,P(y=1)即樣本中正樣本出現的頻率。
P(x)這個概率同樣不好直接計算,根據全概率公式,有:
P(x)=P(y=0)P(x∣y=0)+P(y=1)P(x∣y=1)
在各特徵獨立的條件下,上式可以寫成:
P(x)=P(y=0)P(x0D=x0∣y=0)...P(xnD=xn∣y=0)+P(y=1)P(x0D=x0∣y=1)...P(xnD=xn∣y=1)
容易看出,對同一個數據集而言,P(x)是不變的,所以只需要關注分子即可。
所以上述問題在多分類的情況下可以用以下公式來表達:
y^=arg cjmax P(Y=ck)i=0∏nP(xiD=xi∣Y=cj)
其中x爲待預測樣本,y^爲模型輸出,xiD爲數據集中的樣本的第i個特徵,Y爲數據集標籤,cj爲第j個類別。同時注意到上面做了兩次假設:各特徵之間相互獨立,這是樸素貝葉斯最重要的一個前提條件。
連續屬性
對於數據集中的連續屬性
xiD,怎麼計算P(xiD=xi∣Y=ck)?可假設該連續特徵在某一類別下ck服從某一分佈,如高斯分佈P(xi∣Y=ck)=2πσck,i1exp(−2σck,i2(xi−μck,i)2)。
一點改進
在原始的問題公式中,如果累乘項中的某一項爲零,那麼就會影響最終結果從而始終得到零概率輸出,如有一項
P(xiD=xi∣Y=cj)=0,則不管該樣本的其他屬性如何,模型對該樣本屬於各個類別的預測概率均爲0,這說明模型沒有很好的泛化能力。有兩種改進方法:
-
將累乘取對數轉換成累加
-
拉普拉斯修正
原概率計算公式爲
P(Y=ck)=∣D∣∣Dck∣,
P(xiD=xi∣Y=ck)=∣Dck∣∣Dck,xi∣,經拉普拉斯修正後的概率計算公式爲P^(Y=ck)=∣D∣+N∣Dck∣+1,P^(xiD=xi∣Y=ck)=∣Dck∣+Ni∣Dck,xi∣+1,其中N爲數據集的類別數,Ni爲第i個特徵的可能取值數。
實現指導
完整代碼