隔了很久沒有寫資料挖掘系列的文章了,今天介紹一下樸素貝葉斯分類算法,講一下基本原理,再以文本分類實踐。
一個簡單的例子
樸素貝葉斯算法是一個典型的統計學習方法,主要理論基礎就是一個貝葉斯公式,貝葉斯公式的基本定義如下:

這個公式雖然看上去簡單,但它卻能總結曆史,預知未來。公式的右邊是總結曆史,公式的左邊是預知未來,如果把Y看出類别,X看出特征,P(Yk|X)就是在已知特征X的情況下求Yk類别的機率,而對P(Yk|X)的計算又全部轉化到類别Yk的特征分布上來。
舉個例子,大學的時候,某男生經常去圖書室晚自習,發現他喜歡的那個女生也常去那個自習室,心中竊喜,于是每天買點好吃點在那個自習室蹲點等她來,可是人家女生不一定每天都來,眼看天氣漸漸炎熱,圖書館又不開空調,如果那個女生沒有去自修室,該男生也就不去,每次男生鼓足勇氣說:“嘿,你明天還來不?”,“啊,不知道,看情況”。然後該男生每天就把她去自習室與否以及一些其他情況做一下記錄,用Y表示該女生是否去自習室,即Y={去,不去},X是跟去自修室有關聯的一系列條件,比如當天上了哪門主課,蹲點統計了一段時間後,該男生打算今天不再蹲點,而是先預測一下她會不會去,現在已經知道了今天上了常微分方法這麼主課,于是計算P(Y=去|常微分方程)與P(Y=不去|常微分方程),看哪個機率大,如果P(Y=去|常微分方程) >P(Y=不去|常微分方程),那這個男生不管多熱都屁颠屁颠去自習室了,否則不就去自習室受罪了。P(Y=去|常微分方程)的計算可以轉為計算以前她去的情況下,那天主課是常微分的機率P(常微分方程|Y=去),注意公式右邊的分母對每個類别(去/不去)都是一樣的,是以計算的時候忽略掉分母,這樣雖然得到的機率值已經不再是0~1之間,但是其大小還是能選擇類别。
後來他發現還有一些其他條件可以挖,比如當天星期幾、當天的天氣,以及上一次與她在自修室的氣氛,統計了一段時間後,該男子一計算,發現不好算了,因為總結曆史的公式:
這裡n=3,x(1)表示主課,x(2)表示天氣,x(3)表示星期幾,x(4)表示氣氛,Y仍然是{去,不去},現在主課有8門,天氣有晴、雨、陰三種、氣氛有A+,A,B+,B,C五種,那麼總共需要估計的參數有8*3*7*5*2=1680個,每天隻能收集到一條資料,那麼等湊齊1680條資料大學都畢業了,男生打呼不妙,于是做了一個獨立性假設,假設這些影響她去自習室的原因是獨立互不相關的,于是
有了這個獨立假設後,需要估計的參數就變為,(8+3+7+5)*2 =
46個了,而且每天收集的一條資料,可以提供4個參數,這樣該男生就預測越來越準了。
樸素貝葉斯分類器
講了上面的小故事,我們來樸素貝葉斯分類器的表示形式:
當特征為為x時,計算所有類别的條件機率,選取條件機率最大的類别作為待分類的類别。由于上公式的分母對每個類别都是一樣的,是以計算時可以不考慮分母,即
樸素貝葉斯的樸素展現在其對各個條件的獨立性假設上,加上獨立假設後,大大減少了參數假設空間。
在文本分類上的應用
文本分類的應用很多,比如垃圾郵件和垃圾短信的過濾就是一個2分類問題,新聞分類、文本情感分析等都可以看成是文本分類問題,分類問題由兩步組成:訓練和預測,要建立一個分類模型,至少需要有一個訓練資料集。貝葉斯模型可以很自然地應用到文本分類上:現在有一篇文檔d(Document),判斷它屬于哪個類别ck,隻需要計算文檔d屬于哪一個類别的機率最大:
在分類問題中,我們并不是把所有的特征都用上,對一篇文檔d,我們隻用其中的部分特征詞項<t1,t2,...,tnd>(nd表示d中的總詞條數目),因為很多詞項對分類是沒有價值的,比如一些停用詞“的,是,在”在每個類别中都會出現,這個詞項還會模糊分類的決策面,關于特征詞的選取,有介紹。用特征詞項表示文檔後,計算文檔d的類别轉化為:
注意P(Ck|d)隻是正比于後面那部分公式,完整的計算還有一個分母,但我們前面讨論了,對每個類别而已分母都是一樣的,于是在我們隻需要計算分子就能夠進行分類了。實際的計算過程中,多個機率值P(tj|ck)的連乘很容易下溢出為0,是以轉化為對數計算,連乘就變成了累加:
我們隻需要從訓練資料集中,計算每一個類别的出現機率P(ck)和每一個類别中各個特征詞項的機率P(tj|ck),而這些機率值的計算都采用最大似然估計,說到底就是統計每個詞在各個類别中出現的次數和各個類别的文檔的數目:
其中,Nck表示訓練集中ck類文檔的數目,N訓練集中文檔總數;Tjk表示詞項tj在類别ck中出現的次數,V是所有類别的詞項集合。這裡對詞的位置作了獨立性假設,即兩個詞隻要它們出現的次數一樣,那不管它們在文檔的出現位置,它們大機率值P(tj|ck)都是一樣,這個位置獨立性假設與現實很不相符,比如“放馬屁”跟“馬放屁”表述的是不同的内容,但實踐發現,位置獨立性假設得到的模型準确率并不低,因為大多數文本分類都是靠詞的差異來區分,而不是詞的位置,如果考慮詞的位置,那麼問題将表達相當複雜,以至于我們無從下手。
然後需要注意的一個問題是ti可能沒有出現在ck類别的訓練集,卻出現在ck類别的測試集合中,這樣因為Tik為0,導緻連乘機率值都為0,其他特征詞出現得再多,該文檔也不會被分到ck類别,而且在對數累加的情況下,0值導緻計算錯誤,處理這種問題的方法是采樣加1平滑,即認為每個詞在各個類别中都至少出現過一次,即
下面這個例子來自于參考文獻1,假設有如下的訓練集合測試集:
現在要計算docID為5的測試文檔是否屬于China類别,首先計算個各類的機率,P(c=China)=3/4,P(c!=China)=1/4,然後計算各個類中詞項的機率:
注意分母(8+6)中8表示China類的詞項出現的總次數是8,+6表示平滑,6是總詞項的個數,然後計算測試文檔屬于各個類别的機率:
可以看出該測試文檔應該屬于CHina類别。
文本分類實踐
我找了的曆史簡潔版,總共包括汽車、财經、it、健康等9類新聞,一共16289條新聞,搜狗給的資料是每一篇新聞用一個txt檔案儲存,我預處理了一下,把所有的新聞文檔儲存在一個文本檔案中,每一行是一篇新聞,同時保留新聞的id,id的首字母表示類标,預處理并分詞後的示例如下:
我用6289條新聞作為訓練集,剩餘1萬條用于測試,采用互資訊進行文本特征的提取,總共提取的特征詞是700個左右。
分類的結果如下:
總共10000條新聞,分類正确的8343條,正确率0.8343,這裡主要是示範貝葉斯的分類過程,隻考慮了正确率也沒有考慮其他評價名額,也沒有進行優化。貝葉斯分類的效率高,訓練時,隻需要掃描一遍訓練集,記錄每個詞出現的次數,以及各類文檔出現的次數,測試時也隻需要掃描一次測試集,從運作效率這個角度而言,樸素貝葉斯的效率是最高的,而準确率也能達到一個理想的效果。
我的實作代碼如下:
代碼裡面,計算特征詞與訓練模型、測試是分開的,需要修改main方法,比如計算特征詞:
訓練模型:
預測模型:
總結
本文介紹了樸素貝葉斯分類方法,還以文本分類為例,給出了一個具體應用的例子,樸素貝葉斯的樸素展現在條件變量之間的獨立性假設,應用到文本分類上,作了兩個假設,一是各個特征詞對分類的影響是獨立的,另一個是詞項在文檔中的順序是無關緊要的。樸素貝葉斯的獨立性假設在實際中并不成立,但在分類效上依然不錯,加上獨立性假設後,對與屬于類ck的謀篇文檔d,其p(ck|d)往往會估計過高,即本來預期p(ck|d)=0.55,而樸素貝葉斯卻計算得到p(ck|d)=0.99,但這并不影響分類結果,這是樸素貝葉斯分類器在文本分類上效果優于預期的原因。
參考文獻:
王斌 譯..
人民郵電出版社
codemeals. .
cnblogs.
李航.統計學習方法.清華大學出版社
陳希孺. 機率論與數理統計.中國科學技術出版社.
轉載請注明出處: