機器學習 —— 基礎整理(二)朴素貝葉斯分類器;文本分類的方法雜談


      上一篇博客復習了貝葉斯決策論,以及生成式模型的參數方法。本篇就給出一個具體的例子:朴素貝葉斯分類器應用於文本分類。后面簡單談了一下文本分類的方法。

(五)朴素貝葉斯分類器(Naïve Bayes)

      既然說到了朴素貝葉斯,那就從信息檢索的一些概念開始說起好了。

      一、以概率角度出發的文檔生成

      如果以概率角度看待文檔生成,往往是假設詞項(term)服從某個分布,然后從總體中抽樣,抽出來的詞項連在一起,組成文檔。比如 $P(D|R=1)$ 可以認為是 $R=1$ 的文檔的詞項服從一個分布,然后從該分布中抽樣生成D。

      常用於文檔生成的分布有多元貝努利分布Multivariate Bernoulli distribution多項分布(Multinomial distribution)

      i. 多元貝努利分布考慮詞項的出現與否、不考慮詞項的位置。從名字上也很好理解,多元貝努利分布可以理解為多個變元的貝努利分布。例如,詞典有四個詞I、can、you、fly,出現概率分別為0.7、0.4、0.1、0.05(這四個值的加和與1沒有任何關系,因為各自變元所服從的貝努利分布僅表示該詞項出現/不出現的概率加和為1 ,但是各個變元之間沒有關系),那么生成文檔“I can fly fly fly fly fly”的概率是 $0.7 \times (1-0.4) \times 0.1 \times 0.05 $ 。 

      ii. 多項分布考慮詞項的多次出現、不考慮詞項的不出現、不考慮詞項的位置和次序。如果說貝努利分布就是 $n$ 次獨立重復的拋硬幣實驗,那多項分布就是 $n$ 次獨立重復的拋不規則骰子實驗。例如,詞典有四個詞I、can、you、fly,概率分別為0.4、0.3、0.2、0.1(多項分布,當然加和為1),那么生成文檔“I can fly fly fly fly fly”的概率是 $\text{C}_7^1\times \text{C}_6^1\times \text{C}_5^5\times 0.4\times 0.2\times 0.1\times 0.1\times 0.1\times 0.1\times 0.1$ 。

      二、概率檢索模型

      概率檢索模型就是基於概率的信息檢索模型,例如二值獨立模型BIM、大名鼎鼎的BM25等都屬於概率檢索模型。二值獨立模型(Binary independence model,BIM)是在給定查詢Q和文檔D的情況下,利用貝葉斯公式計算文檔D是查詢Q的相關文檔的概率 $P(R=1|D,Q)$(對於同一查詢來說,可簡記為 $P(R=1|D)$ )。“二值”是指查詢Q和文檔Q都表示為詞項出現與否的布爾向量,“獨立”是指詞項在文檔中的出現是相互獨立的。

      1. 排序函數

      對於每個查詢Q,定義排序函數 $RSV(Q,D)$ 為:

$$RSV(Q,D)=\log\dfrac{P(R=1|D)}{P(R=0|D)}=\log\dfrac{\frac{P(D|R=1)P(R=1)}{P(D)}}{\frac{P(D|R=0)P(R=0)}{P(D)}}\propto \log\dfrac{P(D|R=1)}{P(D|R=0)}$$

其中 $P(D|R=1)$ 可以認為是在相關的情況下生成文檔D的概率,$P(D|R=0)$ 是在不相關的情況下生成文檔D的概率。

      2. 模型參數計算

      二值獨立模型等價於后面要介紹的多元貝努利朴素貝葉斯模型。對於BIM模型來說,基於多元貝努利分布生成文檔。那么,大小為 M 的詞典會對應兩套概率(這 2M 個參數就是模型參數):一套是 $R=1$ 條件下的,另一套是 $R=0$ 條件下的。

      這 2M 個參數需要根據文檔集來估計。這里就不詳細解釋了,直接看教材咯:[1] 的電子版在這里

      當根據文檔集估計出這兩套概率之后,在給定文檔 D 時,就可以分別求得 $P(D|R=1)$ 和 $P(D|R=0)$ 。

      二、查詢似然模型與查詢生成

      查詢似然模型(Query likelihood model,QLM)是在信息檢索中最早應用也是最為基本的基於語言模型的信息檢索模型。它為每篇文檔D構建其對應的語言模型 $M_D$ ,檢索目標是將文檔按照其與查詢相關的概率 $P(D|Q)$ 來排序。根據貝葉斯公式,

