貝氏分類器(Naive Bayes Classifier)(含python實作)
貝氏分類器是一種基於機率模型的機器學習模型,並且假設每個特徵都是相互獨立的,可以同時接受離散型變數和連續型變數。透過計算,我們可以知道在已知的資料下哪個目標的發生機率最大,由此去做分類。
同樣我們先將貝氏定理寫下來
單純貝氏分類器 Naive Bayes Classifier
接著我們要找到給定特徵下事件發生機率最高的目標P(yi|Xi),其中Xi=x1,x2, … ,xn,代表著各個特徵,yi其中一個分類,而發生機率最高的P(yi|Xi)裡的yi我們稱之為y∗,也就是我們最終會預測出來的分類,這就是大家熟知的最大後驗機率(MAP)。
最大後驗機率
又可以寫成
因假設各個特徵相互獨立,所以
所以最大後驗機率又可以寫成
我們來做一個單純貝氏分類器的例子
我們觀察到今天的天氣特徵(天氣=晴、溫度=適中),來判斷今天是否該取消活動。
P(取消)=5/14, P(進行)=9/14
P(取消|天氣=晴,溫度=適中)=P(取消)P(天氣=晴|取消)P(溫度=適中|取消)=5/14(3/5*2/5)=0.0857
P(進行|天氣=晴,溫度=適中)=P(進行)P(天氣=晴|進行)P(溫度=適中|進行)=9/14(2/9*4/9)=0.0635
所以我們的最大後驗機率
y = arg max(P(取消|天氣=晴,溫度=適中),P(進行|天氣=晴,溫度=適中))
=arg max(0.0857,0.0635)=取消
很顯然的,進行活動的機率為0.0635小於取消活動的機率0.0857,因此最終單純貝氏分類器會判定答案為取消活動。
最後,我們可以將上面算出的機率標準化得到真正的機率
P(取消) = 0.0857/(0.0857+0.0635)=0.5745
高斯貝氏分類器( GaussianNB)
在連續型變數的特徵中,我們可以藉由假設變數為常態分配的情況下,以樣本資料的平均數及標準差來計算機率,和單純貝氏分類器的差別就在於likelihood,其算式如下:
當樣本數數目夠多的時候,採用貝氏分類器是一個很棒的方法,因為從眾多樣本算出的機率不容易有偏差,可以有效避免過度擬和的問題,然而,貝氏分類器裡面,透過上述的計算過程,我們可以發現,當特徵數很多的時候,相乘之下所算出的機率值會非常小,造成最後出來的後驗機率非常趨近於0在程式運算上面容易因為儲存問題而造成偏誤,這時我們就可以透過取log的方式來避免這樣的問題。
接者我們就直接進入python 實作的部分
在程式中,likelihood我取了log
所以原本Gaussian distribution 的pdf從
變成
再來使用scikit-learn中的iris資料集來試跑一下(總共150筆資料,4個特徵,3個分類),切成訓練集100筆,跟測試集50筆。
最終出來的準確率:98%