天天看點

NLP實踐四:樸素貝葉斯實作文本分類

文章目錄

    • 貝葉斯公式
    • 貝葉斯模型描述
      • 給定條件
      • 目标
      • 推理的過程
    • $P(Y=C_k)$和$P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...,n)$怎麼學習
    • 算法過程
    • 代碼實踐:Thucnews分類

參考 樸素貝葉斯原理

貝葉斯公式

條件獨立公式,如果X和Y互相獨立,則有:

  P ( X , Y ) = P ( X ) P ( Y ) \ P(X,Y) =P(X)P(Y)  P(X,Y)=P(X)P(Y)

條件機率公式:

  P ( Y ∣ X ) = P ( X , Y ) / P ( X ) \ P(Y|X) = P(X,Y)/P(X)  P(Y∣X)=P(X,Y)/P(X)

  P ( X ∣ Y ) = P ( X , Y ) / P ( Y ) \ P(X|Y) = P(X,Y)/P(Y)  P(X∣Y)=P(X,Y)/P(Y)

全機率公式:

  P ( X ) = ∑ k P ( X ∣ Y = Y k ) P ( Y k ) 其 中 ∑ k P ( Y k ) = 1 \ P(X) = \sum\limits_{k}P(X|Y =Y_k)P(Y_k) 其中\sum\limits_{k}P(Y_k)=1  P(X)=k∑​P(X∣Y=Yk​)P(Yk​)其中k∑​P(Yk​)=1

從上面的公式很容易得出貝葉斯公式:

  P ( Y k ∣ X ) = P ( X ∣ Y k ) P ( Y k ) ∑ k P ( X ∣ Y = Y k ) P ( Y k ) \ P(Y_k|X) = \frac{P(X|Y_k)P(Y_k)}{\sum\limits_{k}P(X|Y =Y_k)P(Y_k)}  P(Yk​∣X)=k∑​P(X∣Y=Yk​)P(Yk​)P(X∣Yk​)P(Yk​)​

貝葉斯模型描述

給定條件

假如我們的分類模型樣本是:

( x 1 ( 1 ) , x 2 ( 1 ) , . . . x n ( 1 ) , y 1 ) , ( x 1 ( 2 ) , x 2 ( 2 ) , . . . x n ( 2 ) , y 2 ) , . . . ( x 1 ( m ) , x 2 ( m ) , . . . x n ( m ) , y m ) (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)}, y_1), (x_1^{(2)}, x_2^{(2)}, ...x_n^{(2)},y_2), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_m) (x1(1)​,x2(1)​,...xn(1)​,y1​),(x1(2)​,x2(2)​,...xn(2)​,y2​),...(x1(m)​,x2(m)​,...xn(m)​,ym​)

代表有m個樣本,每個樣本有n個特征,特征輸出有K個類别,定義為   C 1 , C 2 , . . . , C K \ {C_1,C_2,...,C_K}  C1​,C2​,...,CK​

目标

在以上給定條件後,我們希望貝葉斯模型能通過給定樣本 X ( t e s t ) = ( x 1 ( t e s t ) , x 2 ( t e s t ) , . . . x n ( t e s t ) ) X^{(test)}={(x_1^{(test)}, x_2^{(test)}, ...x_n^{(test)})} X(test)=(x1(test)​,x2(test)​,...xn(test)​),通過後驗機率最大化來判斷分類,預測出 P ( Y = C K ∣ X = X ( t e s t ) ) P(Y=C_K|X=X^{(test)}) P(Y=CK​∣X=X(test))

推理的過程

已知要求 P ( Y = C K ∣ X = X ( t e s t ) ) P(Y=C_K|X=X^{(test)}) P(Y=CK​∣X=X(test)),根據貝葉斯公式可得:

P ( Y = C k ∣ X = X ( t e s t ) ) = P ( X = X ( t e s t ) ∣ Y k ) P ( Y = C k ) ∑ k P ( X = X ( t e s t ) ∣ Y = C k ) P ( Y = C k ) P(Y=C_k|X=X^{(test)}) = \frac{P(X=X^{(test)}|Y_k)P(Y=C_k)}{\sum\limits_{k}P(X=X^{(test)}|Y=C_k)P(Y=C_k)} P(Y=Ck​∣X=X(test))=k∑​P(X=X(test)∣Y=Ck​)P(Y=Ck​)P(X=X(test)∣Yk​)P(Y=Ck​)​

C r e s u l t C_{result} Cresult​是使 P ( Y = C k ∣ X = X ( t e s t ) ) P(Y=C_k|X=X^{(test)}) P(Y=Ck​∣X=X(test))最大化的類别,數學表達式為:

C r e s u l t = a r g m a x ⎵ C k P ( Y = C k ∣ X = X ( t e s t ) ) = a r g m a x ⎵ C k P ( X = X ( t e s t ) ∣ Y = C k ) P ( Y = C k ) / P ( X = X ( t e s t ) ) \begin{aligned} C_{result} & = \underbrace{argmax}_{C_k}P(Y=C_k|X=X^{(test)}) \\ & = \underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k) {/}P(X=X^{(test)}) \end{aligned} Cresult​​=Ck​

argmax​​P(Y=Ck​∣X=X(test))=Ck​

argmax​​P(X=X(test)∣Y=Ck​)P(Y=Ck​)/P(X=X(test))​

由于對于所有的類别計算 P ( Y = C k ∣ X = X ( t e s t ) ) P(Y=C_k|X=X^{(test)}) P(Y=Ck​∣X=X(test))時,上式的分母是一樣的,都是 P ( X = X ( t e s t ) ) P(X=X^{(test)}) P(X=X(test)),是以,我們的預測公式可以簡化為:

C r e s u l t = a r g m a x ⎵ C k P ( X = X ( t e s t ) ∣ Y = C k ) P ( Y = C k ) C_{result} = \underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k) Cresult​=Ck​

argmax​​P(X=X(test)∣Y=Ck​)P(Y=Ck​)

這裡給出一個大膽的獨立性假設:即X的n個次元之間互相獨立

那麼有:

P ( X ∣ Y = C k ) = P ( X 1 = x 1 , X 2 = x 2 , . . . X n = x n ∣ Y = C k ) = P ( X 1 = x 1 ∣ Y = C k ) P ( X 2 = x 2 ∣ Y = C k ) . . . P ( X n = x n ∣ Y = C k ) \begin{aligned} P(X|Y=C_k) & = P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k) \\ & = P(X_1=x_1|Y=C_k)P(X_2=x_2|Y=C_k)...P(X_n=x_n|Y=C_k) \end{aligned} P(X∣Y=Ck​)​=P(X1​=x1​,X2​=x2​,...Xn​=xn​∣Y=Ck​)=P(X1​=x1​∣Y=Ck​)P(X2​=x2​∣Y=Ck​)...P(Xn​=xn​∣Y=Ck​)​

那麼我們利用樸素貝葉斯的獨立性假設,就可以得到通常意義上的樸素貝葉斯推斷公式:

C r e s u l t = a r g m a x ⎵ C k P ( Y = C k ) ∏ j = 1 n P ( X j = X j ( t e s t ) ∣ Y = C k ) C_{result} = \underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^{n}P(X_j=X_j^{(test)}|Y=C_k) Cresult​=Ck​

argmax​​P(Y=Ck​)j=1∏n​P(Xj​=Xj(test)​∣Y=Ck​)

P ( Y = C k ) P(Y=C_k) P(Y=Ck​)和 P ( X j = X j ( t e s t ) ∣ Y = C k ) ( j = 1 , 2 , . . . , n ) P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...,n) P(Xj​=Xj(test)​∣Y=Ck​)(j=1,2,...,n)怎麼學習

我們知道隻要求出 P ( Y = C k ) P(Y=C_k) P(Y=Ck​)和 P ( X j = X j ( t e s t ) ∣ Y = C k ) ( j = 1 , 2 , . . . n ) P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n) P(Xj​=Xj(test)​∣Y=Ck​)(j=1,2,...n),我們通過比較就可以得到樸素貝葉斯的推斷結果。這一節我們就讨論怎麼通過訓練集計算這兩個機率。

對于 P ( Y = C k ) P(Y=C_k) P(Y=Ck​),比較簡單,通過極大似然估計我們很容易得到 P ( Y = C k ) P(Y=C_k) P(Y=Ck​)為樣本類别 C k C_k Ck​出現的頻率,即樣本類别 C k C_k Ck​出現的次數 m k m_k mk​除以樣本總數m。

對于 P ( X j = X j ( t e s t ) ∣ Y = C k ) ( j = 1 , 2 , . . . n ) P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n) P(Xj​=Xj(test)​∣Y=Ck​)(j=1,2,...n),這個取決于我們的先驗條件:

a) X j X_j Xj​是離散的值,那麼我們可以假設 X j X_j Xj​符合多項式分布,這樣得到 P ( X j = X j ( t e s t ) ∣ Y = C k ) P(X_j=X_j^{(test)}|Y=C_k) P(Xj​=Xj(test)​∣Y=Ck​)是在樣本類别 C k C_k Ck​中,特征 X j ( t e s t ) X_j^{(test)} Xj(test)​出現的頻率。即:

P ( X j = X j ( t e s t ) ∣ Y = C k ) = m k j t e s t m k P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}}}{m_k} P(Xj​=Xj(test)​∣Y=Ck​)=mk​mkjtest​​

其中 m k m_k mk​為樣本類别 C k C_k Ck​總的特征計數,而 m k j t e s t m_{kj^{test}} mkjtest​為類别為 C k C_k Ck​的樣本中,第 j j j維特征 X j ( t e s t ) X_j^{(test)} Xj(test)​出現的計數。

某些時候,可能某些類别在樣本中沒有出現,這樣可能導緻 P ( X j = X j ( t e s t ) ∣ Y = C k ) P(X_j=X_j^{(test)}|Y=C_k) P(Xj​=Xj(test)​∣Y=Ck​)為0,這樣會影響後驗的估計,為了解決這種情況,我們引入了拉普拉斯平滑,即此時有:

P ( X j = X j ( t e s t ) ∣ Y = C k ) = m k j t e s t + λ m k + O j λ P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}} + \lambda}{m_k + O_j\lambda} P(Xj​=Xj(test)​∣Y=Ck​)=mk​+Oj​λmkjtest​+λ​

其中 λ \lambda λ為一個大于0的常數,常常取為1。 O j O_j Oj​為第 j j j個特征的取值個數。

b) X j X_j Xj​是非常稀疏的離散值,即各個特征出現機率很低,這時我們可以假設 X j X_j Xj​符合伯努利分布,即特征 X j X_j Xj​出現記為1,不出現記為0。即隻要 X j X_j Xj​出現即可,我們不關注 X j X_j Xj​的次數。這樣得到 P ( X j = X j ( t e s t ) ∣ Y = C k ) P(X_j=X_j^{(test)}|Y=C_k) P(Xj​=Xj(test)​∣Y=Ck​)是在樣本類别 C k C_k Ck​中, X j ( t e s t ) X_j^{(test)} Xj(test)​出現的頻率。此時有:

P ( X j = X j ( t e s t ) ∣ Y = C k ) = P ( X j ∣ Y = C k ) X j ( t e s t ) + ( 1 − P ( X j ∣ Y = C k ) ) ( 1 − X j ( t e s t ) ) P(X_j=X_j^{(test)}|Y=C_k) = P(X_j|Y=C_k)X_j^{(test)} + (1 - P(X_j|Y=C_k))(1-X_j^{(test)}) P(Xj​=Xj(test)​∣Y=Ck​)=P(Xj​∣Y=Ck​)Xj(test)​+(1−P(Xj​∣Y=Ck​))(1−Xj(test)​)

其中, X j ( t e s t ) X_j^{(test)} Xj(test)​取值為0和1。

c) X j X_j Xj​是連續值,我們通常取 X j X_j Xj​的先驗機率為正态分布,即在樣本類别 C k C_k Ck​中, X j X_j Xj​的值符合正态分布。這樣 P ( X j = X j ( t e s t ) ∣ Y = C k ) P(X_j=X_j^{(test)}|Y=C_k) P(Xj​=Xj(test)​∣Y=Ck​)的機率分布是:

P ( X j = X j ( t e s t ) ∣ Y = C k ) = 1 2 π σ k 2 e x p ( − ( X j ( t e s t ) − μ k ) 2 2 σ k 2 ) P(X_j=X_j^{(test)}|Y=C_k) = \frac{1}{\sqrt{2\pi\sigma_k^2}}exp{(}-\frac{(X_j^{(test)} - \mu_k)^2}{2\sigma_k^2}{)} P(Xj​=Xj(test)​∣Y=Ck​)=2πσk2​

​1​exp(−2σk2​(Xj(test)​−μk​)2​)

其中 μ k \mu_k μk​和 σ k 2 \sigma_k^2 σk2​是正态分布的期望和方差,可以通過極大似然估計求得。 μ k \mu_k μk​為在樣本類别 C k C_k Ck​中,所有 X j X_j Xj​的平均值。 σ k 2 \sigma_k^2 σk2​為在樣本類别 C k C_k Ck​中,所有 X j X_j Xj​的方差。對于一個連續的樣本值,帶入正态分布的公式,就可以求出機率分布了。

算法過程

我們假設訓練集為m個樣本n個次元,如下:

  ( x 1 ( 1 ) , x 2 ( 1 ) , . . . x n ( 1 ) , y 1 ) , ( x 1 ( 2 ) , x 2 ( 2 ) , . . . x n ( 2 ) , y 2 ) , ( x 1 ( m ) , x 2 ( m ) , . . . x n ( m ) , y m ) \ (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)}, y_1),(x_1^{(2)}, x_2^{(2)}, ...x_n^{(2)},y_2),(x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_m)  (x1(1)​,x2(1)​,...xn(1)​,y1​),(x1(2)​,x2(2)​,...xn(2)​,y2​),(x1(m)​,x2(m)​,...xn(m)​,ym​)