$$P(D|Q)=\frac{P(Q|D)P(D)}{P(Q)}\propto P(Q|D)P(D)$$

其中文檔的先驗信息 $P(D)$ 與查詢無關,因此現在只考慮查詢似然 $P(Q|D)$ 。查詢似然 $P(Q|D)$ 可認為是根據文檔D的語言模型 $M_D$ 來生成查詢Q的概率,那么這種方法實際上是建模查詢的生成過程,對於每個查詢Q來說,排序函數就是 $P(D|Q)$ 。

      用一元語言模型計算查詢似然的方法等價於后面要介紹的多項式朴素貝葉斯模型,這里的文檔相當於后者的類別。

      三、朴素貝葉斯分類器

      下面討論朴素貝葉斯分類器(Naïve Bayes,NB)。NB是低方差高偏差的分類器,假設各個特征之間存在條件獨立性假設:對於給定的類別,所有的特征相互獨立。顯然,這個假設把問題想的太簡單了,但NB在文本分類任務上確實擁有很好的效果。

      給定樣本 $\textbf x=(x_1,x_2,...,x_d)^{\top}$ ,其屬於類別 $\omega_i$ 后驗概率可以表述為:

$$P(\omega_i|\textbf x)=\frac{p(\textbf x,\omega_i)}{p(\textbf x)}\propto p(\textbf x,\omega_i)=p(\textbf x|\omega_i)P(\omega_i)=P(\omega_i)\prod_{k=1}^dp(x_k|\omega_i)$$

其中 $d$ 是特征維數,$x_k$ 是樣本在第 $k$ 個特征上的取值。可以看出其建模的是類別信息與特征的聯合分布 $p(\textbf x,\omega_i)$ ,需要估計類條件概率密度,因此屬於生成式模型。決策規則是最大后驗概率決策。

      可以證明,朴素貝葉斯在對數空間下是線性分類器(由於多個很小的數相乘會導致浮點數下界溢出的問題,實際使用中通常取對數)。

      既然是生成式模型,那現在的問題就是如何估計先驗概率 $P(\omega_i)$ 以及 $p(x_k|\omega_i)$ ,$i\in\{1,...,c\}$ 。

      先驗概率的估計可用MLE: $\hat P(\omega_i)=\dfrac{|D_i|}{|D|}$ ,其中 $|D_i|$ 是訓練集 $D$ 的全部樣本 $|D|$ 里屬於 $\omega_i$ 類的樣本數。$p(x_k|\omega_i)$ 的不同可以引出多種朴素貝葉斯算法,下面分別介紹。

      1. Gaussian Naïve Bayes,高斯NB

      使用參數方法,設特征分布服從高斯分布: $p(x_k|\omega_i)\sim N(\mu_{k,i},\sigma_{k,i}^2)$ ,則

$$\hat p(x_k|\omega_i)=\dfrac{1}{(2\pi)^{\frac12}\sigma_{k,i}}\exp(-\dfrac{(x_k-\mu_{k,i})^2}{2\sigma_{k,i}^2})$$

其中 $\mu_{k,i}$ 和 $\sigma_{k,i}^2$ 是 $\omega_i$ 類的樣本集在第 $k$ 維特征上的均值和方差,然后估計均值和方差即可。

      這里有個很有意思的地方:[3] 中指出,如果是二分類問題,並且假設各維特征的方差相等($\sigma_{k,i}=\sigma_{i}$),那么高斯NB對樣本 $(\textbf x,y)$ 屬於正類的后驗概率輸出值 $P(y=1|\textbf x)$ 剛好和二項Logistic回歸有相同的形式(就是說“模樣”是一樣的,即 $\dfrac{1}{1+\exp(-(\textbf w^{\top}\textbf x+b))}$ ),各個特征的權重 $\textbf w$ 以及偏置 $b$ 的表達式由先驗概率 $P(y=1)$ 和  $\mu_{k,i}$ 、$\sigma_{i}^2$ 唯一確定。

      2. Multinomial Naïve Bayes,多項式NB

      使用MLE估計:

