機器學習讀書筆記:貝葉斯分類器

新興IT民工發表於2020-10-05

樸素貝葉斯

貝葉斯公式

​ 貝葉斯分類器是基於貝葉斯公式,之前寫過一篇關於貝葉斯公式的文章:

判別式模型 & 生成式模型

​ 之前的幾種模型都是判別式模型,而貝葉斯分類器是一種生成式模型,我自己的一個最簡單的理解就是用概率的方式去考慮分類問題–萬物皆概率。之前也有過一篇文章:

樸素貝葉斯模型

根據上面兩個知識點,我們可以知道,貝葉斯分類器就是想用 p ( y ∣ x ) = p ( x , y ) p ( x ) , y ∈ ( c 1 , c 2 . . . c i ) p(y|x) = \frac{p(x, y)}{p(x)}, y \in (c_1, c_2 ... c_i) p(yx)=p(x)p(x,y),y(c1,c2...ci)。根據之前的模型的概念,這個貝葉斯分類器模型的訓練過程就是想讓所有樣本計算的 p ( y ∣ x ) p(y|x) p(yx)與真實的 y y y之間的差異,或者說損失最小。這裡就定義了這個損失的概念:
R ( c i ∣ x ) = ∑ j = 1 N λ i j P ( c i ∣ x ) R(c_i|x)=\sum_{j=1}^N\lambda_{ij}P(c_i|x) R(cix)=j=1NλijP(cix)

  1. 這個公式計算的是真實分類為 c j c_j cj類別的樣本被分成的 c i c_i ci類別的損失。對 j j j進行就和就是一個誤判的樣本對應其他各種類別的總體風險。我們的目標就是讓這個目標函式降到最小。如果某種判定準則 h h h可以讓每個樣本上對其他每類都能損失最小化,那麼自然就可以在樣本集整體上損失最小化。那麼我們就是要找到這樣一個準則,或者說對映關係,也可以說模型:叫做最優貝葉斯分類器: h ∗ h^* h

h ∗ = a r g min ⁡ y ( R ( c ∣ x ) ) h^*=arg\min_y(R(c|x)) h=argymin(R(cx))

  1. 然後,把 λ \lambda λ定義成:

