跟我學做菜吧!sklearn快速上手!用樸素貝葉斯/SVM分析新聞主題

多圖預警!

過年在家好無聊啊,於是開始自己瞎搞scikit-learn。作為一個簡潔、強大、內容豐富的python機器學習庫,scikit-learn幾乎包含了從預處理到產出模型的方方面面。本文旨在提供一個用scikit-learn從獲取數據到訓練模型的完整過程的簡單教程,希望讀者都可以親自動手用機器學習完成一些簡單的task。

本文中可能用到的python庫

  • numpy
  • scipy
  • sklearn
  • matplotlib

Step 1:獲取原始數據

嘛,既然是分析新聞,那我們當然是需要獲得新聞樣本。好在sklearn已經為我們準備好了一個新聞文本的數據集,用datasets中的fetch_20newsgroups即可導入

得到的數據放在變數news中,稍微檢查一下就發現,news.data包含了18846篇新聞稿, news.targets則包含了他們對應的主題。

顯然,我們的任務就是讓機器學習如何判斷不同的新聞各自屬於什麼主題

Step 2: 詞頻向量化

如何將一篇篇的新聞轉化為機器能夠理解的特徵向量呢?一個顯而易見的方法就是分析每個單詞出現的頻率。如果一些特定的單詞在某篇新聞里經常出現(比如baseball會在關於棒球比賽的新聞里高頻出現)我們就有理由認為它們與主題存在聯繫。

sklearn已經將這個詞頻向量化的方法方便的封裝了:

我們得到的X是一個矩陣,其列向量代表整個訓練集中出現過的單詞,行向量代表每一篇新聞,所以每個元素X[i, j]就是在第i篇文章中第i個單詞出現的次數。

可以想像,這樣的表示方法必然會產生大量為0的元素,換句話說,X是一個稀疏矩陣。因此sklearn採用scipy中的壓縮矩陣來存儲X。

*Optional Step:用TF-IDF方法為數據加權

我們的詞頻向量化方法有一個顯然的不足:一些常用的詞如 is a what 在每篇文章中都會有很高的出現頻率,但是它們對分辨新聞的主題幾乎沒有幫助。為了提高那些真正蘊含主題信息的單詞的權重,而不是讓它們淹沒在 is 和 what的海洋里,我們可以用TF-IDF方法為數據加權。

TF-IDF是一種統計方法,用以評估一字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成反比下降。

下面我們用TF-IDF方法處理數據集

為了直觀的顯現經過TF-IDF處理後數據集分布的變化,我畫了前後兩張條形圖作為對比。圖中x軸是各個單詞的編號,y軸是其出現的頻率

TF-IDF處理前

TF-IDF處理後

對比兩張圖可以看到一些單詞的權重經過了顯著的調整。樣本變得更加合理。之後我們會用這兩個數據集擬合同一個模型,來驗證TF-IDF對訓練效果的提升。

Step 3:分割數據集

當然就是把X和y分割為訓練集和測試集啦。這裡我們會吧原始數據和經TF-IDF處理過的數據各分割一次。

參數test_size表示測試集占數據集的比例。random_state類似於一個隨機數的種子,用來shuffle樣本。我們的兩次劃分採用相同的random_state,保證兩組訓練集和測試集具有完全相同的劃分。

Step 4:訓練樸素貝葉斯模型並評估效果

樸素貝葉斯模型是一種簡單而有效的分類器,尤其適用於文本分析。其假定每個特徵都是獨立的,這一較強的假設帶來的優點是其需要估計的參數規模幾乎是線性的,帶來了效率的極大提升。同時其缺點亦在於對特徵相關性較強的分類任務效果不佳。

我們使用兩個樸素貝葉斯模型分別擬合經TF-IDF處理和未經處理的數據

即便數據的特徵數量達到了10e5量級,擬合仍然很快就完成了。

接下來的任務是評估擬合效果。除了簡單的在測試集上測試其準確度(Accuracy),我們在很多時候希望知道模型的查准率(Precision)、召回率(Recall)和F1-score。sklearn.metrics中的classification_report可以自動生成每一個label對應的評估標準。

未經TF-IDF處理的數據的擬合效果:

經TF-IDF處理後數據集的擬合效果:

Step 5:訓練SVM並評估效果

這裡需要特別注意:我們的數據集屬於典型的特徵數量遠大於樣本數量。在這種情況下 rbf kernel(Gaussian kernel)的SVM有非常高的過擬合風險。因此我們採用linear kernel進行擬合。

看了半集銀他媽後,訓練完成了

評估訓練效果的方式與前文相同

在本例中,linear SVM的效果要優於樸素貝葉斯,但相應的,我們付出了更多的時間代價。

文中的代碼放在了TheodoreYin/news_classification_nb-svm

以上

推薦閱讀:

Jeff Dean執筆谷歌團隊2017年終總結,乾貨滿滿
吳恩達 DeepLearning.ai 課程提煉筆記(4-2)卷積神經網路 --- 深度卷積模型

TAG:机器学习 | Python | 数据挖掘 |