$$\hat P(x_k|\omega_i)=\dfrac{|D_{i,x_k}|}{|D_i|}$$

分子表示 $\omega_i$ 類的訓練樣本構成的集合 $D_i$ 中,第 $k$ 個特征的取值為 $x_k$ 的樣本數。

      這里需要注意數據稀疏問題:如果后驗概率的連乘式里有一項是0,那么就會導致后驗概率為0。解決辦法是使用平滑:

$$\hat P(x_k|\omega_i)=\dfrac{|D_{i,x_k}|+\alpha}{|D_i|+\alpha c_k}$$

其中 $c_k$ 表示第 $k$ 維特征的可能取值的個數,系數 $\alpha$ 顯然需要非負。如果 $\alpha=1$ 就是Laplace平滑(加一平滑),相當於認為特征的分布是均勻分布,先驗地認為每個特征取值在每個類中出現一次;如果 $0\leq\alpha<1$ 就是Lidstone平滑。

      關於Laplace平滑,可以看看 [4] ,我掃了一眼感覺寫的很有趣~

      將朴素貝葉斯用到文檔分類,可以將后驗概率的表達式中連乘號的部分視作以多項式分布來生成文檔(在文檔的每個位置上生成一個詞項,多項式NB的形式就等價於一元語言模型,文檔中各個詞項存在條件獨立性)。那么,上式中的 $c_k$ 就是訓練集的詞表大小,而 $|D_{i,x_k}|$ 就是詞項 $x_k$ 在 $D_i$ 中出現的次數。

      看了一下sklearn的源碼,直接用一個矩陣乘法就可以完成所有類別的 $|D_{i,x_k}|$ 的求取:

      設訓練數據的特征矩陣為 $X\in\mathbb R^{n\times V}$( $n$ 是訓練樣本的個數,$V$ 是詞表大小),其每行都是一篇文檔的高維稀疏向量表示, $X_{ij}$ 就是詞表中的第 $j$ 個詞項在第 $i$ 篇文檔的詞頻 $\text{tf}_{j,i}$ ;訓練數據的標簽是 $y\in\mathbb R^n$ 。首先把 $y$ 轉化成one-hot標簽構成的矩陣:$Y\in\mathbb R^{n\times c}$ ,其中 $c$ 是類別個數,矩陣的每一行都是一篇文檔的one-hot標簽。那么,進行以下運算:

$$Y^{\top}X$$

