電子郵件分類的最佳機器學習算法

2020-11-26 中國郵箱網

中國郵箱網訊 11月3日消息 電子郵件分類是一個機器學習問題,屬於監督學習範疇。


這個電子郵件分類的小項目的靈感來自J.K.Rowling以筆名出版的一本書。Udacity的「機器學習簡介」提供了算法和項目的全面研究:https://www.udacity.com/course/intro-to-machine-learning--ud120


幾年前,羅琳寫了一本書《布穀鳥的呼喚》,作者名是羅伯特·加爾布雷思。這本書受到了一些好評,但是沒有人關注它,直到Twitter上的一位匿名線人說這是J.K.羅琳。倫敦《星期日泰晤士報》邀請了兩位專家,將「布穀鳥」的語言模式與羅琳的《臨時空缺》以及其他幾位作者的著作進行了比較。在他們的分析結果強烈指向羅琳是作者之後,《泰晤士報》直接詢問出版商他們是否是同一個人,出版商證實了這一點。這本書一夜之間大受歡迎。


電子郵件分類工作在相同的基本概念上。通過瀏覽電子郵件的文本,我們將使用機器學習算法來預測電子郵件是由一個人寫的還是另一個人寫的。


數據集


數據集可以從以下GitHub存儲庫獲取:https://github.com/MahnoorJaved98/Email-Classification


在這個數據集中,我們有一組電子郵件,其中一半由同一公司的一個人(Sara)編寫,另一半由另一個人(Chris)編寫。數據基於字符串列表。每個字符串都是電子郵件的文本,經過一些基本的預處理。


我們將根據郵件的文本對郵件進行分類。我們將逐一使用以下算法:樸素貝葉斯、支持向量機、決策樹、隨機森林、KNN和AdaBoost分類器。


存儲庫有2個pickle文件:word_data 和email_authors。


email_preprocess python文件用於處理pickles文件中的數據。它將數據拆分為10%測試數據和90%的訓練數據。


樸素貝耶斯


樸素貝耶斯方法是一組基於Bayes定理的有監督學習算法,在給定類變量值的情況下,假設每對特徵之間條件獨立且貢獻相等。Bayes定理是計算條件概率的一個簡單的數學公式。


高斯樸素貝葉斯是一種樸素貝葉斯,其中特徵的可能性被假定為高斯。假設與每個特徵相關聯的連續值按照高斯分布進行分布。在繪製時,它給出了一條關於特徵值平均值對稱的鐘形曲線。


我們將使用scikit學習庫中的Gaussian-naivebayes算法對兩位作者的郵件進行分類。


下面是你可以在任何python的ide上實現的python代碼,確保你的系統上安裝了所需的庫。


import sysfrom time import timesys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")from email_preprocess import preprocessimport numpy as np# 利用高斯貝葉斯算法對郵件進行分類# 算法是從sklearn庫導入的from sklearn.naive_bayes import GaussianNBfrom sklearn.metrics import accuracy_score# 初始化測試和訓練集# 函數preprocess是從email_preprocess.py導入的features_train, features_test, labels_train, labels_test = preprocess()# 定義分類器clf = GaussianNB()# 訓練和測試時間的預測t0 = time()clf.fit(features_train, labels_train)print("\nTraining time:", round(time()-t0, 3), "s\n")t1 = time()pred = clf.predict(features_test)print("Predicting time:", round(time()-t1, 3), "s\n")# 計算並列印算法的準確度print("Accuracy of Naive Bayes: ", accuracy_score(pred,labels_test))運行該代碼將得到以下結果:


0.9203的準確度。不錯吧?即使是算法的訓練次數和預測次數也相當合理。


支持向量機


支持向量機也是一種用於分類、回歸和異常檢測的有監督學習。通過一個平面將數據點劃分為兩類,利用SVM算法將數據點分類為2類。SVM具有一個直接的決策邊界。SVM算法具有通用性,可為決策函數指定不同的核函數。


SVM算法是基於超平面的兩類分離,間隔越大,分類越好(也稱為間隔最大化)。


我們的分類器是線性核的C支持向量分類,值為C=1


