1.概念介紹。
機器學習我們一般可以分爲兩大類,模式識別和異常檢測。從行爲來看,模式識別和異常檢測邊界比較模糊。在模式識別中,我們試圖發現隱藏在數據中的顯式或潛在的特性,形成特徵集進行分類判斷。異常檢測從另一個維度進行知識發掘,最後的目標是建立給定數據中大部分的正太性,不是學習某些數據子集存在的特定模式,從各種正常情況的偏離都是異常行爲,這也就是異常檢測,比如說離羣點檢測。
2.背景介紹
郵件已在日常工作中應用非常廣泛,是我們日常辦公必不可少的通訊工具之一,隨着郵件的使用頻率越來越高,垃圾郵件也隨之而來。垃圾郵件的爆發,困擾着每一位深度郵件使用者,目前各大安全廠商提供非常多的反垃圾郵件系統,可相對有效保障我們在工作過程中不被垃圾郵件所侵擾,本篇利用樸素貝葉斯對垃圾郵件語料庫進行訓練分類,最終達到可期的垃圾郵件檢測效果。
我儘可能將代碼註釋寫詳細,即使不懂代碼也可大體瞭解其實現流程和原理。
3.功能實現
1.語料庫選擇
中文垃圾郵件語料下載地址:https://plg.uwaterloo.ca/~gvcormac/treccorpus06/
選擇中文
索引信息
spam:垃圾郵件;ham:非垃圾郵件(記得轉換成UTF-8格式)
索引信息對應的垃圾郵件內容
2.基礎環境
2.1本文基於python實現,所以讀者需要具備python環境。
2.2 樸素貝葉斯採用的是sklearn.naive_bayes.multinomialNB提供的類。
3.代碼實現流程
代碼實現分爲5個部分,即讀取信息、數據預處理、特徵向量化、開始訓練、輸出結果。
代理實現流程
讀取信息:讀取語料庫信息。
數據預處理:對數據進行預處理,訓練集和測試集分割。
特徵向量:文本特徵向量化,形成失量列。
即使看不懂具體代碼,瞭解該實現方法的流程也是非常好的。
- 讀取郵件信息
讀取郵件信息分爲兩部分,第一爲讀取郵件索引信息,第二爲讀取郵件內容信息。
讀取郵件索引信息
索引表請見上圖“索引信息對應的垃圾郵件內容”,通過如下代碼將索引表信息讀取後,放入labels中。具體效果如,labels[163/237]如果爲ham(非垃圾郵件)則爲1;如果爲垃圾郵件(spam)爲0。
詳細代碼見下圖:
讀取郵件索引信息代碼
讀取郵件內容信息
讀取代碼分兩部分,第一是通過獲取的索引信息,根據內容(存放的爲索引目錄)遍歷對應的郵件內容,調用extract_email_text讀取對應的郵件內容,並存儲X中,y存儲對應標籤信息。
郵件內容遍歷
extract_email_text方法主要是通過open打開對應文件後,獲取郵件正文內容(郵件頭未獲取),並返回。
讀取郵件內容
- 數據預處理
基礎數據處理完畢後,對數據進行預處理操作,train_test_split函數用於將矩陣隨機劃分訓練子集和測試子集,並返回劃分好的訓練集和測試集及標籤。
調用參數:
train_data(第一個參數):所要劃分的樣本特徵集;
train_target(第二個參數):所要劃分的樣本標籤;
test_size(第三個參數):樣本佔比,測試集樣本數目與原始數目之比;
random_state(第四個參數):是隨機數的種子。
返回內容:
X_train:劃分出的訓練集數據;
X_test:劃分出對的測試集數據;
y_train:劃分出的訓練集標籤;
y_test:劃分出的測試集標籤
train_test_split函數
- 文本特徵向量化
通過transform方法將X_train與X_test文本進行特徵向量化,供下一步訓練使用。
特徵向量化
- 開始訓練
文中使用的爲默認的樸素貝葉斯,利用X_train與y_train對模型參數進行擬合。最後通過predict方法獲取返回預測結果(標籤值)。
開始訓練
- 輸出結果
本文輸出兩塊內容,一個是預測結果信息,一個是評估信息
輸出設置
輸出結果
最終樸素貝葉斯分類器的精確度達到97.6%。該方法一般要比LSH方法提升5-10%
4.總結
現實世界中的垃圾郵件檢測並不像我們舉例這樣簡單,有許多不同類型的垃圾郵件,每封垃圾郵件都有不同的攻擊向量和避免檢測的辦法,有時垃圾郵件會通過重定向或隱藏鏈接來規避垃圾郵件鏈接檢測分類器,有時垃圾郵件會通過圖片,來避免文字訓練形成的分類器。業界多數是將多個分類器和算法組合形成一個集合對垃圾郵件進行檢測分類。