1. 程式人生 > >機器學習--樸素貝葉斯分類,以及拉普拉斯校準

機器學習--樸素貝葉斯分類,以及拉普拉斯校準

機器學習算法 我們 earch lov 單詞 標註 樸素貝葉斯分類 images 劃分

原文鏈接:
http://chant00.com/2017/09/18/%E8%B4%9D%E5%8F%B6%E6%96%AF/

https://zhuanlan.zhihu.com/p/26329951

https://zhuanlan.zhihu.com/p/27906640

很傻很天真卻很很好很強大的貝葉斯定理。。。


機器學習算法中,有種依據概率原則進行分類的樸素貝葉斯算 法,正如氣象學家預測天氣一樣,樸素貝葉斯算法就是應用先 前事件的有關數據來估計未來事件發生的概率

基於樸素貝葉斯的垃圾郵件分類

BoW(詞袋)模型

Bag-of-words model (BoW model) 最早出現在自然語言處理(Natural Language Processing)和信息檢索(Information Retrieval)領域.。該模型忽略掉文本的語法和語序等要素,將其僅僅看作是若幹個詞匯的集合,文檔中每個單詞的出現都是獨立的。BoW使用一組無序的單詞(words)來表達一段文字或一個文檔。

假設我們詞庫中只有四個單詞I,don’t,love,you,分別用符號w1,w2,w3,w4意義對應表示,那麽一封郵件就可以由這四個單詞是否出現來表示,如:$w1\bigcap \neg w2 \bigcap w2 \bigcap w3$就表示文檔I love you

,而$w1\bigcap w2 \bigcap w2 \bigcap w3$就表示文檔I don‘t love you
技術分享
我們將單詞出現的頻率視為它出現的概率,如下圖則P(Viagra)=5%。
如果我們知道P(垃圾郵件)和P(Viagra)是相互獨立的, 則容易計算P(垃圾郵件&Viagra),即這兩個事件同時發生 的概率。20%*5%=1%

獨立事件我們可以簡單的應用這個方法計算,但是在現實中, P(垃圾郵件)和P(Viagra)更可能是高度相關的,因此上述計算是不正確的,我們需要一個精確的公式來描述這兩個事件之間的關系。

貝葉斯公式

技術分享

垃圾郵件中的樸素貝葉斯公式

P(spam)為先驗概率,P(spam|Viagra)為在Viagra單詞出現後的後驗概率。如果你不懂什麽是先驗概率和後驗概率,請戳那些年被教科書繞暈的概率論基礎
技術分享


計算貝葉斯定理中每一個組成部分的概率,我們必須構造一個頻率表
技術分享

計算貝葉斯公式

P(垃圾郵件|Viagra)=P(Viagra|垃圾郵件)*P(垃圾郵件)/P(Viagra)=(4/20)*(20/100)/(5/100)=0.8
因此,如果電子郵件含有單詞Viagra,那麽該電子郵件是垃圾 郵件的概率為80%。所以,任何含有單詞Viagra的消息都需 要被過濾掉。
當有額外更多的特征是,這一概念如何被使用呢?
技術分享
利用貝葉斯公式,我們得到概率如下:
技術分享
雖然我們寫作時,相鄰單詞之間其實是有關聯的,但是為了方便建立模型,我們假設單詞的出現是相互獨立,這也是Naive Bayes的Naive之處,很傻很天真,但是在實際應用中卻發現其效果很好很強大。由於相互獨立,那麽就可以轉化為接下來的公式:
技術分享
? 分母可以先忽略它,垃圾郵件的總似然為:
(4/20)*(10/20)*(20/20)*(12/20)*(20/100)=0.012
? 非垃圾郵件的總似然為:
(1/80)*(66/80)*(71/80)*(23/80)*(80/100)=0.002
? 將這些值轉換成概率,我們只需要一步得到垃圾郵件概率為 0.012/(0.012+0.002)=85.7%

存在的問題

另一個例子包含了4個單詞的郵件呢?
? 我們可以計算垃圾郵件的似然如下:
(4/20)*(10/20)*(0/20)*(12/20)*(20/100)=0
? 非垃圾郵件的似然為:
(1/80)*(14/80)*(8/80)*(23/80)*(80/100)=0.00005
? 因此該消息是垃圾郵件的概率為0/(0+0.00005)=0
? 該消息是非垃圾郵件的概率為0.00005/(0+0.00005)=1
? 問題出在Groceries這個單詞,所有單詞Grogeries有效抵消或否決了所有其他的證據。

拉普拉斯估計

而這個錯誤的造成是由於訓練量不足,會令分類器質量大大降低。為了解決這個問題,我們引入Laplace校準(這就引出了我們的拉普拉斯平滑),它的思想非常簡單,就是對沒類別下所有劃分的計數加1,這樣如果訓練樣本集數量充分大時,並不會對結果產生影響,並且解決了上述頻率為0的尷尬局面。

