[機器學習] 分類 --- Naive Bayes(樸素貝葉斯) 樸素貝葉斯理論推導與三種常見模型

Naive Bayes-樸素貝葉斯

Bayes’ theorem(貝葉斯法則)

在概率論和統計學中,Bayes’ theorem(貝葉斯法則)根據事件的先驗知識描述事件的概率。貝葉斯法則表達式如下所示

  • P(A|B) – 在事件B下事件A發生的條件概率
  • P(B|A) – 在事件A下事件B發生的條件概率
  • P(A), P(B) – 獨立事件A和獨立事件B的邊緣概率

順便提一下,上式中的分母P(B)可以根據全概率公式分解爲:


Bayesian inferenc(貝葉斯推斷)

貝葉斯定理的許多應用之一就是貝葉斯推斷,一種特殊的統計推斷方法,隨着信息增加,貝葉斯定理可以用於更新假設的概率。在決策理論中,貝葉斯推斷與主觀概率密切相關,通常被稱爲“Bayesian probability(貝葉斯概率)”。

貝葉斯推斷根據 prior probability(先驗概率) 和統計模型導出的“likelihood function(似然函數)”的結果,再由貝葉斯定理計算 posterior probability(後驗概率):


  • P(H) – 已知的先驗概率
  • P(H|E) – 我們想求的後驗概率,即在B事件發生後對於事件A概率的評估
  • P(E|H) – 在事件H下觀測到E的概率
  • P(E) – marginal likelihood(邊際似然),對於所有的假設都是相同的,因此不參與決定不同假設的相對概率
  • P(E|H)/P(E) – likelihood function(可能性函數),這是一個調整因子,通過不斷的獲取信息,可以使得預估概率更接近真實概率

貝葉斯推斷例子

假設我們有兩個裝滿了餅乾的碗,第一個碗裏有10個巧克力餅乾和30個普通餅乾,第二個碗裏兩種餅乾都有20個。我們隨機挑一個碗,再在碗裏隨機挑餅乾。那麼我們挑到的普通餅乾來自一號碗的概率有多少?

我們用 H1 代表一號碗,H2 代表二號碗,而且 P(H1) = P(H2) = 0.5。事件 E 代表普通餅乾。由上面可以得到 P(E|H1) = 30 / 40 = 0.75,P(E|H2) = 20 / 40 = 0.5。由貝葉斯定理我們得到


  • P(E|H1)P(H1), P(E|H2)P(H2) – 分別表示拿到來自一號碗的普通餅乾、來自二號碗的普通餅乾的概率
  • P(E|H1)P(H1) + P(E|H2)P(H2) – 表示拿到普通餅乾的概率

在我們拿到餅乾前,我們會選到一號碗的概率是先驗概率 P(H1),在拿到了餅乾後,我們要得到是後驗概率 P(H1|E)

特徵條件獨立假設

這一部分開始樸素貝葉斯的理論推導,從中你會深刻地理解什麼是特徵條件獨立假設。

給定訓練數據集(X,Y),其中每個樣本x都包括n維特徵,即x=(x1,x2,x3,...,xn),類標記集合含有k種類別,即y=(y1,y2,...,yk)

如果現在來了一個新樣本x,我們要怎麼判斷它的類別?從概率的角度來看,這個問題就是給定x,它屬於哪個類別的概率最大。那麼問題就轉化爲求解P(y1|x),P(y2|x),...,P(yk|x)中最大的那個,即求後驗概率最大的輸出:argmaxykP(yk|x)

P(yk|x)怎麼求解?答案就是貝葉斯定理:


根據全概率公式,可以進一步地分解上式中的分母:

    【公式1】

先不管分母,分子中的P(yk)

是先驗概率,根據訓練集就可以簡單地計算出來。

而條件概率P(x|yk)=P(x1,x2,...,xn|yk)

它的參數規模是指數數量級別的,假設第i維特徵xi可取值的個數有Si個,類別取值個數爲k個,那麼參數個數爲:kni=1Si

這顯然不可行。針對這個問題,樸素貝葉斯算法對條件概率分佈作出了獨立性的假設,通俗地講就是說假設各個維度的特徵x1,x2,...,xn互相獨立,在這個假設的前提上,條件概率可以轉化爲:

【公式2】

這樣,參數規模就降到ni=1Sik

以上就是針對條件概率所作出的特徵條件獨立性假設,至此,先驗概率P(yk)

和條件概率P(x|yk)的求解問題就都解決了,那麼我們是不是可以求解我們所要的後驗概率P(yk|x)了?

答案是肯定的。我們繼續上面關於P(yk|x)

的推導,將【公式2】代入【公式1】得到:

於是樸素貝葉斯分類器可表示爲:



因爲對所有的yk,上式中的分母的值都是一樣的(爲什麼?注意到全加符號就容易理解了),所以可以忽略分母部分,樸素貝葉斯分類器最終表示爲:


Naive Bayes Classifiers(樸素貝葉斯分類器)

在機器學習中,樸素貝葉斯分類器是一個基於貝葉斯定理的比較簡單的概率分類器,其中 naive(樸素)是指的對於模型中各個 feature(特徵) 有強獨立性的假設,並未將 feature 間的相關性納入考慮中。

樸素貝葉斯分類器一個比較著名的應用是用於對垃圾郵件分類,通常用文字特徵來識別垃圾郵件,是文本分類中比較常用的一種方法。樸素貝葉斯分類通過選擇 token(通常是郵件中的單詞)來得到垃圾郵件和非垃圾郵件間的關聯,再通過貝葉斯定理來計算概率從而對郵件進行分類。

由單個單詞分類郵件

假設可疑消息中含有“sex”這個單詞,平時大部分收到郵件的人都會知道,這封郵件可能是垃圾郵件。然而分類器並不知道這些,它只能計算出相應的概率。假設在用戶收到的郵件中,“sex”出現在在垃圾郵件中的頻率是5%,在正常郵件中出現的概率是0.5%。

我們用 S 表示垃圾郵件(spam),H 表示正常郵件(healthy)。兩者的先驗概率都是50%,即:

P(S)=P(H)=50%

我們用 W 表示這個詞,那麼問題就變成了計算 P(S|W) 的值,根據貝葉斯定理我們可以得到


P(W|S)和P(W|H)的含義是,這個詞語在垃圾郵件和正常郵件中,分別出現的概率。通過計算可以得到 P(S|W) = 99.0%,說明“sex”的判斷能力很強,將50%的先驗概率提高到了99%的後驗概率。

結合獨立概率

大多數貝葉斯垃圾郵件分類器基於這樣的假設:郵件中的單詞是獨立的事件,實際上這種條件一般不被滿足,這也是爲什麼被稱作樸素貝葉斯。這是對於應用情景的理想化,在此基礎上,我們可以通過貝葉斯定理得到以下公式:


  • p 是可疑郵件是垃圾郵件的概率
  • pN 當郵件中包含第 Nth 個單詞時郵件是垃圾郵件的概率 p(S|WN)

對於輸出的概率,我們將它和一個 threshold(閾值)相比較,小於閾值的是正常郵件,否則認爲它是垃圾郵件。



scikit-learn 樸素貝葉斯類庫概述

  樸素貝葉斯是一類比較簡單的算法,scikit-learn中樸素貝葉斯類庫的使用也比較簡單。相對於決策樹,KNN之類的算法,樸素貝葉斯需要關注的參數是比較少的,這樣也比較容易掌握。在scikit-learn中,一共有3個樸素貝葉斯的分類算法類。分別是GaussianNB,MultinomialNB和BernoulliNB。其中GaussianNB就是先驗爲高斯分佈的樸素貝葉斯,MultinomialNB就是先驗爲多項式分佈的樸素貝葉斯,而BernoulliNB就是先驗爲伯努利分佈的樸素貝葉斯。