import sysfrom time import timesys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")from email_preprocess import preprocessfrom sklearn.svm import SVCfrom sklearn.metrics import accuracy_score### features_train 和 features_test 是訓練集和測試集的特徵### labels_train 和 labels_test是對應的標籤features_train, features_test, labels_train, labels_test = preprocess()# 定義分類器clf = SVC(kernel = 'linear', C=1)# 訓練和測試時間的預測t0 = time()clf.fit(features_train, labels_train)print("\nTraining time:", round(time()-t0, 3), "s\n")t1 = time()pred = clf.predict(features_test)print("Predicting time:", round(time()-t1, 3), "s\n")# 計算並列印算法的準確度print("Accuracy of SVM Algorithm: ", clf.score(features_test, labels_test))


SVM算法的準確度為0.9596。我們可以看到在準確性和訓練時間之間有明顯的折衷。算法的準確性提高是訓練時間較長(22.7s,樸素貝葉斯是0.13s)的結果。我們可以減少訓練數據,這樣可以在較少的訓練時間內獲得很好的準確率!


我們將首先將訓練數據集分割到原始大小的1%,以釋放99%的訓練數據。在代碼的其餘部分不變的情況下,我們可以看到訓練時間顯著縮短,但是降低了準確性。


使用以下代碼將訓練數據分割為1%:


