樸素貝葉斯分類器原理與實戰(影評情感分析)

樸素貝葉斯分類演算法是監督學習演算法里的一種,同時它也是一種生成演算法,不同於邏輯回歸,KNN,SVM,決策樹之類的判別演算法。判別演算法是直接學習得到輸出  Y 和特徵  X 之間的關係,比如決策函數 Y=fleft( X 
ight) 或者條件分布  Pleft( Y | X 
ight) 。而生成演算法樸素貝葉斯則是基於特徵之間相互獨立的假設(這也是為什麼稱為「樸素」的原因)學習出輸出  Y 和特徵  X 的聯合分布 Pleft( X,Y 
ight) ,然後利用公式 Pleft( Y | X 
ight) =Pleft( X,Y 
ight) /Pleft( X 
ight) 得出。

目錄

一、原理

1. 統計學背景

2. 樸素貝葉斯模型

二、實戰

1. 讀取數據

2. 數據清理

3.創造特徵(Bag of words)

4. 訓練模型,交叉驗證

5. 預測

三、結論

1. 樸素貝葉斯優缺點

2. 常見應用場景

一、原理

1. 統計學背景

貝葉斯學派的思想可以概括為先驗概率+數據=後驗概率。也就是說我們在實際問題中需要得到的後驗概率,可以通過先驗概率和數據一起綜合得到。所謂的先驗概率就是一種「經驗」,貝葉斯學派假設了先驗分布的模型,比如正態分布等,雖然被當時的主流頻率學派所詬病,但在實際應用中卻表現地良好。

2. 樸素貝葉斯模型

設分類器的輸出  yk 種類別,分別為  c_1,c_2,...,c_k ,而 取決於特徵向量  oldsymbol{x}=left( x_1,x_2...,x_n 
ight) ,貝葉斯公式可以表示為如下形式:

 Pleft( y=c_m | x_1,...,x_n 
ight) =frac{Pleft( y=c_m 
ight) Pleft( x_1,...,x_n | y=c_m 
ight)}{Pleft( x_1,...,x_n 
ight)}

因為有各個特徵之間相互獨立的假設,所以

 Pleft( x_i | y=c_m,x_1,...,x_{i-1,}x_{i+1},...,x_n 
ight) =Pleft( x_i | y=c_m 
ight)

故有

Pleft( y=c_m | x_1,...,x_n 
ight) =frac{Pleft( y=c_m 
ight) prod_{i=1}^n{Pleft( x_i | y=c_m 
ight)}}{Pleft( x_1,...,x_n 
ight)}

當訓練集給定時, Pleft( x_1,...,x_n 
ight) 相當於一個常數,所以在測試集上,由輸入的特徵向量 oldsymbol{x}=left( x_1,x_2...,x_n 
ight) 做分類時,只用比較上式的分子即可,因為分母的值是一樣的,所以有

 hat{y}=underset{y=c_m}{argmax}Pleft( y=c_m | x_1,...,x_n 
ight) =underset{y=c_m}{argmax}Pleft( y=c_m 
ight) prod_{i=1}^n{Pleft( x_i | y=c_m 
ight)}

其中, Pleft( y=c_m 
ight) 即類別 c_m 出現的概率,由極大似然估計,可以得到它等於 c_m 出現的次數除以樣本總數。但是  Pleft( x_i | y 
ight) 的計算就要取決於先驗條件。

(1) 如果  x_i 是連續值,我們通常取其先驗概率為正態分布,有

 Pleft( x_i | y 
ight) =frac{1}{sqrt{2pi sigma _{y}^{2}}}exp left( -frac{left( x_i-mu _y 
ight) ^2}{2sigma _{y}^{2}} 
ight)

其中參數  mu _y,sigma _y 可由最大似然估計得到。

(2) 如果 x_i 是離散值,那就假設其服從多項式分布,這樣得到  Pleft( x_i | y 
ight) 是在類別 y 中,  x_i 出現的頻率。另外,考慮到測試集中數據可能在訓練集中沒有出現的情況,從而導致 Pleft( x_i | y 
ight) 等於0,所以引入了拉普拉斯平滑(也叫+1平滑),此時有

 Pleft( x_i | y 
ight) =frac{N_{yi}+lambda}{N_y+nlambda}

其中  lambda 通常取1,也就是讓特徵為  x_i 的時候,被分類為  y 的頻次 N_{yi} 加1。  N_y 為輸出  y 可能的種類數。

(3) 如果  x_i 是非常稀疏的離散值,即各個特徵出現的概率非常低,這時就假設  x_i 符合伯努利分布,即特徵  x_i 出現記為1,不出現記為0。所以我們不關注 x_i 的次數,只要出現即可。這時有

 Pleft( x_i | y 
ight) =Pleft( i | y 
ight) x_i+left( 1-Pleft( i | y 
ight) 
ight) left( 1-x_i 
ight)

其中,  x_i 取值為1或者0。