得到一個 $\mathbb R^{c\times V}$ 的矩陣,其第 $i$ 行第 $j$ 列的元素就是詞表中的第 $j$ 個詞在類別 $\omega_i$ 的文檔集 $D_i$ 中出現的次數。

      所以說如果用多項式NB做文檔分類的話,最“正統”的文檔 $d$ 的向量表示是用詞頻 $\text{tf}_{t,d}$ 來表示,維數是詞表大小。但是sklearn的源碼中寫道:The multinomial Naive Bayes classifier is suitable for classification with discrete features (e.g., word counts for text classification). The multinomial distribution normally requires integer feature counts. However, in practice, fractional counts such as tf-idf may also work. 也就是說用 $\text{tf}_{t,d}\text{-idf}_{t}$ 來表示的話分類器也是work的。

      3. Bernoulli Naïve Bayes,多元貝努利NB

      多元貝努利NB等價於 BIM 模型,對詞表中的每個詞項都對應一個二值變量,為1表示詞項在文檔中出現,為0則表示沒有出現。這樣的做法在對長文檔分類時可能會出問題,因為沒有考慮詞頻,只考慮了詞的出現與否。

      公式就不擺了。話說上學期IR課的期末考試就有道題就是論證多元貝努利NB是否是線性分類器 = =。。。

      這里繼續附上sklearn庫中對於朴素貝葉斯算法的介紹:1.9. Naive Bayes 

      四、文本分類雜談

      文檔分類的傳統方法就是使用向量空間模型(Vector space model),利用詞袋(Bag-of-Words,BoW)或者Bag of n-gram,使用 Tf 或 Tf-idf 作為詞項的權重,進而對文檔進行表示(特征維數為訓練集的詞表大小),然后再接上NB、SVM、LR等線性分類器輸出文檔類別。這種高維稀疏的文檔向量表示通常會使用特征選擇方法來降低維數,如互信息MI、信息增益IG和卡方統計量等。此外,特征還可以是詞性特征,或者其他手工設計的特征,例如情感分類任務里可以利用情感詞典提取一些特征,比如正向情感詞占比等等。

      除此之外,還可以用話題模型(Topic model),如 LSA、pLSA 來得到文檔的分布向量表示(distributional representation),這兩種方式所得到的向量維數相對要小很多。

      現在來看的話,由於詞的分布式表示distributed representation,對於詞來說就是常說的word embedding,之前寫過博客)的出現,使得詞擁有了低維稠密的語義向量表示。這種方法可以稱為是基於表示學習的方法,其中有的是像上面的傳統方法一樣,無監督地獲得詞、句子或篇章的向量表示,不需要文檔的類別標記信息;也有針對給定的任務,端到端地完成分類過程(不需要手工提取特征,可以看作是神經網絡自動提取了特征),這種方法下神經網絡在對文本進行向量表示的過程中需要用到類別標記信息(因為是反向傳播來迭代更新的),是有監督的方式,因此得到的文本向量表示只能在本任務中使用,所以這種方法就是為了分類,不是得到一個通用的文檔向量表示。在這種端到端的分類模型中,通常會利用無監督模型(如Word2Vec)預訓練出詞向量(如果實驗語料足夠大就用語料本身,不夠大就用外部語料),作為初始值,並且在訓練模型的過程中進行fine-tuning。當然了,如果語料特別大,直接隨機初始化也是沒問題的。

      獲得詞級別的分布式表示方法,最經典的無監督方案就是Word2Vec和GloVe;有監督方案可以用fastText(相比於之前的CBOW,把預測中心詞改成了預測標簽;並且引入了n-grams信息來保留局部詞序,用Hierarchical Softmax加速,整個模型速度真的超快;由於這種方法的最終目的是做分類,文檔表示就是n-grams向量取平均值,所以也是一種有監督的文檔表示方法)。

      對於句子級別,最簡單的方法就是把句子里的詞的詞向量求平均值或求和得到句子向量,可以叫Neural BoW,也就是神經詞袋;“正式”一點的無監督學習句子嵌入的方法有Skip-thought等,也有一些新的方法比如CNN-LSTM auto-encoder。有監督的端到端分類方法有DAN(Iyyer et al., 2015,詞向量取平均再接全連接神經網絡)、CNN(word-level的CNN較早期的是14年Yoon Kim那篇經典的CNN for sentence classification、后續的還有char-level的CNN等)以及RNN、RecNTN(Socher et al, 2013)等。如果直接用這套方法做情感分類,名曰“自動提取特征”,和文本分類混為一談了……

      對於篇章級別,無監督的方法依然可以用Neural BoW,此外比較出名的有Doc2Vec(就是Word2Vec的作者在14年的那篇paragraph vector,這個模型相比於詞向量模型來說只是引入了paragraph vector作為文檔全局信息來輔助窗口詞去預測下一個詞,個人感覺有點太簡單了);端到端有監督的方法,簡單又快速的方法當屬fastText,除此之外的話通常是先對句子建模,再用句子進行語義組合成篇章,依舊是CNN、RNN之類,並且可以引入attention機制(反正這種有監督的方法就是在改網絡結構,attention那個公式看得我都要麻木了,真是群魔亂舞……)。

      做過的一些實驗

     下面簡單總結一下做過的三個文本分類作業,都是很簡單的,沒什么新意。

     I. 垃圾短信分類

      上學期和同學一起做了一個垃圾短信識別的作業,非常典型的短文本分類任務,語料為老師給的80w條短信,其中垃圾短信占1/10。語料只進行了常規的分詞、去標點等,沒有去停用詞;也沒有處理正負類樣本的類不平衡。下面是部分結果(都沒調過參數,要么默認值,要么隨手設的,或者是以前其他實驗用過的參數;有五個結果的意思是把數據集分成了五組,每組都做了一次測試集)。其中,fastText是原版的C++,SVM是小伙伴用Matlab做的,其余都是Python。DAN是低配版,其實叫Neural BoW更合適,就是在短信語料上用Skip-gram預訓練詞向量,將短信中的詞的詞向量直接求和得到句子向量,然后接兩層全連接神經網絡,詞向量在訓練分類器時不更新,本質上是個無監督特征提取 + 分類器的方案,而不是一個端到端的方案。訓練時間那里包含訓練詞向量的時間和訓練分類器的時間。

      可以清楚地看到,同樣是訓練詞向量和分類器的情況下,fastText在速度上的優勢非常明顯;端到端基於詞的CNN的效果是最好的,幾個指標都在99%以上,而端到端LSTM的效果沒有DAN好,表格太長了沒法截到一頁里。

      可能觀眾朋友們想問為什么只比較了這幾種方法,而且連參數都不划個驗證集調一下?我的回答是。。。因為一開始只做了這幾個方法,發現效果都不錯(至少我們可以接受。。。),就沒有繼續做這種體力活了。。。

      II. 搜狗2006年新聞內容分類

      上個實驗我只是友情客串,當時我沒選那個課,所以也就沒做的太仔細。這個實驗相對來說做的要完整一點,雖然我還是有很多不滿意的地方。

      這個實驗數據來自於這學期的一門討論課,是搜狗實驗室2006年公布的一批中文新聞內容分類數據(應該是歷史產物,現在搜狗官方的新聞語料已經是2012年的了;最近看到了一篇講實操的博客,似乎用的語料也不一樣),包括9個類別(比如財經、體育等等),每個類別1990篇新聞()。用8:2的比例划了訓練數據和測試數據;在訓練數據上,平均每篇文檔有823個token。因為數據量不算大,所以涉及調參的過程都是在訓練數據上用四折交叉驗證,沒有單獨划驗證集出來。

      既然做實驗就要有做實驗的目的。在這個數據集上實驗的目的是:考察單分類器和分類器集成的效果對比。所以,在預處理后用無監督的方法提特征,得到文檔向量表示,並沒有使用任何一種端到端的神經網絡方法。

      使用四種方法來得到文檔向量:基於BoW的Tf和Tf-idf、基於話題模型的LDA、基於分布式表示的Doc2Vec。四組特征的基本信息:

      比較了五個單分類器:線性分類器,包括 Naïve Bayes、Logistic Regression、線性SVM;基於樹的分類器,包括Random Forest、GBRT。

      由於BoW得到的特征是高維稀疏的,之后進行了特征選擇。采用兩種方法:互信息和卡方統計量,在訓練數據上做四折交叉驗證,驗證集的F1-micro隨保留特征的百分比變化的變化趨勢如下圖:左圖是Tf特征,右圖是Tf-idf特征;圓點是卡方,方塊是互信息;每種顏色代表一種分類器。橫軸表示保留特征的百分比,越靠右則保留的越多。