λ i j = { 0 , i f i = j 1 , i f i ≠ j \lambda_{ij}=\begin{cases}0, if i=j \\ 1, if i\neq j\end{cases} λij={0,ifi=j1,ifi=j

​ 那麼 R ( c ∣ x ) = 1 − P ( c ∣ x ) R(c|x)=1-P(c|x) R(cx)=1P(cx),其實也就是不等於正確那一類的所有類別的概率總和。

​ 那麼, h ∗ h^* h就可以轉換成:
h ∗ = a r g max ⁡ y P ( c ∣ x ) h^*=arg\max_yP(c|x) h=argymaxP(cx)
​ 從求最小就變成了求最大,這個分類器必須使得後驗概率 P ( c ∣ x ) P(c|x) P(cx)在每個樣本上最大。

  1. 根據貝葉斯公式: P ( c ∣ x ) = P ( x , c ) p ( x ) = P ( c ) P ( c ∣ x ) P ( x ) P(c|x)=\frac{P(x,c)}{p(x)}=\frac{P(c)P(c|x)}{P(x)} P(cx)=p(x)P(x,c)=P(x)P(c)P(cx)。從這個公式中看, P ( c ) P(c) P(c)是每種類別的概率,這個東西的話,也成為先驗概率,樣本集固定了,這個東西就是可以通過樣本集中的類別概率來統計的(大數定律),可以用 c i 類 別 的 樣 本 數 / 樣 本 集 個 數 c_i類別的樣本數/樣本集個數 ci/。同樣, P ( x ) P(x) P(x)就是樣本 x x x出現的概率。

  2. 那麼,分類器在求解 P ( c ∣ x ) P(c|x) P(cx)的上最大,可以轉變為分類器模型讓 P ( x ∣ c ) P(x|c) P(xc)上最大。這裡做這個轉換,我的理解是這樣的:對於新的樣本,計算就是計算 P ( c ∣ x ) P(c|x) P(cx),也就是預測新樣本的分類是 c c c的概率。而這個概率可以通過貝葉斯公式來計算,其中最麻煩的就是 P ( x ∣ c ) P(x|c) P(xc),而求解這個東西的概率可以再拆分成按照屬性來計算: P ( x ∣ c ) = ∏ i = 1 d p ( x i ∣ c ) P(x|c) = \prod_{i=1}^d{p(x_i|c)} P(xc)=i=1dp(xic),也就是根據每種屬性在樣本集中的概率來計算。最終把這些概率連乘。而 P ( c ∣ x ) = P ( x , c ) p ( x ) = P ( c ) P ( x ) ∏ i = 1 d p ( x i ∣ c ) P(c|x)=\frac{P(x,c)}{p(x)}=\frac{P(c)}{P(x)}\prod_{i=1}^d{p(x_i|c)} P(cx)=p(x)P(x,c)=P(x)P(c)i=1dp(xic)

  3. 當然,第四步中的公式是基於每個屬性都是獨立這一前提才成立的。後面還會提到不成立的情況。

  4. 如果是基於所有樣本都是獨立取樣這一前提的話,那麼 P ( x ) P(x) P(x)這個對於所有的樣本都是相同的,可以忽略,那麼第四步中的公式就可以變成:
    P ( c ) ∏ i = 1 d p ( x i ∣ c ) P(c)\prod_{i=1}^d{p(x_i|c)} P(c)i=1dp(xic)
    也就是貝葉斯分類器的基本形式。

使用貝葉斯分類器

​ 貝葉斯分類器作為一種生成模型的分類器,是計算每種類別的概率,哪個最大就確定是那種類別。配合第二點和第四點來理解這句話,借用《機器學習》書中的例子:
在這裡插入圖片描述

上面的是訓練集,假設來了一個新的樣本:

在這裡插入圖片描述

  1. 對於這樣的一個樣本,我們就是要去求解他的 P ( c ∣ x i ) P(c|x_i) P(cxi),那麼,對於類別 C ∈ ( 好 瓜 , 不 是 好 瓜 ) C \in (好瓜,不是好瓜) C()只有兩個類別,是一個二分類問題。通過上面提到的模型,實際上是分別求解新樣本為好瓜情況下的 p ( c ) p(c) p(c) p ( x ) p(x) p(x) p ( x ∣ c ) p(x|c) p(xc)這三個值,然後得到是好瓜的概率,然後再計算不是好瓜情況下的 p ( c ) p(c) p(c) p ( x ) p(x) p(x) p ( x ∣ c ) p(x|c) p(xc)這三個值,然後得到是不是好瓜的概率。根據上一章節中,我們的規律是要最大化這個概率的,那麼我們就是要選概率大的,所以計算出來的類別中,哪個概率大,這個樣本的分類就是哪個。

  2. 先看下 p ( c ) p(c) p(c),這個數是樣本集定了就定了。就是某個類別佔樣本集中的比例;那麼, p ( c 0 ) = 好 瓜 數 總 數 = 8 17 = 0.471 p(c_0) = \frac{好瓜數}{總數}= \frac{8}{17} = 0.471 p(c0)==178=0.471 p ( c 1 ) = 不 是 好 瓜 數 總 數 = 9 17 = 0.529 p(c_1) = \frac{不是好瓜數}{總數}= \frac{9}{17} = 0.529 p(c1)==179=0.529.

  3. 然後就是計算每個屬性在樣本集中概率了,概率比較好算,就是樣本中類別為 c i c_i ci的,每種屬性的概率(公式1):
    P ( x i ∣ c ) = ∣ D c , x i ∣ D c P(x_i|c)=\frac{|D_{c,x_i}|}{D_c} P(xic)=DcDc,xi

    舉個例子:

在這裡插入圖片描述
在這裡插入圖片描述

  1. 這裡還有幾個連續屬性的沒有計算,這些連續屬性的話,一般假定服從正太分佈:

在這裡插入圖片描述

這裡還需要先針對樣本集計算連續值的均值 μ c , i \mu_{c,i} μc,i和方差 σ c , i \sigma_{c,i} σc,i。然後再代入 x i x_i xi進行計算:
在這裡插入圖片描述

  1. 概率出來之後,然後把好瓜的相關概率進行相乘,計算等於0.038。而不是好瓜的概率計算等於 6.8 × 1 0 − 5 6.8 × 10^{-5} 6.8×105。所以這個樣本的類別會被判定為好瓜,然後這裡把新樣本納入到樣本集中,進行持續學習

  2. 上面的概率計算有一個問題,可以看到概率的連乘之後是一個很小的數了,如果再多幾個屬性,可能都會趨向於0,而在計算機中也會導致精度不夠,最後都等於0,所以會在之前的連乘前加上 l o g log log運算:
    l o g ( p ( x ∣ c ) ) = l o g ( ∏ i = 1 d p ( x i ∣ c ) ) = ∑ i = 1 d l o g ( p ( x i ∣ c ) ) log(p(x|c)) = log(\prod_{i=1}^d{p(x_i|c)})=\sum_{i=1}^d{log({p(x_i|c)})} log(p(xc))=log(i=1dp(xic))=i=1dlog(p(xic))

  3. 平滑與修正。

    這裡還存在一個問題,如果使用第三步中的公式中分子為0,也就是說在樣本集中如果某個屬性不存在。那麼不管如何計算都會等於0。所以需要進行一下修改(公式2):
    P ^ ( x i ∣ c ) = D c , x i + 1 ∣ D c ∣ + N i \hat{P}{(x_i|c)} = \frac{D_{c,x_i}+1}{|D_c|+N_i} P^(xic)=Dc+NiDc,xi+1
    這裡面的 N i N_i Ni就是第 i i i個屬性可能的取值數目。

程式碼

​ 訓練程式碼就是根據上面的公式計算各個屬性對應的各個類別的概率,形成向量。

def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbusive = sum(trainCategory)/float(numTrainDocs)
    p0Num = ones(numWords); p1Num = ones(numWords)      #change to ones() 
    p0Denom = 2.0; p1Denom = 2.0                        #change to 2.0
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = log(p1Num/p1Denom)          #change to log()
    p0Vect = log(p0Num/p0Denom)          #change to log()
    return p0Vect,p1Vect,pAbusive

​ 判別的話就是根據這些向量直接進行概率計算。

def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    p1 = sum(vec2Classify * p1Vec) + log(pClass1)    #element-wise mult
    p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
    if p1 > p0:
        return 1
    else: 
        return 0

半樸素貝葉斯模型

​ 樸素貝葉斯的樸素之處就在於假設所有的屬性都是相互獨立的,所以公式 P ( x ∣ c ) = ∏ i = 1 d p ( x i ∣ c ) P(x|c) = \prod_{i=1}^d{p(x_i|c)} P(xc)=i=1dp(xic)才成立。但顯然很多情況下,這個假設是不成立的。那麼把樣本間的屬性分量的相互依賴關係引入貝葉斯公式中,就形成了一些其他半樸素貝葉斯模型。

​ 如果屬性之間有依賴關係的話,需要將上面的公式做一個改造:
P ( c ) ∏ i = 1 d p ( x i ∣ c , p a i ) P(c)\prod_{i=1}^d{p(x_i|c,pa_i)} P(c)i=1dp(xic,pai)
​ 其中的 p a i pa_i pai是指屬性 x i x_i xi所依賴的屬性。然後根據上面的公式2來解釋這個公式就是樣本集中樣本為 c c c,依賴 p a pa pa屬性的屬性的個數。

​ 而這些相互依賴關係,最簡單也是最常用的一種就是“獨依賴估計”策略。所謂的“獨依賴”就是假設每個屬性在類別之外最多僅依賴於一個其他的屬性。根據不同的依賴方法,可以形成不同的獨依賴模型。

超父-SPODE(Super-Parent ODE)

​ 選擇一個屬性作為其他屬性的依賴屬性,這裡使用交叉驗證來挑其中某個屬性來作為其他的依賴屬性。需要注意一下的是,圖中的邊的含義按照箭頭方向是指屬性 x 1 x_1 x1決定 x 2 x_2 x2,或者說 x 2 x_2 x2依賴於 x 1 x_1 x1

在這裡插入圖片描述

TAN(Tree Augmented Naive Bayes)

​ TAN是基於最小生成樹演算法來生成:

  1. 通過某種策略計算屬性與屬性之間權重函式 I ( x i , x j ∣ y ) I(x_i,x_j|y) I(xi,xjy)

  2. 以屬性為節點構建完全圖,節點與節點之間的權重就是第一步中的權重函式。

  3. 應用最小生成樹演算法(

    ),在這個完全圖上生成一份最小生成樹。

  4. 加入類別節點 y y y,增加從 y y y到每個屬性節點的有向邊。

在這裡插入圖片描述

相關文章