上面所講都是原理上的東西,結合一個例子就更加容易理解了,這裡推薦一個鏈接,講的挺清楚:帶你搞懂樸素貝葉斯分類演算法。

二、實戰

在文本分析中,很多地方會用到樸素貝葉斯演算法來做分類,比如文本分類、垃圾文本過濾和情感判別。這次實戰內容就根據影評來做情感判別,也就根據電影的評論來判斷這是一段「好評」還是一段「差評」。

在Kaggle上有這樣一個比賽Bag of Words Meet Bags of Popcorn,它的數據來自於國外一個類似豆瓣電影的影評網站IMDB,大概有十萬條影評,其中包括正面評價和負面評價。大家都知道,凡是一部電影上映以後,捧的噴的大有人在,當然還有很多水軍(做一個判別是不是水軍評論的模型是不是也比較有意思?哈哈),有些噴子還不直接說它爛,會說些諷刺的反話,有時候讓人來判別都不知道是不是友軍。隨便截了張刀劍神域最近劇場版的一個評論,大家可以感受下。。

好了,廢話不多說了,我們開始寫代碼。先看看數據把,主要數據有labeledTrainData,unlabeledTrainData和testData,由於樸素貝葉斯演算法是一個監督學習演算法嘛,我就只用labeledTrainData來做訓練,testData來做預測,最後可以把結果提交到Kaggle上看看得分。

① 讀取數據

數據長下面這個樣子,sentiment就是它的類別,1代表正面評論,0代表負面評論,review就是對應的評論。一共25000個數據。

② 數據清理

可以看到,review中有一些HTML標籤,我們可以用強大的BeautifulSoup庫來做,寫過爬蟲的同學應該不會陌生。然後我們需要把標點符號等一些不是文字的東西去掉,但是這也不是說一定得做的,比如現在一些常用的顏文字可能就很能表現出評論者的心態,比如~(≧▽≦)/~。所以去不去掉還是看自己了,這裡我還是去掉,用正則表達式好了。最後一件重要的事就是把stop words去掉,它指一些經常出現的詞,比如a,and,the等等,這對統計沒有太大意義,可以從nltk庫中下載這些詞,運行下面的代碼即可,不過文件似乎有些大,會比較慢。

最後寫一個數據清理的函數,方便重複利用。

對了,推薦一個工具庫tqdm,可以方便看到進度條,感覺不錯。

數據清理完以後,就長下面這個樣子,方便後面的Bag of words。

③ 創造特徵(Bag of words)

Bag of words模型是信息檢索領域常用的文檔表示方法,它忽略了文檔單詞的順序和語法、句法等要素,將其僅僅看做若干辭彙的集合,文檔中每個單詞的出現都是獨立的。舉個例子,現在數據集里有兩個句子:

句子1:The cat sat on the hat

句子2:The dog ate the cat and the hat

所以,我們的詞庫就是{ the, cat, sat, on, hat, dog, ate, and },Bag of words就以詞庫的單詞數為特徵維數,對應元素就是該位置單詞在該句子中出現的次數,比如

句子1:{ 2, 1, 1, 1, 1, 0, 0, 0 }

句子2:{ 3, 1, 0, 0, 1, 1, 1, 1}

本例子中,由於辭彙很多,故人為設定詞庫單數為5000,不然計算量太大。

④ 訓練樸素貝葉斯分類器,並進行交叉驗證

前面原理講了很多,用sklearn實現也就幾行代碼,是不是很方便,至於什麼是K折交叉驗證,就請看我專欄里以前的博客吧,有詳細講解。最後得分0.917,還算不錯。

⑤ 預測並提交結果

最後在Kaggle上的得分0.83968,不算很高,有興趣的朋友在創造特徵那一步可以試試TF-IDF模型,效果應該會比Bag of words好一些。

三、結論

1. 樸素貝葉斯優缺點

優點:

① 速度快

② 對多分類問題同樣有效,複雜度也不會大程度上升

③ 訓練樣本的量不需要很多

④ 對於類別型輸入的特徵效果很好,數值型特徵默認是符合正態分布

缺點:

① 樸素貝葉斯是在特徵之間相互獨立的假設下推導的,但是往往現實情況數據很難是相互獨立的。

② 如果測試集中一個特徵在訓練集中從未出現過,其概率算出來是0,這樣算出來的最後結果就沒意義了,所以引入了拉普拉斯平滑的技術。在前面原理部分有寫。

2. 常見應用場景

① NLP(自然語言處理)

② 多分類實時預測

③ 推薦系統:樸素貝葉斯和協同過濾結合使用。

參考

[1]NLP系列(4)_樸素貝葉斯實戰與進階

[2]Kaggle : Bag of words

[3]Sklearn : Naive Bayes

[4]《統計學習方法》李航

推薦閱讀:

從建立清晰的步驟開始——Machine Learning Project Checklist
AutoML——降低機器學習門檻的利器
人性本惡,機器本善?

TAG:機器學習 | 大數據 | 自然語言處理 |