引入拉普拉斯平滑的公式如下:

技術分享

技術分享

其中ajl,代表第j個特征的第l個選擇,技術分享代表第j個特征的個數,K代表種類的個數。

技術分享為1,這也很好理解,加入拉普拉斯平滑之後,避免了出現概率為0的情況,又保證了每個值都在0到1的範圍內,又保證了最終和為1的概率性質!

本文的情況是,由於詞袋裏一共是4個詞,因此Sj = 4. 由於最終結果有兩個分類,因此K = 2.

理解:

拉普拉斯估計本質上是給頻率表中的每個計數加上一個較小的數,這樣就保證了每一類中每個特征發生概率非零。
通常情況下,拉普拉斯估計中加上的數值設定為1,這樣就保證每一類特征的組合至少在數據中出現一次
? 然後,我們得到垃圾郵件的似然為:
(5/24)*(11/24)*(1/24)*(13/24)*(20/100)=0.0004
? 非垃圾郵件的似然為:
(2/84)*(15/84)*(9/84)*(24/84)*(80/100)=0.0001
? 這表明該消息是垃圾郵件的概率為80%,是非垃圾郵件的概率為20%。

開發時應註意的問題:

註意這裏對於基本的條件概率直接相乘有兩處改進:

  1. 拉普拉斯平滑:各個特征的概率初始值為1,分母上統計的某一類型的樣本總數的初始值是1,這是為了避免如果有一個特征統計的概率為0,則聯合概率也為零那自然沒有什麽意義了, 如果訓練樣本足夠大時,並不會對比較結果產生影響.
  2. 概率轉為對數:由於各個獨立特征的概率都是小於1的數,累積起來必然會是個更小的書,這會遇到浮點數下溢的問題,因此在這裏我們對所有的概率都取了對數處理,這樣在保證不會有損失的情況下避免了下溢的問題。
應用舉例:

例如:https://zhuanlan.zhihu.com/p/26329951

技術分享

四個特征集合分別長相{帥,不帥}、性格{爆好,好,不好}、身高{高,中,矮}、上進與否{上進,不上進}

由於樣本不足,因此性格為“爆好”的樣本為0.

如果比較p(嫁|長相帥,性格爆好,身高高,上進)與p(不嫁|長相帥,性格爆好,身高高,上進)的概率大小,按照貝葉斯定理

技術分享

沒有一個數據有爆好這個特點的,那麽p(性格爆好|嫁) = 0,我們最後的p(嫁|長相帥、性格爆好、身高高、上進)由於一項p(性格爆好|嫁)為0,而造成整個概率為0,這顯然是錯誤的。

現在我們是加入拉普拉斯平滑,

我們先需要分別計算p(性格爆好|嫁)、p(長相帥|嫁)、p(身高高|嫁)、p(上進|嫁),p(嫁),p(性格爆好|嫁)=?統計滿足要求的如下面紅色部分

技術分享

沒有一個滿足是性格爆好的條件,但是此時概率不為0,按照加入拉普拉斯平滑後的公式:

性格特征的個數為爆好,好,不好,三種情況,那麽技術分享為3,則最終概率為1/9 (嫁的個數為6+特征個數為3)

p(長相帥|嫁)=?統計滿足條件的如下面紅色部分:

技術分享

由上圖可知滿足要求的為3個,按照加入拉普拉斯平滑後的公式:

長相特征的個數為帥,不帥,倆種情況,那麽技術分享為2,則最終概率p(長相帥|嫁)為4/8 (嫁的個數為6+特征個數為2)

p(身高高|嫁) = ?統計滿足條件的如下面紅色部分:

技術分享

由上圖可知滿足要求的為3個,按照加入拉普拉斯平滑後的公式:

身高特征的個數為高,中,矮情況,那麽技術分享為3,則最終概率p(身高高|嫁)為4/9 (嫁的個數為6+特征個數為3)

p(上進|嫁)=?統計滿足要求的如下面紅色部分:

技術分享

由上圖可知滿足要求的為5個,按照加入拉普拉斯平滑後的公式:

上進特征的個數為上進,不上進情況,那麽技術分享為2,則最終概率p(上進|嫁)為6/8 (嫁的個數為6+特征個數為2)

p(嫁) = ?滿足要求的如下紅色標註:

技術分享

由上圖可知滿足要求的為6個,按照加入拉普拉斯平滑後的公式:

種類的個數為嫁,不嫁情況,那麽K為2,則最終概率p(嫁)為7/14 = 1/2 (嫁的個數為6+種類個數為2)

到這裏為止,我們已經算出了在該男生條件下,嫁的概率為:

p(嫁|長相帥、性格爆好、身高高、上進) = 1/9*4/8*4/9*6/8*1/2

p(不嫁|長相帥、性格爆好、身高高、上進) 同理。見原文https://zhuanlan.zhihu.com/p/26329951。

機器學習--樸素貝葉斯分類,以及拉普拉斯校準