可以非常勉強地看出,卡方的效果總體上略好於互信息。此外,各特征與各分類器的結合,對於特征選擇的反映狀況是不一樣的。

      下面就是分類實驗了,每種分類器在各組特征表示下的超參數都相同(沒有刻意調過,都是默認值或者隨手設的值)。其中Tf特征和Tf-idf特征依照上面特征選擇的結果進行了特征選擇。結果如下:

大致有如下幾個結論(換了數據集就不一定成立了):1. Naïve Bayes分類器搭配Tf特征的效果要好於搭配Tf-idf;2. SVM分類器搭配Tf-idf后,效果顯著好於搭配Tf;3. Logistic Regression搭配Tf特征取得了最好的效果;4. 除了Tf特征外,在Tf-idf特征、LDA特征、Doc2Vec特征表示下,GBRT的效果都是五個分類器里最好的且SVM的效果都是第二好的,可見GBRT的強大,難怪在Kaggle里這么火;5. LDA特征單獨使用,也就是直接拿來做分類的話,效果不佳,可能的原因是參數(主題個數、$\alpha$ 、$\beta$ )不好;6. Doc2Vec特征的效果最差,可能的原因也是參數不好,如果拋開模型本身太簡單的因素,最本質的原因是數據集太小了,原文里拿來做實驗的數據集是10w級。

      接下來就是分類器集成的實驗。首先就是最簡單的投票法(Voting),將五個單分類器的結果投票。結果里可以看出,只有Tf特征下投票提升了最好的單分類器的效果,但是所有投票后的結果都好於第二好的單分類器。所以如果單分類器里有很強的分類器(這里就是GBRT)的話,投票是沒有必要的。

      然后是堆疊法(Stacking),這里用的是兩層,第一層是五個基分類器,第二層是GBRT。為了連貫性,喂給堆疊法的Tf特征和Tf-idf特征都沒做特征選擇;所以為了嚴謹,這個表格在Tf特征和Tf-idf特征下的效果所對比的是沒做特征選擇時這兩種特征的單分類器結果(沒有列出來)。從結果看到,Stacking大部分情況下都可以提升單分類器的效果,並且在各種情況下全部beat了Voting;Tf-idf特征表示的情況下,Stacking取得了在本實驗過程中最好的效果。

      大致內容就是這些,不太好的地方:沒有嘗試Bag of n-gram(數據稀疏問題應該比BoW更嚴重),而且沒有比較LDA特征輔助其他特征時會不會提升效果;此外,端到端的方法沒有做。

      另外,在其他組做presentation時,聽到了如下幾點印象比較深的:

      1. 用聚類來做,然后和label進行比較。我覺得純屬多此一舉,先不說訓練集的標簽被浪費了,在聚成幾個類之后,怎么描述每個類呢,就是說給每個類打什么標簽呢?

      2. 端到端word-level的CNN效果在90%,但是我沒聽清楚他們的指標是accuracy還是什么,而且語料預處理、訓練集測試集的划分都不一樣,后來我問了一下,他們做的時候是把文檔當成句子來做的。char-level的CNN效果很差。

      3. 如果爬取今年的新聞做測試集,效果會奇差無比。這是因為數據的分布變了,每年的熱點都在變,用詞也在變,所以數據分布不同了,效果自然不會好。

      III. 評論情感分類

      這個數據集也是來自這學期的討論課,是三個領域(酒店、圖書、筆記本)的中文評論數據,每個領域2000條。這個數據集實在是太小了,沒做出什么東西來。

      比較特別的地方在於,我們跨領域去訓練分類器,比如:用酒店領域的數據訓練,筆記本領域的數據做測試集,這樣做違背了機器學習的基本假設(訓練數據和測試數據有相同分布),結果顯然是:不管是傳統方法(BoW,沒有設計其他人工特征)還是端到端的深度學習方法(試了fastText和word-level的CNN),一旦訓練數據混入了其他領域數據,效果都會下降。在此之前用 Jensen-Shannon散度算了一下三個領域之間兩兩的相對距離,發現都挺大的……

$$D_{KL}(S||T)=\sum_{w_i}S(w_i)\log\frac{S(w_i)}{T(w_i)}$$

$$D_{JS}(S||T)=\frac12D_{KL}(S||M)+\frac12D_{KL}(T||M),\quad M=\frac12(S+T)$$

      實際上,包括傳統方法和深度學習方法,很早就有做領域自適應情感分類的paper了。比如其中一種傳統方法是利用pivot feature,而深度學習方法可以用autoencoder,這里就不展開了。

 

 

 

參考資料:

[1] 《信息檢索導論》及slides

[2]《統計學習方法》

[3] Tom M. Mitchell 的《Machine Learning》新版,CHAPTER 3 (這是 [2] 列出的第一篇參考文獻)

[4] 理解朴素貝葉斯分類的拉普拉斯平滑


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM