樸素貝葉斯筆記

貝葉斯公式

貝葉斯公式就是採用貝葉斯準則來計算條件概率,它告訴我們計算時交換條件概率中的條件與結果:
P(YX)=P(XY)P(Y)P(X)P(Y|X)=\frac{P(X|Y)P(Y)}{P(X)}
P(YX)P(Y|X) 不能通過直接觀測來得到結果,而P(XY)P(X|Y) 卻容易通過直接觀測得到結果,就可以通過貝葉斯公式從間接地觀測對象去推斷不可直接觀測的對象的情況。

而貝葉斯公式又是根據聯合概率公式推導而來的:
P(Y,X)=P(X)P(YX)=P(Y)P(XY)P(Y,X)=P(X)P(Y|X)=P(Y)P(X|Y)
其中P(YX)P(Y|X)叫後驗概率,也就是我們想得到的,P(Y)P(Y)叫先驗概率,是可以事先依據統計計算出的,P(Y,X)P(Y,X)叫聯合概率
即聯合概率鏈規則(chain rule):每個元素出現的概率都與它之前的元素有關聯
P(x1,x2,x3,x4,x5,,xn)=P(x1)P(x2x1)P(x3x1,x2)...P(xnx1,x2,...,xn1)P(x_1,x_2,x_3,x_4,x_5,…,x_n)=P(x_1)P(x_2|x_1)P(x_3|x_1,x_2)...P(x_n|x_1,x_2,...,x_{n-1})

用機器學習的視角理解貝葉斯公式

在機器學習的視角下,我們把 X 理解成具有某特徵的向量,把 Y 理解成類別標籤。在最簡單的二分類問題(是與否判定)下,我們將 Y 理解成屬於某類的標籤。於是貝葉斯公式就變形成了下面的樣子:
P()=P()P()P()P(“屬於某類”|“具有某特徵”)=\frac{P(“具有某特徵”|“屬於某類”)P(“屬於某類”)}{P(“具有某特徵”)}
貝葉斯方法把計算“具有某特徵的條件下屬於某類”的概率轉換成需要計算“屬於某類的條件下具有某特徵”的概率,而後者獲取方法就簡單多了,我們只需要找到一些包含已知特徵標籤的樣本,即可進行訓練。而樣本的類別標籤都是明確的,所以貝葉斯方法在機器學習裏屬於有監督學習方法。

這裏再補充一下,一般"先驗概率"、"後驗概率"是相對出現的,比如 P(Y) 與 P(Y|X) 是關於 Y 的先驗概率與後驗概率, P(X) 與 P(X|Y) 是關於 X 的先驗概率與後驗概率。

舉個例子,以垃圾郵件識別爲例,假設我們有垃圾郵件和正常郵件各1萬封作爲訓練集。需要判斷以下這個郵件是否屬於垃圾郵件:

“我司可辦理正規發票(保真)17%增值稅發票點數優惠!”

也就是判斷概率 P(“垃圾郵件”|“我司可辦理正規發票(保真)17%增值稅發票點數優惠!”) 是否大於1/2。直觀來看,要計算此概率就是統計出正常郵件和垃圾郵件中出現這句話的次數,具體如下:
P(17%)P(“垃圾郵件”|“我司可辦理正規發票(保真)17\%增值稅發票點數優惠!”)
=+ =\frac{垃圾郵件中出現這句話的次數}{垃圾郵件中出現這句話的次數+正常郵件中出現這句話的次數}

但這麼做並不可取,因爲訓練集是有限的,而句子的可能性則是無限的。所以覆蓋所有句子可能性的訓練集是不存在的。假設要對一個新句子進行歸類預測,而這個新句子從未在訓練集出現過,那豈不就是無法對其進行分類判斷。

於是,我們可以不拿句子作爲特徵,而是拿句子裏面的詞語(組合)作爲特徵去考慮。比如“正規發票”可以作爲一個單獨的詞語,“增值稅”也可以作爲一個單獨的詞語等等。

句子“我司可辦理正規發票,17%增值稅發票點數優惠!”就可以變成
(“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”))。

我們觀察(“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”),這可以理解成一個向量:向量的每一維度都表示着該特徵詞在文本中的特定位置存在。

因此貝葉斯公式就變成了:
P(,,,,,,,,,)P(“垃圾郵件”|(“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”))
=P(,,,,,,,,,)""P()P(,,,,,,,,,))=\frac{P((“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”)|"垃圾郵件")P(“垃圾郵件”)}{P((“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”)) }
P(,,,,,,,,,)P(“正常郵件”|(“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”))
=P(,,,,,,,,,)""P()P(,,,,,,,,,))=\frac{P((“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”)|"正常郵件")P(“正常郵件”)}{P((“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”)) }