features_train = features_train[:len(features_train)//100]labels_train = labels_train[:len(labels_train)//100]可見,在1%的訓練數據下,算法的訓練時間縮短到0.01s,精度降低到0.9055。


10%的訓練數據,訓練時間0.47s,準確度為0.9550。


我們也可以改變scikit-learn的C和核。


在訓練數據100%,RBF核,C值為10000的情況下,訓練時間為14.718s,得到了0.9891的精度。


決策樹


決策樹是一種用於分類和回歸的非參數監督學習方法。決策樹可以在數據集上執行多類分類。利用從數據特徵推斷出的決策規則,對每個節點上的數據進行逐步分類。決策樹很容易可視化。我們可以通過可視化數據集通過樹來理解算法,並在各個節點做出決定。


讓我們看看這個算法是如何在我們的數據集上工作的。


import sysfrom time import timesys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")from email_preprocess import preprocessfrom sklearn import treefrom sklearn.metrics import accuracy_score### features_train 和 features_test 是訓練集和測試集的特徵### labels_train 和 labels_test是對應的標籤features_train, features_test, labels_train, labels_test = preprocess()# 定義分類器clf = tree.DecisionTreeClassifier()print("\nLength of Features Train", len(features_train[0]))# 訓練和測試時間的預測t0 = time()clf.fit(features_train, labels_train)print("\nTraining time:", round(time()-t0, 3), "s\n")t1 = time()pred = clf.predict(features_test)print("Predicting time:", round(time()-t1, 3), "s\n")# 計算並列印算法的準確度print("Accuracy of Decision Trees Algorithm: ", accuracy_score(pred,labels_test))運行上述代碼,我們的準確度為0.9880,訓練時間為6.116s,這是一個非常好的準確性分數,不是嗎?我們有100%的訓練數據用於訓練模型。


隨機森林


隨機森林是一種基於決策樹的集成監督學習算法。隨機森林用於回歸和分類任務。該算法的名字來源於隨機選擇的特徵。


我們可以在我們的數據集上使用sklearn庫中的隨機森林算法:RandomForestClassifier。


下面是在我們的電子郵件分類問題上運行隨機森林算法的代碼。


import sysfrom time import timesys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")from email_preprocess import preprocessfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import accuracy_score### features_train 和 features_test 是訓練集和測試集的特徵### labels_train 和 labels_test是對應的標籤features_train, features_test, labels_train, labels_test = preprocess()# 定義分類器clf = RandomForestClassifier(max_depth=2, random_state=0)# 訓練和測試時間的預測t0 = time()clf.fit(features_train, labels_train)print("\nTraining time:", round(time()-t0, 3), "s\n")t1 = time()pred = clf.predict(features_test)print("Predicting time:", round(time()-t1, 3), "s\n")# 計算並列印算法的準確度print("Accuracy of Random Forest Algorithm: ", accuracy_score(pred,labels_test))


該算法的精度很低,即0.7707。訓練時間是1.2秒,這是合理的,但總的來說,它並不是解決我們問題的好工具。特徵選擇的隨機性是造成精度低的原因,而隨機是隨機森林的一種特性。


KNN


K近鄰是一種有監督的機器學習算法,可用於分類和回歸預測問題。KNN是懶惰學習。它依賴於距離進行分類,因此對訓練數據進行規範化可以大大提高分類精度。


讓我們看看使用sklearn庫的KNeighborsClassifier的KNN算法對電子郵件進行分類的結果,該算法有5個最近鄰和使用歐幾裡德度量。


import sysfrom time import timesys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")from email_preprocess import preprocessfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.metrics import accuracy_score### features_train 和 features_test 是訓練集和測試集的特徵### labels_train 和 labels_test是對應的標籤features_train, features_test, labels_train, labels_test = preprocess()# 定義分類器clf = KNeighborsClassifier(n_neighbors=5, metric='euclidean')# 訓練和測試時間的預測t0 = time()clf.fit(features_train, labels_train)print("\nTraining time:", round(time()-t0, 3), "s\n")t1 = time()pred = clf.predict(features_test)print("Predicting time:", round(time()-t1, 3), "s\n")# 計算並列印算法的精度print("Accuracy of KNN Algorithm: ", accuracy_score(pred,labels_test))該算法的精度為0.9379,訓練時間為2.883s,但是可以注意到,模型工具預測類的時間要長得多。


AdaBoost分類器


Ada-boost或自適應Boosting也是一種集成Boosting分類器。它是一種元估計器,首先在原始數據集上擬合一個分類器,然後在同一個數據集上擬合該分類器的附加副本,但是在這種情況下,錯誤分類實例的權重被調整,以便後續分類器更關注困難的情況。


我們將使用scikit庫中的分類器。代碼如下:


import sysfrom time import timesys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")from email_preprocess import preprocessfrom sklearn.ensemble import AdaBoostClassifierfrom sklearn.metrics import accuracy_score### features_train 和 features_test 是訓練集和測試集的特徵### labels_train 和 labels_test是對應的標籤features_train, features_test, labels_train, labels_test = preprocess()# 定義分類器clf = AdaBoostClassifier(n_estimators=100, random_state=0)# 訓練和測試時間的預測t0 = time()clf.fit(features_train, labels_train)print("\nTraining time:", round(time()-t0, 3), "s\n")t1 = time()pred = clf.predict(features_test)print("Predicting time:", round(time()-t1, 3), "s\n")# 計算並列印算法的精度print("Accuracy of Ada Boost Classifier: ", accuracy_score(pred,labels_test))該分類器的訓練時間為17.946s,精度為0.9653,但訓練時間稍長。


結論


在本文中,我們使用了幾種機器學習算法來對Chris和Sara之間的電子郵件進行分類。這些算法在0.77-0.98的範圍內產生了不同的準確度得分。從下表中可以看出,模型是通過提高準確度排列的:


隨機森林算法的準確度得分最低

支持向量機算法訓練時間最長

參數優化為C=10000和RBF核的支持向量機算法的精度得分最高

naivebayes算法的預測時間最快


雖然有許多其他分類算法可用於我們的任務,但通過對數據集上運行的基本算法的比較得出結論,對於我們的特定問題,支持向量機是最準確的,因為它的參數是根據我們所處理的任務優化的。


相關焦點

  • Pedro Domingos深度解析機器學習五大流派中主算法精髓
    ,圖中的機器是一名完整的、自動的生物學家,它也是從分子生物學中的DNA、蛋白質、RNA開始學習的。首個垃圾郵件過濾器是由David Heckerman及其同事共同設計的。他們僅僅運用一個非常建議的貝葉斯學習機,即初級(naive)貝葉斯分類器。下面是該分類器的工作原理:其基於的假設為——一封郵件是垃圾郵件或一封郵件不是垃圾郵件,當然這種假設是在我們檢測郵件內容之前提出的。其中蘊含的先驗概率為:當你判斷一封郵件為垃圾郵件的先驗概率為90%,99%,99.999%時,你的假設即為正確的。
  • 為你的回歸問題選擇最佳機器學習算法
    【IT168 編譯】在處理任何類型的機器學習(ML)問題時,我們有許多不同的算法可供選擇。而機器學習領域有一個得到大家共識的觀點,大概就是:沒有一個ML算法能夠最佳地適用於解決所有問題。不同ML算法的性能在很大程度上取決於數據的大小和結構。
  • 乾貨丨Pedro Domingos深度解析機器學習五大流派中主算法精髓
    他們僅僅運用一個非常建議的貝葉斯學習機,即初級(naive)貝葉斯分類器。下面是該分類器的工作原理:其基於的假設為——一封郵件是垃圾郵件或一封郵件不是垃圾郵件,當然這種假設是在我們檢測郵件內容之前提出的。其中蘊含的先驗概率為:當你判斷一封郵件為垃圾郵件的先驗概率為90%,99%,99.999%時,你的假設即為正確的。證明這一假設正確與否的證據在於郵件的真實內容。
  • 數據科學家應該知道的頂級機器學習算法
    基本上,這種組織機器學習算法的方法非常有用。因為它迫使您考慮輸入數據的角色和模型準備過程。另外,選擇最適合您的問題的方法以獲得最佳結果。讓我們看一下機器學習算法中的三種不同的學習風格:監督學習基本上,在此監督式機器學習中,輸入數據稱為訓練數據,並且一次具有已知標籤或結果,例如垃圾郵件/非垃圾郵件或股票價格。在此,通過訓練過程準備了模型。另外,在此需要做出預測。
  • 機器學習算法盤點:人工神經網絡、深度學習
    在機器學習或者人工智慧領域,人們首先會考慮算法的學習方式。在機器學習領域,有幾種主要的學習方式。將算法按照學習方式分類是一個不錯的想法,這樣可以讓人們在建模和算法選擇的時候考慮能根據輸入數據來選擇最合適的算法來獲得最好的結果。   監督式學習:
  • 帶你從不同角度了解強化學習算法的分類
    話不多說,大家深呼吸,一起來學習RL算法的分類吧!基於這個觀點有兩個RL算法的分支:無模型和基於模型。· 模型RL算法根據環境的學習模型來選擇最佳策略。· 無模型RL算法通過代理反覆測試選擇最佳策略。
  • 流行的機器學習算法總結,幫助你開啟機器學習算法學習之旅
    AI的ML領域是為實現非常精確的目標而創建的,它引入了多種算法,從而可以更順暢地進行數據處理和決策。什麼是機器學習算法?機器學習算法是任何模型背後的大腦,可讓機器學習並使其更智能。這些算法的工作方式是,為它們提供第一批數據,並且隨著時間的流逝和算法的準確性的提高,額外的數據也被引入到算法中。
  • 機器學習算法匯總:人工神經網絡、深度學習及其它
    將算法按照學習方式分類是一個不錯的想法,這樣可以讓人們在建模和算法選擇的時候考慮能根據輸入數據來選擇最合適的算法來獲得最好的結果。 監督式學習: 在監督式學習下,輸入數據被稱為「訓練數據」,每組訓練數據有一個明確的標識或結果,如對防垃圾郵件系統中「垃圾郵件」「非垃圾郵件」,對手寫數字識別中的「1「,」2「,」3「,」4「等。
  • 算法可學習識別
    ▲美國哥倫比亞大學研究人員發現,一種用於過濾垃圾郵件的算法可以學習和識別水螅的行為。圖中,水螅的神經元已被綠色螢光指示劑所標記。生物學家對動物行為的認知大多來自細緻的觀察和辛勤的記錄。現在,或許有一種更簡單的方法供他們選擇了。
  • 乾貨來襲,谷歌最新機器學習術語表(上)
    ROC 曲線下面積是,對於隨機選擇的正類別樣本確實為正類別,以及隨機選擇的負類別樣本為正類別,分類器更確信前者的概率。B反向傳播算法 (backpropagation)在神經網絡上執行梯度下降法的主要算法。
  • 算法之「算法」:所有機器學習算法都可以表示為神經網絡
    隨後出現了一個又一個新算法,從邏輯回歸到支持向量機。但是眾所周知,神經網絡是算法的算法及機器學習的巔峰。我們可以說,神經網絡是對機器學習的普遍概括,而不是僅僅一次嘗試。支持向量機(SVM)算法試圖通過所謂的「核技巧」將數據投影到一個新的空間,從而優化數據的線性可分性。數據轉換完成後,該算法繪製出沿組界最佳分離數據的超平面。超平面簡單定義為現有維度的線性結合,很像是二維的直線和三維的平面。這樣說來,可以將SVM算法看成是將數據投影到一個新的空間,隨後進行多元回歸。神經網絡的輸出可以通過某種有界輸出函數來實現概率結果。
  • 人工智慧大顯神通,實現用機器學習算法:簡化粒子加速器的操作!
    直線加速器相干光源從巨型線性粒子加速器產生的高能電子束中產生超亮X射線。直線加速器相干光源的實驗日以繼夜地進行,每天有兩個12小時的輪班。 人工智慧機器學習 生產直線加速器相干光源強大的X射線束,首先要準備高質量的電子束。然後,一些電子的能量在特殊磁鐵中被轉化為X射線光。電子束的特性需要是密集和緊密聚焦的,這是決定X射線束好壞的關鍵因素。
  • 聚焦快速機器學習訓練算法,UC伯克利尤洋189頁博士論文公布
    機器之心報導編輯:蛋醬、小舟這份 189 頁的博士學位論文,凝結了尤洋在快速機器學習訓練算法領域的研究心血。過去十年,深度學習應用領域的數據量迅速增長,使得深度神經網絡(DNN)的訓練時間拉長。而這已經成為機器學習開發者和研究者面臨的瓶頸問題。
  • 關於機器學習的三大類型分析
    打開APP 關於機器學習的三大類型分析 工程師飛燕 發表於 2018-10-20 08:04:00 據報導,機器學習算法逐漸潛入我們日常生活,但是工業應用卻面臨不少瓶頸,不如消費應用那麼普及,Inductive Automation的Kathy Applebaum指出,綜觀目前工業採用機器學習技術的情況,以預測性維護(PM)為大宗,其次是品管、需求預測和機器人訓練。 機器學習主要分成三大類型。
  • ICLR 2018最佳論文:基於梯度的元學習算法
    於 4 月 30 日開幕的 ICLR 2018 最近公布了三篇最佳論文,分別關注於最優化方法、卷積神經網絡和元學習算法。不出所料的是,這三篇最佳論文在 2017 年 11 月公布的評審結果中,都有很高的得分。機器之心以前已經介紹過關於修正 Adam 與球面 CNN 的最佳論文,本文將重點介紹第三篇關於元學習的最佳論文。
  • 盤點:十大機器學習算法及其應用
    如果你想學習機器算法,要從何下手呢?以我為例,我是在哥本哈根留學期間,學習AI課程入門的。我們用的教科書是一本AI經典:《Peter Norvig’s Artificial Intelligence?—?A Modern Approach》。最近我在繼續學習這些,包括在舊金山聽了幾個關於深度學習的技術演講,參加機器學習大會上。
  • 獨家 | 機器學習中的四種分類任務(附代碼)
    分別是二分類、多類別分類、多標籤分類、不平衡分類,並提供了實戰代碼。 標籤:機器學習機器學習是一個研究領域,其涉及到從示例中學習的算法。分類是一項需要使用機器學習算法去學習如何根據問題域為示例分配類標籤的任務。一個簡單易懂的例子是將電子郵件分為「垃圾郵件」或「非垃圾郵件」。在機器學習中,你可能會遇到許多不同類型的分類任務,並且每種模型都會使用專門的建模方法。
  • 一文就讀懂機器學習及其在遙感中的應用
    遙感圖像分類是遙感圖像信息處理中最基本的問題之一,其分類技術是遙感應用系統中的關鍵技術,遙感圖像分類方法的精度直接影響著遙感技術的應用發展。許多研究者一直在嘗試、改進,探索新的方法,以不斷提高遙感圖像自動分類算法的精度和速度。  本文基於機器學習,細細研讀了其在遙感中的應用。
  • 預測建模、監督機器學習和模式分類概覽
    模式分類(pattern classification)和機器學習(machine learning)是非常熱的話題,幾乎在所有的現代應用程式中都得到了應用:例如郵局中的光學字符識別(OCR),電子郵件過濾,超市條形碼掃描,等等。在這篇文章中,我會簡要描述一個典型的監督學習任務的主要概念,這些概念將作為將來的文章和實現各種學習算法的基礎。
  • Quora是如何使用機器學習的?
    從那時起,在Quora上使用機器學習發展的越來越快,我們不僅為現有的機器學習應用程式開發了更大更好的模型,而且還擴展了我們使用機器學習的領域。在這個答案中,我將給出一個藍圖,來描繪出在2017年Quora是如何使用機器學習的。機器學習使用實例我將介紹產品的各個不同組成部分,並討論如何在其中使用機器學習。1.