樸素貝葉斯分類器原理與實戰(影評情感分析)
樸素貝葉斯分類演算法是監督學習演算法里的一種,同時它也是一種生成演算法,不同於邏輯回歸,KNN,SVM,決策樹之類的判別演算法。判別演算法是直接學習得到輸出 和特徵 之間的關係,比如決策函數 或者條件分布 。而生成演算法樸素貝葉斯則是基於特徵之間相互獨立的假設(這也是為什麼稱為「樸素」的原因)學習出輸出 和特徵 的聯合分布 ,然後利用公式 得出。
目錄
一、原理
1. 統計學背景2. 樸素貝葉斯模型二、實戰
1. 讀取數據2. 數據清理3.創造特徵(Bag of words)4. 訓練模型,交叉驗證5. 預測三、結論1. 樸素貝葉斯優缺點2. 常見應用場景
一、原理
1. 統計學背景
貝葉斯學派的思想可以概括為先驗概率+數據=後驗概率。也就是說我們在實際問題中需要得到的後驗概率,可以通過先驗概率和數據一起綜合得到。所謂的先驗概率就是一種「經驗」,貝葉斯學派假設了先驗分布的模型,比如正態分布等,雖然被當時的主流頻率學派所詬病,但在實際應用中卻表現地良好。
2. 樸素貝葉斯模型
設分類器的輸出 有 種類別,分別為 ,而 取決於特徵向量 ,貝葉斯公式可以表示為如下形式:
因為有各個特徵之間相互獨立的假設,所以
故有
當訓練集給定時, 相當於一個常數,所以在測試集上,由輸入的特徵向量 做分類時,只用比較上式的分子即可,因為分母的值是一樣的,所以有
其中, 即類別 出現的概率,由極大似然估計,可以得到它等於 出現的次數除以樣本總數。但是 的計算就要取決於先驗條件。
(1) 如果 是連續值,我們通常取其先驗概率為正態分布,有
其中參數 可由最大似然估計得到。
(2) 如果 是離散值,那就假設其服從多項式分布,這樣得到 是在類別 中, 出現的頻率。另外,考慮到測試集中數據可能在訓練集中沒有出現的情況,從而導致 等於0,所以引入了拉普拉斯平滑(也叫+1平滑),此時有
其中 通常取1,也就是讓特徵為 的時候,被分類為 的頻次 加1。 為輸出 可能的種類數。
(3) 如果 是非常稀疏的離散值,即各個特徵出現的概率非常低,這時就假設 符合伯努利分布,即特徵 出現記為1,不出現記為0。所以我們不關注 的次數,只要出現即可。這時有
其中, 取值為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——降低機器學習門檻的利器
※人性本惡,機器本善?