單純貝氏分類(Naive bayes classifier)是基於貝氏定理,那麼,貝氏定理又是什麼呢?若不小心迷失在P(A|B)、P(A)等公式的符號中,不妨從生活實例開始理解,進一步地抽取現象的特徵作為計算,就可以應用單純貝氏分類。

貝氏定理與疾病檢驗

在機器學習的領域中,單純貝氏分類是諸多分類方法中的一個,它從貝氏定理P(A|B)=P(B|A)*P(A)/P(B)出發,其中P(A)、P(B)各代表A、B事件發生的機率,P(A|B)代表在觀察到B事件時,又觀察到A事件的機率,P(B|A)代表在觀察到A事件時,又觀察到B事件的機率。

對許多人來說,機率本身就是個難以捉摸的概念,用符號來認識貝氏定理,就更難以想像其意義了。我們可以從另一個角度來認識,抽菸且得肺癌的機率可以寫為P(肺癌|抽菸),得肺癌而且有抽菸的機率可以寫為P(抽菸|肺癌),貝氏定理告訴我們,P(肺癌|抽菸)與P(抽菸|肺癌)有正相關,從直覺上來想也是如此,抽菸容易得肺癌,相對地也表示,得肺癌的人很可能有抽菸。

但是,過多的直覺有時不代表事實,例如,若有個試劑可以檢驗某個疾病,試劑會有真陽(得病者被驗為陽性)、真陰(未得病者被驗為陰性)、偽陽(未得病者被驗為陽性)、偽陰(得病者被驗為陰性),若某檢驗後各自人數分別記為TP、TN、FP、FN,我們可以使用召回率(Recall)作為評估試劑的指標之一,計算方式為TP/(TP+FN)。

這裡所謂的召回率,簡單來說,就是得病且被試劑驗出陽性的機率,可以記為P(陽性|得病),單純依賴直覺的話,若P(陽性|得病)很高,例如高達百分之99,想必P(得病|陽性)也很高吧!也就是檢驗出陽性的人,十之八九就一定有病嗎?畢竟根據貝氏定理,「P(得病|陽性)=P(陽性|得病)*P(得病)/P(陽性)」嘛!

P(陽性|得病)與P(得病|陽性)確實是有正相關,不過別忘了P(得病)與P(陽性),P(得病)是總人口中得到該病的機率,可以從既有的資料中計算,假設計算後是百分之0.1,P(陽性)是被試劑檢驗為陽性的機率,也就是真陽性機率與真陰性機率的和,若計算後得到為0.022,依貝氏定理,P(得病|陽性)=0.99*0.001/0.022=0.045。

雖然,得病被試劑驗出陽性的機率高達百分之99,然而,在試劑檢驗為陽性的情況下,該人真正得病的機率卻只有百分之4.5,這還滿違反許多人的直覺,原因在於P(得病)只有百分之0.2,P(得病)就是俗稱的疫病盛行率,也就是說,在疫病盛行率不高的情況下,透過試劑檢驗來抓出真正的得病者在機率上並不高。

簡單的垃圾郵件分類

那麼,貝氏定理又跟機器學習有什麼關係了?

P(A|B)=P(B|A)*P(A)/P(B)這個公式,等號右邊其實代表著事前已經得知的各種機率,就像上述的例子,陽性、得病等各種機率,我們可以從既有的資料中計算;而貝氏定理等號的左邊,可以代表針對新資料預測的機率,例如在試劑檢驗為陽性的情況下,真正有得病的機率,也就是說,可以從既有資料中生成機率模型,從而預測某條件機率,

現在來換個例子,如果你的信箱從不篩選垃圾郵件,從收過的郵件中選出一封,郵件中包含「優惠」字眼的機率是P(優惠),而任選出的郵件是垃圾郵件的機率若是P(垃圾),是垃圾郵件且包含「優惠」字眼的條件機率是P(優惠|垃圾),現在若收到了一封新郵件,其中包含了「優惠」字眼,那麼,它是垃圾郵件的機率有多高呢?