這三個類適用的分類場景各不相同:

  • 高斯樸素貝葉斯:sklearn.naive_bayes.GaussianNB(priors=None) 用於樣本特徵的分佈大部分是連續值
  • 多項式樸素貝葉斯:sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)主要用於離散特徵分類,例如文本分類單詞統計,以出現的次數作爲特徵值
  • 伯努利樸素貝葉斯:sklearn.naive_bayes.BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True,class_prior=None)類似於多項式樸素貝葉斯,也主要用戶離散特徵分類,和MultinomialNB的區別是:MultinomialNB以出現的次數爲特徵值,BernoulliNB爲二進制或布爾型特性


1. GaussianNB類使用總結

    GaussianNB假設特徵的先驗概率爲正態分佈,即如下式:



      其中Ck爲Y的第k類類別。μkσ2k 爲需要從訓練集估計的值

  GaussianNB會根據訓練集求出μkσ2kμk爲在樣本類別Ck中,所有Xj的平均值。σ2k爲在樣本類別Ck中,所有Xj的方差。

  GaussianNB類的主要參數僅有一個,即先驗概率priors ,對應Y的各個類別的先驗概率P(Y=Ck)。這個值默認不給出,如果不給出此時P(Y=Ck)=mk/m。其中m爲訓練集樣本總數量,mk爲輸出爲第k類別的訓練集樣本數。如果給出的話就以priors 爲準。

  高斯模型假設每一維特徵都服從高斯分佈(正態分佈):


μyk,i表示類別爲yk的樣本中,第i維特徵的均值。
σ2yk,i表示類別爲yk的樣本中,第i維特徵的方差。

    在使用GaussianNB的fit方法擬合數據後,我們可以進行預測。此時預測有三種方法,包括predict,predict_log_proba和predict_proba。 predict方法就是我們最常用的預測方法,直接給出測試集的預測類別輸出。predict_proba則不同,它會給出測試集樣本在各個類別上預測的概率。容易理解,predict_proba預測出的各個類別概率裏的最大值對應的類別,也就是predict方法得到類別。predict_log_proba和predict_proba類似,它會給出測試集樣本在各個類別上預測的概率的一個對數轉化。轉化後predict_log_proba預測出的各個類別對數概率裏的最大值對應的類別,也就是predict方法得到類別。

     當特徵是連續變量的時候,運用多項式模型就會導致很多P(xi|yk)=0(不做平滑的情況下),此時即使做平滑,所得到的條件概率也難以描述真實情況。所以處理連續的特徵變量,應該採用高斯模型。

    

下面是一組人類身體特徵的統計資料。

性別 身高(英尺) 體重(磅) 腳掌(英寸)
6 180 12
5.92 190 11
5.58 170 12
5.92 165 10
5 100 6
5.5 150 8
5.42 130 7
5.75 150 9

已知某人身高6英尺、體重130磅,腳掌8英寸,請問該人是男是女?
根據樸素貝葉斯分類器,計算下面這個式子的值。

P(身高|性別) x P(體重|性別) x P(腳掌|性別) x P(性別)
      困難在於,由於身高、體重、腳掌都是連續變量,不能採用離散變量的方法計算概率。而且由於樣本太少,所以也無法分成區間計算。怎麼辦?
      這時,可以假設男性和女性的身高、體重、腳掌都是正態分佈,通過樣本計算出均值和方差,也就是得到正態分佈的密度函數。有了密度函數,就可以把值代入,算出某一點的密度函數的值。

      比如,男性的身高是均值5.855、方差0.035的正態分佈。所以,男性的身高爲6英尺的概率的相對值等於1.5789(大於1並沒有關係,因爲這裏是密度函數的值,只用來反映各個值的相對可能性)


對於腳掌和體重同樣可以計算其均值與方差。有了這些數據以後,就可以計算性別的分類了。

   P(身高=6|男) x P(體重=130|男) x P(腳掌=8|男) x P(男) = 6.1984 x e-9
  P(身高=6|女) x P(體重=130|女) x P(腳掌=8|女) x P(女) = 5.3778 x e-4
  • 1
  • 2
  • 3
  • 4

可以看到,女性的概率比男性要高出將近10000倍,所以判斷該人爲女性。