條件獨立假設

以下引入一個粗暴的假設

概率 P((“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”)|“垃圾郵件”) 依舊不夠好求,我們引進一個很樸素的近似。爲了讓公式顯得更加緊湊,我們令字母S表示“垃圾郵件”,令字母H表示“正常郵件”。近似公式如下:
P(,,,,,,,,,)SP((“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”)|S)
=P(S×P(S×P(S×P(S×P(S=P(“我”|S)×P(“司”|S)×P(“可”|S)×P(“辦理”|S)×P(“正規發票”|S)
×P(S×P(S×P(S×P(S×P(S)×P(“保真”|S)×P(“增值稅”|S)×P(“發票”|S)×P(“點數”|S)×P(“優惠”|S)

上述公式就是假設每個特徵詞在特定類別下的出現,相互之間是獨立不相關的,這就是條件獨立假設

於是我們就只需要比較以下兩個式子的大小來作出分類判斷:
C=P(S)P(S)P(S)P(S)P(S)C = P(“我”|S)P(“司”|S)P(“可”|S)P(“辦理”|S)P(“正規發票”|S)
×P(S)P(S)P(S)P(S)P(S)P()×P(“保真”|S)P(“增值稅”|S)P(“發票”|S)P(“點數”|S)P(“優惠”|S)P(“垃圾郵件”)

C=P(H)P(H)P(H)P(H)P(H)\overline{C}=P(“我”|H)P(“司”|H)P(“可”|H)P(“辦理”|H)P(“正規發票”|H)
×P(H)P(H)P(H)P(H)P(H)P()×P(“保真”|H)P(“增值稅”|H)P(“發票”|H)P(“點數”|H)P(“優惠”|H)P(“正常郵件”)

這樣處理後式子中的每一項都特別好求!只需要分別統計各類郵件中該關鍵詞出現的概率就可以了,如:
P(S=P(“發票”|S)=\frac{垃圾郵件中所有“發票”的次數}{垃圾郵件中所有詞語的次數}

統計次數非常方便,而且樣本數量足夠大,算出來的概率比較接近真實。於是垃圾郵件識別的問題就可解了。

樸素貝葉斯(Naive Bayes)究竟“樸素”在何處?

加上條件獨立假設的貝葉斯方法就是樸素貝葉斯方法(Naive Bayes)。將句子(“我”,“司”,“可”,“辦理”,“正規發票”) 中的 (“我”,“司”)與(“正規發票”)調換一下順序,就變成了一個新的句子(“正規發票”,“可”,“辦理”, “我”, “司”)。新句子與舊句子的意思完全不同。但由於乘法交換律,樸素貝葉斯方法中算出來二者的條件概率完全一樣!計算過程如下:
P(,,,,S)=P(S)P(S)P(S)P(S)P(S)=P(S)P(S)P(S)P(S)P(S=P(,,,,S)P((“我”,“司”,“可”,“辦理”,“正規發票”)|S)\\=P(“我”|S)P(“司”|S)P(“可”|S)P(“辦理”|S)P(“正規發票”|S) \\=P(“正規發票”|S)P(“可”|S)P(“辦理”|S)P(“我”|S)P(“司”|S)\\=P((“正規發票”,“可”,“辦理”, “我”, “司”)|S)

也就是說,在樸素貝葉斯眼裏,“我司可辦理正規發票”與“正規發票可辦理我司”完全相同。樸素貝葉斯失去了詞語之間的順序信息。這就相當於把所有的詞彙扔進到一個袋子裏隨便攪和,貝葉斯都認爲它們一樣。因此這種情況也稱作詞袋子模型(bag of words)

處理重複詞語的方式

我們之前的垃圾郵件向量(“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”),其中每個詞都不重複。而這在現實中其實很少見。因爲如果文本長度增加,或者分詞方法改變,必然會有許多詞重複出現,因此需要對這種情況進行進一步探討。比如以下這段郵件:

“代開發票。增值稅發票,正規發票。” 分詞後爲向量: (“代開”,“發票”,“增值稅”,“發票”,“正規”,“發票”)

其中“發票”重複出現了三次。

多項式模型

如果我們考慮重複詞語的情況,也就是說,重複的詞語我們視爲其出現多次,直接按條件獨立假設的方式推導,則有
P(,,,,,)S=P(S)P(S)P(S)P(S)P(S)P(S=P(S)P3(S)P(S)P(S)P((“代開”,“發票”,“增值稅”,“發票”,“正規”,“發票”)|S\\=P(“代開””|S)P(“發票”|S)P(“增值稅”|S)P(“發票”|S)P(“正規”|S)P(“發票”|S)\\=P(“代開””|S)P^3(“發票”|S)P(“增值稅”|S)P(“正規”|S)注意這一項:P3(SP^3(“發票”|S)

在統計計算P(“發票”|S)時,每個被統計的垃圾郵件樣本中重複的詞語也統計多次。
P(S=P(“發票”|S)=\frac{每封垃圾郵件中出現“發票”的次數的總和}{每封垃圾郵件中所有詞出現次數(計算重複次數)的總和}

這個多次出現的結果,出現在概率的指數/次方上,因此這樣的模型叫作多項式模型

伯努利模型

另一種更加簡化的方法是將重複的詞語都視爲其只出現1次
P(,,,,,S)=P(S)P(S)P(S)P(SP((“代開”,“發票”,“增值稅”,“發票”,“正規”,“發票”)|S)\\=P(“發票”|S)P(“代開””|S)P(“增值稅”|S)P(“正規”|S)
統計計算P(SP(“詞語”|S)時也是如此。
P(S=P(“發票”|S)=\frac{出現“發票”的垃圾郵件的封數}{每封垃圾郵件中所有詞出現次數(出現了只計算一次)的總和}

這樣的模型叫作伯努利模型(又稱爲二項獨立模型)。這種方式更加簡化與方便。當然它丟失了詞頻的信息,因此效果可能會差一些。

淺談平滑技術

我們來說個問題,比如在預測以下獨立條件假設的概率:
P(,,,,S)P((“我”,“司”,“可”,“辦理”,“正規發票”)|S)
=P(S)P(S)P(S)P(S)P(S)=P(“我”|S)P(“司”|S)P(“可”|S)P(“辦理”|S)P(“正規發票”|S)

我們掃描一下訓練集,發現“正規發票”這個詞從出現過!於是 P(“正規發票”|S)=0 …問題嚴重了,整個概率都變成0了!樸素貝葉斯方法面對一堆0,很悽慘地失效了…更殘酷的是這種情況其實很常見,因爲哪怕訓練集再大,也可能有覆蓋不到用來測試的句子中的詞語。

爲了解決這樣的問題,一種分析思路就是直接不考慮這樣的詞語,但這種方法就相當於默認給P(“正規發票”|S)賦值爲1。其實效果不太好,大量的統計信息給浪費掉了。我們進一步分析,既然可以默認賦值爲1,爲什麼不能默認賦值爲一個很小的數?這就是平滑技術的基本思路,依舊保持着一貫的作風,樸實/土但是直接而有效。

對於伯努利模型,P(“正規發票”|S)的一種平滑算法是:
P(S=+1+2P(“正規發票”|S)=\frac{出現“正規發票”的垃圾郵件的封數+1}{每封垃圾郵件中所有詞出現次數(出現了只計算一次)的總和+2}

對於多項式模型,P(“正規發票”| S)的一種平滑算法是:
P(S=+1+P(“正規發票”|S)=\frac{每封垃圾郵件中出現“正規發票”的次數的總和+1}{每封垃圾郵件中所有詞出現次數(計算重複次數)的總和+被統計的詞表的詞語數量}

平滑技術都是給未出現在訓練集中的詞語一個估計的概率,而相應地調低其他已經出現的詞語的概率。平滑技術是因爲數據集太小而產生的現實需求。如果數據集足夠大,平滑技術對結果的影響將會變小。

實際工程的技巧

取對數

我們提到用來識別垃圾郵件的方法是比較以下兩個概率的大小(字母S表示“垃圾郵件”,字母H表示“正常郵件”):
C=P(S)P(S)P(S)P(S)P(S)×P(S)P(S)P(S)P(S)P(S)P()C = P(“我”|S)P(“司”|S)P(“可”|S)P(“辦理”|S)P(“正規發票”|S)\\ ×P(“保真”|S)P(“增值稅”|S)P(“發票”|S)P(“點數”|S)P(“優惠”|S)P(“垃圾郵件”)

C=P(H)P(H)P(H)P(H)P(H)×P(H)P(H)P(H)P(H)P(H)P()\overline{C}=P(“我”|H)P(“司”|H)P(“可”|H)P(“辦理”|H)P(“正規發票”|H)\\ ×P(“保真”|H)P(“增值稅”|H)P(“發票”|H)P(“點數”|H)P(“優惠”|H)P(“正常郵件”)

但這裏進行了很多乘法運算,計算的時間開銷比較大,而且程序會下溢出或者得到不正確的答案(用 Python 嘗試相乘許多很小的數,最後四捨五入後會得到 0),尤其是對於篇幅比較長的郵件。如果能把這些乘法變成加法則方便得多。剛好數學中的對數函數log就可以實現這樣的功能。兩邊同時取對數(本文統一取底數爲2),則上面的公式變爲:
logC=logP(S)+logP(S)+logP(S)+logP(S)+logP(S)+logP(S)+logP(S)+logP(S)+logP(S)+logP(S)+logP()log{C} = log{P(“我”|S)}+log{P(“司”|S)}+log{P(“可”|S)}+log{P(“辦理”|S)}+log{P(“正規發票”|S)}\\+log{P(“保真”|S)}+log{P(“增值稅”|S)}+log{P(“發票”|S)}+log{P(“點數”|S)}+log{P(“優惠”|S)}+log{P(“垃圾郵件”)}


logC=logP(H)+logP(H)+logP(H)+logP(H)+logP(H)+logP(H)+logP(H)+logP(H)+logP(H)+logP(H)+logP()log{\overline{C}}=log{P(“我”|H)}+log{P(“司”|H)}+log{P(“可”|H)}+log{P(“辦理”|H)}+log{P(“正規發票”|H)}\\+log{P(“保真”|H)}+log{P(“增值稅”|H)}+log{P(“發票”|H)}+log{P(“點數”|H)}+log{P(“優惠”|H)}+log{P(“正常郵件”)}

雖然做對數運算也會花時間,但這樣處理後,在訓練階段直接計算各個詞的類別條件概率logPlog{P},然後把他們存在一張大的hash表裏。在測試階段對一個新句子作預測判斷的時候,具體是判斷各個特徵詞xi在不在標籤yi對應的單詞條件概率字典裏,在的話就直接提取hash表中已經計算好的對數概率值,不在的話就用默認概率值(平滑技術),然後相加即可。這樣使得判斷所需要的計算時間被轉移到了訓練階段,實際預測運行的時候速度就比之前快得多,這可不止幾個數量級的提升。

貝葉斯方法的思維方式

再看一眼貝葉斯公式:
P(YX)=P(XY)P(Y)P(X)P(Y|X)=\frac{P(X|Y)P(Y)}{P(X)}
先不考慮先驗概率P(Y)P(X)P(Y)與P(X),觀察兩個後驗概率P(YX)P(XY)P(Y|X)與P(X|Y),可見貝葉斯公式能夠揭示兩個相反方向的條件概率之間的轉換關係。

P(YX)P(Y|X) 不能通過直接觀測來得到結果,而P(XY)P(X|Y) 卻容易通過直接觀測得到結果,就可以通過貝葉斯公式從間接地觀測對象去推斷不可直接觀測的對象的情況

以垃圾郵件識別爲例,基於郵件的文本內容判斷其屬於垃圾郵件的概率不好求(不可通過直接觀測、統計得到),但是基於已經蒐集好的垃圾郵件樣本,去統計(直接觀測)其文本內部各個詞語的概率卻非常方便。這就可以用貝葉斯方法。

引申一步,基於樣本特徵去判斷其所屬標籤的概率不好求,但是基於已經蒐集好的打上標籤的樣本(有監督),卻可以直接統計屬於同一標籤的樣本內部各個特徵的概率分佈。因此貝葉斯方法的理論視角適用於一切分類問題的求解。

總結

我們找了個最簡單常見的例子:垃圾郵件識別,說明了一下樸素貝葉斯進行文本分類的思路過程。基本思路是先區分好訓練集與測試集,對文本集合進行分詞、去除標點符號等特徵預處理的操作,然後使用條件獨立假設,將原概率轉換成詞概率乘積,再進行後續的處理。

貝葉斯公式 + 條件獨立假設 = 樸素貝葉斯方法

基於對重複詞語在訓練階段的處理,我們相應的有伯努利模型和多項式模型。在測試階段,如果訓練樣本集合太小導致新句子的某些詞語並未出現在詞表中,我們可以採用平滑技術對其概率給一個估計值,當然前提在訓練階段對各個特徵詞的條件概率的計算也要採取平滑計算公式。



參考: https://blog.csdn.net/han_xiaoyang/article/details/50616559

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章