共有K個特征輸出類别,分别為 C 1 , C 2 , . . . , C K {C_1,C_2,...,C_K} C1​,C2​,...,CK​,每個特征輸出類别的樣本個數為 m 1 , m 2 , . . . , m K {m_1,m_2,...,m_K} m1​,m2​,...,mK​,在第k個類别中,如果是離散特征,則特征 X j X_j Xj​各個類别取值為 m j l m_{jl} mjl​。其中l取值為 1 , 2 , . . . S j 1,2,...S_j 1,2,...Sj​, S j S_j Sj​為特征j不同的取值數。輸出為執行個體 X ( t e s t ) X^{(test)} X(test)的分類

算法流程如下:

  1. 如果沒有Y的先驗機率,則計算Y的K個先驗機率:   P ( Y = C k ) = ( m k + λ ) / ( m + K λ ) \ P(Y=C_k)=(m_k+\lambda)/(m+K\lambda)  P(Y=Ck​)=(mk​+λ)/(m+Kλ),否則   P ( Y = C k ) \ P(Y=C_k)  P(Y=Ck​)為輸入的先驗機率。
  2. 分别計算第k個類别的第j維特征的第l個個取值條件機率: P ( X j = x j l ∣ Y = C k ) P(X_j=x_{jl}|Y=C_k) P(Xj​=xjl​∣Y=Ck​)

    a)如果是離散值:

    P ( X j = x j l ∣ Y = C k ) = m k j l + λ m k + S j λ P(X_j=x_{jl}|Y=C_k) = \frac{m_{kjl} + \lambda}{m_k + S_j\lambda} P(Xj​=xjl​∣Y=Ck​)=mk​+Sj​λmkjl​+λ​

      l a m b d a \ lambda  lambda可以取值為1,或者其他大于0的數字。

    b)如果是稀疏二項離散值: P ( X j = x j l ∣ Y = C k ) = P ( j ∣ Y = C k ) x j l + ( 1 − P ( j ∣ Y = C k ) ( 1 − x j l ) P(X_j=x_{jl}|Y=C_k) =P(j|Y=C_k)x_{jl} + (1 - P(j|Y=C_k)(1-x_{jl}) P(Xj​=xjl​∣Y=Ck​)=P(j∣Y=Ck​)xjl​+(1−P(j∣Y=Ck​)(1−xjl​)

    此時 l l l隻有兩種取值。

    c)如果是連續值不需要計算各個l的取值機率,直接求正态分布的參數:

    P ( X j = x j ∣ Y = C k ) = 1 2 π σ k 2 e x p ( − ( x j − μ k ) 2 2 σ k 2 ) P(X_j=x_j|Y=C_k) = \frac{1}{\sqrt{2\pi\sigma_k^2}}exp(-\frac{(x_j - \mu_k)^2}{2\sigma_k^2}) P(Xj​=xj​∣Y=Ck​)=2πσk2​

    ​1​exp(−2σk2​(xj​−μk​)2​)

需要求出 μ k 和 σ k 2 \mu_k和\sigma_k^2 μk​和σk2​。 μ k \mu_k μk​為在樣本類别 C k C_k Ck​中,所有 X j X_j Xj​的平均值。 σ k 2 \sigma_k^2 σk2​為在樣本類别 C k C_k Ck​中,所有 X j X_j Xj​的方差。

3)對于執行個體 X ( t e s t ) X^{(test)} X(test),分别計算:

P ( Y = C k ) ∏ j = 1 n P ( X j = x j ( t e s t ) ∣ Y = C k ) P(Y=C_k)\prod_{j=1}^{n}P(X_j=x_j^{(test)}|Y=C_k) P(Y=Ck​)j=1∏n​P(Xj​=xj(test)​∣Y=Ck​)

4)确定執行個體 X ( t e s t ) X^{(test)} X(test)的分類 C r e s u l t C_{result} Cresult​

C r e s u l t = a r g m a x ⎵ C k P ( Y = C k ) ∏ j = 1 n P ( X j = X j ( t e s t ) ∣ Y = C k ) C_{result} = \underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^{n}P(X_j=X_j^{(test)}|Y=C_k) Cresult​=Ck​

argmax​​P(Y=Ck​)j=1∏n​P(Xj​=Xj(test)​∣Y=Ck​)

從上面的計算可以看出,沒有複雜的求導和矩陣運算,是以效率很高。

代碼實踐:Thucnews分類

樸素貝葉斯Thucnews分類

繼續閱讀