前不久,我們使用NLTK的貝葉斯分類模型垃圾對簡訊資料進行機器學習的垃圾簡訊識別。
其實除了使用NLTK,我們還可以使用Scikit-Learn這個整合了諸多機器學習演算法的模組進行上述的實驗。
Scikit-Learn的API設計非常合理和高效,對於初觸機器學習的同學來說非常友好,值得大家嘗試和使用。本人也經常在實驗環境和工作環境中使用scikit-learn進行機器學習的建模。
下面,我們就使用scikit-learn模組,通過其樸素貝葉斯演算法API對簡訊資料進行一次垃圾簡訊的識別。
匯入簡訊資料
首先,我們需要對原始的簡訊資料進行處理,匯入pandas模組和jieba模組。
pandas模組用於讀取和處理資料,jieba模組用於對簡訊進行分詞。
接著,我們匯入簡訊資料:
檢視一下部分簡訊資料:
其中第一列為原始序號,第二列為簡訊的分類,0表示正常簡訊,1表示垃圾簡訊,第三列就是簡訊的正文。
我們只需要關注第二和第三列。
檢視一下這個簡訊資料集的形狀:
一共有七十餘萬條簡訊。
對簡訊進行分詞
文字的分類,基本上是基於詞袋模型,也就是一個文字中包含多少詞以及各個詞的頻率。對於英文而已,其天生的句子空格可以很容易的分割單詞出來,但是中文就得先進行分詞處理,也就是將一個完整的中文分割為一個一個詞。
在Python中,有第三方模組——jieba,結巴分詞來提供對中文的分詞。
我們使用jieba對簡訊的內容進行分詞。
得到的結果如下:
提取特徵和目標資料
我們需要分別提取出特徵資料和目標資料,特徵資料表示輸入的資料,目標資料則是輸入資料的屬性,在這裡,簡訊內容就是特徵資料,簡訊的分類就是目標資料。
X中都是特徵資料,y中都是目標資料,便於下一步的分割訓練集和測試集。
分割訓練集和測試集
使用sklearn的分割模組對訓練集和測試集進行分割:
提取文字特徵
從文字中提取特徵,需要利用到scikit-learn中的CountVectorizer()方法和TfidfTransformer()方法。
CountVectorizer()用於將文字從標量轉換為向量,TfidfTransformer()則將向量文字轉換為tf-idf矩陣。
建立樸素貝葉斯分類器並進行訓練
樸素貝葉斯是一個很經典同時準確率也很高的機器學習演算法,用它來做分類器可以得到很好的效果。
在scikit-learn中,每一個模型都會有一個fit()方法用來模型訓練,有一個predict()方法用來模型預測,在此我們就傳入了訓練特徵和訓練目標進行了模型的訓練。
模型測試
模型訓練好之後,我們可以使用模型的predict()方法來測試與預測資料。
在這之前,我們還得進行另外一步。
因為之前對文字提取特徵只是針對於訓練集,測試集並沒有進行,所以我先對測試集進行文字特徵提取:
再使用predict()方法進行預測:
變數predicted_categories中包含的就是所有的預測結果。
模型評估
scikit-learn模組中內建了很多模型評估的方法,對於分類問題,我們可以使用accuracy_score()方法,其返回一個數值,得分最高為1。
列印出來的結果顯示:
這個分類器的準確率達到了0.98,比上一次使用NLTK的貝葉斯演算法高出了10%,很不錯。
可以列印部分測試的簡訊資料以及預測的結果來看:
基本上正常簡訊和垃圾簡訊都被正確識別出來了。
文章首發:zmister.com/archives/17…
Python爬蟲、資料分析、機器學習、滲透測試、Web開發、GUI開發
州的先生:zmister.com/