2. MultinomialNB類使用總結

    MultinomialNB假設特徵的先驗概率爲多項式分佈,即如下式:

   

    其中,P(Xj=xjl|Y=Ck)是第k個類別的第j維特徵的第l個個取值條件概率。mk是訓練集中輸出爲第k類的樣本個數。λ

爲一個大於0的常數,常常取爲1,即拉普拉斯平滑。也可以取其他值。

    MultinomialNB參數比GaussianNB多,但是一共也只有僅僅3個。其中,參數alpha即爲上面的常數λ,如果你沒有特別的需要,用默認的1即可。如果發現擬合的不好,需要調優時,可以選擇稍大於1或者稍小於1的數。布爾參數fit_prior表示是否要考慮先驗概率,如果是false,則所有的樣本類別輸出都有相同的類別先驗概率。否則可以自己用第三個參數class_prior輸入先驗概率,或者不輸入第三個參數class_prior讓MultinomialNB自己從訓練集樣本來計算先驗概率,此時的先驗概率爲P(Y=Ck)=mk/m。其中m爲訓練集樣本總數量,mk爲輸出爲第k類別的訓練集樣本數。

  在使用MultinomialNB的fit方法或者partial_fit方法擬合數據後,我們可以進行預測。此時預測有三種方法,包括predict,predict_log_proba和predict_proba。由於方法和GaussianNB完全一樣,這裏就不累述了。

多項式模型在計算先驗概率P(yk)和條件概率P(xi|yk)時,會做一些平滑處理,具體公式爲:


N是總的樣本個數,k是總的類別個數,Nyk是類別爲yk的樣本個數,α是平滑值。


Nyk是類別爲yk的樣本個數,n是特徵的維數,Nyk,xi是類別爲yk的樣本中,第i維特徵的值是xi的樣本個數,α是平滑值。

α=1時,稱作Laplace平滑,當0<α<1時,稱作Lidstone平滑,α=0時不做平滑。

如果不做平滑,當某一維特徵的值xi

沒在訓練樣本中出現過時,會導致P(xi|yk)=0,從而導致後驗概率爲0。加上平滑就可以克服這個問題。


2.1 舉例

有如下訓練數據,15個樣本,2維特徵X1,X2

,2種類別-1,1。給定測試樣本x=(2,S)T

,判斷其類別。

這裏寫圖片描述

解答如下:

運用多項式模型,令α=1

  • 計算先驗概率

這裏寫圖片描述

  • 計算各種條件概率

這裏寫圖片描述

  • 對於給定的x=(2,S)T計算:

這裏寫圖片描述

由此可以判定y=-1。


3. BernoulliNB類使用總結

    BernoulliNB假設特徵的先驗概率爲二元伯努利分佈,即如下式:


         此時l只有兩種取值。xjl只能取值0或者1。

   BernoulliNB一共有4個參數,其中3個參數的名字和意義和MultinomialNB完全相同。唯一增加的一個參數是binarize。這個參數主要是用來幫BernoulliNB處理二項分佈的,可以是數值或者不輸入。如果不輸入,則BernoulliNB認爲每個數據特徵都已經是二元的。否則的話,小於binarize的會歸爲一類,大於binarize的會歸爲另外一類。

  在使用BernoulliNB的fit或者partial_fit方法擬合數據後,我們可以進行預測。此時預測有三種方法,包括predict,predict_log_proba和predict_proba。由於方法和GaussianNB完全一樣,這裏就不累述了。

        與多項式模型一樣,伯努利模型適用於離散特徵的情況,所不同的是,伯努利模型中每個特徵的取值只能是1和0(以文本分類爲例,某個單詞在文檔中出現過,則其特徵值爲1,否則爲0).

伯努利模型中,條件概率P(xi|yk)的計算方式是:

當特徵值xi爲1時,P(xi|yk)=P(xi=1|yk)

當特徵值xi爲0時,P(xi|yk)=1P(xi=1|yk)

       伯努利模型和多項式模型是一致的,BernoulliNB需要比MultinomialNB多定義一個二值化的方法,該方法會接受一個閾值並將輸入的特徵二值化(1,0)。當然也可以直接採用MultinomialNB,但需要預先將輸入的特徵二值化。

  

參考:

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