《機器學習實戰》學習總結(四)——貝葉斯分類

摘要

1. 貝葉斯定理

2. 樸素貝葉斯分類

3. 半樸素貝葉斯分類

4. EM演算法

5. 代碼實現與注釋

貝葉斯定理

首先給出貝葉斯定理的公式:

我個人覺得,貝葉斯公式其實就是條件概率的推廣,每次想到貝葉斯公式,我就會在腦中冒出下面一幅圖:

我們假設P(A)=1/3, P(B)=1/3, P(A∩B)=1/6.

條件概率P(A|B)就是在B發生的情況下,A發生的概率,即:

也就是說,在B發生時,A有1/2的可能性會發生,我們看上面的圖,的確A∩B發生的可能性佔到了B全部可能性的一半。

將上面的公式與貝葉斯公式進行對比,我們發現:

而條件概率和貝葉斯公式其實就是上述公式的轉換。

樸素貝葉斯分類

那我們怎麼來利用貝葉斯定理來進行分類呢?

我們首先假設有N種可能的分類類別,分別為{c1,c2,c3...cN},這時候對於樣本x,我們利用貝葉斯定理:

我們需要找到最大的P(c|x)作為樣本x的最終分類,即:

其中P(c)表示訓練樣本空間中各類樣本所佔的比例;P(x|c)表示類別為c的條件下,樣本x的類條件概率;P(x)是用來歸一化的「證據因子」,對於給定樣本x,證據因子P(x)與類標記無關。

因此,估計P(c|x)的問題就轉化為如何基於訓練數據D來估計P(c)和P(x|c)。

P(c)很容易就可以得到,令Dc表示訓練集D中第c類樣本組成的集合,若有充足的獨立同分布樣本,則我們可以很容易估計出P(c)

不難發現,基於貝葉斯公式,主要是P(x|c)比較難以求解,我們一般估計類條件概率主要使用極大似然估計法,但因為這裡是所有屬性上的聯合概率,難以運用最大似然估計法直接估計得到。為了避開這個障礙,樸素貝葉斯分類器運用了「屬性條件獨立性假設」:對已知類別,假設所有屬性相互獨立。

基於上述假設,貝葉斯分類公式可以重寫為:

其中d為屬性的數目,xi為樣本x在第i個屬性上的取值。

由於對所有的類別來講,P(x)都相同,所以基於上式的貝葉斯判定準則為:

對於離散屬性而言,令Dc,xi表示在第i個屬性上取值為xi的樣本組成的集合,則類條件概率可以估計為:

給大家舉個例子:

上面是訓練樣本,對於給定x樣本={1,1,0},請問它是不是鳥?

首先我們估計先驗概率P(c),有:

這時候我們為每個屬性計算條件概率P(xi|c)

於是,有

由於0.177>0.05,因此樸素貝葉斯分類將其判定為「是鳥」。

平滑處理

我們注意到,上面的計算過程存在一個弊端,那就是,如果某個屬性值在訓練集中沒有與某個類同時出現過,則連乘時計算出的概率值為零。

為了讓大家理解,還是用上面的例子,我把表格稍微改一下,如下:

只對第四組數據做了一點改變,這時候我們計算測試例,有:

因此,無論該樣本的其他屬性是什麼,「不是鳥」的概率都為零,分類結果都將是「是鳥=是」,這顯然不合理。

為了避免上述弊端的出現,我們在計算概率值時要進行平滑處理,常用「拉普拉斯修正」:

其中,N表示訓練集D中可能出現的類別數,Ni表示第i個屬性可能的取值數。拉普拉斯修正避免了因訓練集樣本不充分而導致的概率值為零的問題。

半樸素貝葉斯分類

我們在樸素貝葉斯分類中採用了「屬性條件獨立性假設」,但是在現實中,這個假設往往很難成立。

所以,半樸素貝葉斯分類的基本思想是適當考慮一部分屬性間的依賴關係。

「獨依賴估計」是半樸素貝葉斯分類中常用的一種策略。所謂的「獨依賴」就是假設每個屬性在類別之外最多依賴與其中一個屬性,即

其中,pai是屬性xi所依賴的屬性,稱為xi的父屬性。

怎麼來確定屬性間的關係呢?一般有三種方法,分別是:SPODE、TAN、AODE.

我們這裡主要講一下TAN方法,另外兩種方法想要了解的同學可以參照周志華老師《機器學習》P155.

TAN方法中最重要的一個判斷標準就是兩個屬性間的條件互信息:

條件互信息刻畫了屬性xi和xj在已知類別下的相關性。我們需要找的,就是相關性大的屬性。

EM演算法

我們在現實中常常會遇到「不完整」的訓練樣本,在這種存在「未觀測」變數的情形下,我們如何對模型參數進行估計?即如何用極大似然估計法計算模型參數。本演算法與貝葉斯分類演算法關係不大,這裡我們僅對EM演算法作簡單介紹,想要詳細了解的同學可以自行查閱資料。

我們定義未觀測變數的學名是「隱變數」。令X表示已觀測變數集,Z表示隱變數集,theta表示模型參數。

EM演算法(參數最大化演算法)是常用的估計參數隱變數的利器

其主要思想只有兩步:

1. 第一步是期望(E)步,利用當前估計的參數值來計算對數似然的期望值

2. 第二步是最大化(M)步,尋找能使E步產生的似然期望最大化的參數值。然後,新得到的參數值重新被用於E步。

重複上述兩步,直到收斂到局部最優解。就可以得到模型的參數。

上面就是貝葉斯分類的全部原理部分。

代碼實現與注釋

1.詞表到向量的轉換函數

程序清單:

2. 樸素貝葉斯分類器訓練函數

程序清單:

3. 樸素貝葉斯分類函數

程序清單:

4. 文本解析及垃圾郵件測試函數:

程序清單:

至此,我們完成了貝葉斯分類器原理和主要代碼的學習。

下一節我們將進行Logistic回歸的學習。

聲明

最後,所有資料均本人自學整理所得,如有錯誤,歡迎指正,有什麼建議也歡迎交流,讓我們共同進步!轉載請註明作者與出處。

以上原理部分主要來自於《機器學習》—周志華,《統計學習方法》—李航,《機器學習實戰》—Peter Harrington。代碼部分主要來自於《機器學習實戰》,代碼用Python3實現,這是機器學習主流語言,本人也會儘力對代碼做出較為詳盡的注釋。


推薦閱讀:

怎樣用五十行Python代碼自造比特幣?
[23] Python模塊和引入
python中的時間處理大總結
用數據告訴你在上海你得這樣租(sheng)房(dian)子(qian)

TAG:机器学习 | Python | 深度学习DeepLearning |