當我們已經知道貝氏定理,此時,就可以用「P(優惠|垃圾)*P(垃圾)/P(優惠)」來計算,在進一步以實際數字說明前,我們可以再認識一個公式P(B)=P(B|A)*P(A)+P(B|not-A)*P(not-A),其中not-A表示未發生A事件,如果A事件發生的機率是0.5,那麼P(A)就等於P(not-A)。

這時,貝氏定理P(A|B)=P(B|A)*P(A)/P(B)的等號右邊,就可以寫為P(B|A)*P(A)/(P(B|A)*P(A)+P(B|not-A)*P(not-A)),將相同的P(A)、P(not-A)抵消,最後就得到P(B|A)/(P(B|A)+P(B|not-A))。

也就是說,在假設任選出的郵件為機率是0.5的情況下,若P(優惠|垃圾)是0.6,P(優惠|not-垃圾)是0.1,那麼,包含了「優惠」字眼又是垃圾郵件的機率,就可以用「P(優惠|垃圾)/(P(優惠|垃圾)+P(優惠|not-垃圾))」來計算,也就是0.6/(0.6+0.1)=0.85,看來包含「優惠」字眼的話,滿有可能是垃圾郵件!

單純貝氏分類

當然,一封信件裡,實際上,可作為識別垃圾郵件的字眼不會只有一個,常用且簡單的文件特徵抽取方式之一是詞袋(bag-of-words)模型,例如,若字眼清單為「優惠、降價、限時、打折、好禮、領取、免費、好康」,對於一封郵件,基本的特徵向量可以用有或沒有出現字眼來表示,例如,特徵向量[1,0,1,1,0,1,0,0]表示信中同時出現了「優惠、限時、打折、領取」字眼。

若以xi表示特徵向量的第i個分量,信中同時出現「優惠、限時、打折、領取」字眼的機率,可以表示為P(x1=1,x2=0,x3=1,...x8=0|垃圾)。為了單純化,假設字眼清單中每個字眼的出現都是獨立事件,也就是出現某字眼與否,與其他字眼出現與否無關,對於獨立事件,P(x1=1,x2=0,x3=1,...x8=0|垃圾)等於P(x1=1|垃圾)*P(x2=0|垃圾)*...*P(x8=0|垃圾)。

也就是說,若X=[1,0,1,1,0,1,0,0],「P(X|垃圾)/(P(X|垃圾)+P(X|not-垃圾))」就表示同時出現「優惠、限時、打折、領取」字眼的情況下,是垃圾郵件的機率,若假設字眼的出現是獨立事件,其中P(X|垃圾)、P(X|not-垃圾)的部份,都可以用垃圾郵件中個別字眼出現機率,以相乘的方式來計算,再根據得到的機率判定是不是垃圾郵件,這就是單純貝氏分類的基本原理。

實際上,字眼出現與否,彼此間還是會有些關聯,然而,單純貝氏分類假設它們是獨立事件,這就是其單純、天真之處,就方才談到的基本原理來說,單純貝氏分類實作簡單且執行快速,雖然有獨立事件的非現實假設,但是,單純貝氏分類通常還是有不錯的表現,特別是對於資料量不大的情況,這邊使用垃圾郵件判定為例,正是因為現實中也會使用單純貝氏分類,來作為垃圾郵件篩選器。

方才例子,字眼的特徵不是連續的,且未討論個別特徵分布的狀況,針對不同特徵與分布,有多項式單純貝氏、高斯單純貝氏、白努利單純貝氏等方法,像sklearn程式庫,就分別提供MultinomialNB、GaussianNB、BernoulliNB等實作,例如,人的身高、體重等具有高斯分布的連續型資料,或許可以採用高斯單純貝氏來處理分類的任務。

試著從生活實例中理解

在面對機率方面的問題或方法時,單看公式經常不易理解,其實生活中就有許多實例可循。例如,下雨通常伴隨著黑雲,這是屬於條件機率,只不過生活實例有時過於依賴直覺而不精確罷了,例如,如果看到黑雲,下雨的機會就高嗎?

這時可試想,這地區或季節下雨的機會是多少?出現黑雲的機會又是多少?試著多想幾個這類例子,就不難理解貝氏定理,而這些理解過程可以進一步擴展,將一些現象的特徵抽取出來作為計算基礎,就可以應用單純貝氏分類來做點分析了。

作者簡介


熱門新聞

Advertisement