1. 程式人生 > >機器學習演算法對比分析

機器學習演算法對比分析

各種機器學習的應用場景分別是什麼?例如,k近鄰,貝葉斯,決策樹,svm,邏輯斯蒂迴歸和最大熵模型。

k近鄰,貝葉斯,決策樹,svm,邏輯斯蒂迴歸和最大熵模型,隱馬爾科夫,條件隨機場,adaboost,em 這些在一般工作中,分別用到的頻率多大?一般用…

 

關於這個問題我今天正好看到了這個文章。講的正是各個演算法的優劣分析,很中肯。

https://zhuanlan.zhihu.com/p/25327755

正好14年的時候有人做過一個實驗[1],比較在不同資料集上(121個),不同的分類器(179個)的實際效果。

論文題為:Do we Need Hundreds of Classifiers to Solve Real World Classification Problems?

實驗時間有點早,我嘗試著結合我自己的理解、一些最近的實驗,來談一談吧。主要針對分類器(Classifier)。

寫給懶得看的人:

沒有最好的分類器,只有最合適的分類器。

隨機森林平均來說最強,但也只在9.9%的資料集上拿到了第一,優點是鮮有短板。

SVM的平均水平緊隨其後,在10.7%的資料集上拿到第一。

神經網路(13.2%)和boosting(~9%)表現不錯。

資料維度越高,隨機森林就比AdaBoost強越多,但是整體不及SVM[2]。

資料量越大,神經網路就越強。

 

近鄰 (Nearest Neighbor)

典型的例子是KNN,它的思路就是——對於待判斷的點,找到離它最近的幾個資料點,根據它們的型別決定待判斷點的型別。

它的特點是完全跟著資料走,沒有數學模型可言。

 

適用情景:

需要一個特別容易解釋的模型的時候。

比如需要向用戶解釋原因的推薦演算法。

 

貝葉斯 (Bayesian)

典型的例子是Naive Bayes,核心思路是根據條件概率計算待判斷點的型別。

是相對容易理解的一個模型,至今依然被垃圾郵件過濾器使用。

 

適用情景:

需要一個比較容易解釋,而且不同維度之間相關性較小的模型的時候。

可以高效處理高維資料,雖然結果可能不盡如人意。

 

決策樹 (Decision tree)

決策樹的特點是它總是在沿著特徵做切分。隨著層層遞進,這個劃分會越來越細。

雖然生成的樹不容易給使用者看,但是資料分析的時候,通過觀察樹的上層結構,能夠對分類器的核心思路有一個直觀的感受。

舉個簡單的例子,當我們預測一個孩子的身高的時候,決策樹的第一層可能是這個孩子的性別。男生走左邊的樹進行進一步預測,女生則走右邊的樹。這就說明性別對身高有很強的影響。

 

適用情景:

因為它能夠生成清晰的基於特徵(feature)選擇不同預測結果的樹狀結構,資料分析師希望更好的理解手上的資料的時候往往可以使用決策樹。

同時它也是相對容易被攻擊的分類器[3]。這裡的攻擊是指人為的改變一些特徵,使得分類器判斷錯誤。常見於垃圾郵件躲避檢測中。因為決策樹最終在底層判斷是基於單個條件的,攻擊者往往只需要改變很少的特徵就可以逃過監測。

受限於它的簡單性,決策樹更大的用處是作為一些更有用的演算法的基石。

 

隨機森林 (Random forest)

提到決策樹就不得不提隨機森林。顧名思義,森林就是很多樹。

嚴格來說,隨機森林其實算是一種整合演算法。它首先隨機選取不同的特徵(feature)和訓練樣本(training sample),生成大量的決策樹,然後綜合這些決策樹的結果來進行最終的分類。

隨機森林在現實分析中被大量使用,它相對於決策樹,在準確性上有了很大的提升,同時一定程度上改善了決策樹容易被攻擊的特點。

 

適用情景:

資料維度相對低(幾十維),同時對準確性有較高要求時。

因為不需要很多引數調整就可以達到不錯的效果,基本上不知道用什麼方法的時候都可以先試一下隨機森林。

 

SVM (Support vector machine)

SVM的核心思想就是找到不同類別之間的分介面,使得兩類樣本儘量落在面的兩邊,而且離分介面儘量遠。

最早的SVM是平面的,侷限很大。但是利用核函式(kernel function),我們可以把平面投射(mapping)成曲面,進而大大提高SVM的適用範圍。

提高之後的SVM同樣被大量使用,在實際分類中展現了很優秀的正確率。

 

適用情景:

SVM在很多資料集上都有優秀的表現。

相對來說,SVM儘量保持與樣本間距離的性質導致它抗攻擊的能力更強。

和隨機森林一樣,這也是一個拿到資料就可以先嚐試一下的演算法。

 

邏輯斯蒂迴歸 (Logistic regression)

邏輯斯蒂迴歸這個名字太詭異了,我就叫它LR吧,反正討論的是分類器,也沒有別的方法叫LR。顧名思義,它其實是迴歸類方法的一個變體。

迴歸方法的核心就是為函式找到最合適的引數,使得函式的值和樣本的值最接近。例如線性迴歸(Linear regression)就是對於函式f(x)=ax+b,找到最合適的a,b。

LR擬合的就不是線性函數了,它擬合的是一個概率學中的函式,f(x)的值這時候就反映了樣本屬於這個類的概率。

 

適用情景:

LR同樣是很多分類演算法的基礎元件,它的好處是輸出值自然地落在0到1之間,並且有概率意義。

因為它本質上是一個線性的分類器,所以處理不好特徵之間相關的情況。

雖然效果一般,卻勝在模型清晰,背後的概率學經得住推敲。它擬合出來的引數就代表了每一個特徵(feature)對結果的影響。也是一個理解資料的好工具。

 

判別分析 (Discriminant analysis)

判別分析主要是統計那邊在用,所以我也不是很熟悉,臨時找統計系的閨蜜補了補課。這裡就現學現賣了。

判別分析的典型例子是線性判別分析(Linear discriminant analysis),簡稱LDA。

(這裡注意不要和隱含狄利克雷分佈(Latent Dirichlet allocation)弄混,雖然都叫LDA但說的不是一件事。)

LDA的核心思想是把高維的樣本投射(project)到低維上,如果要分成兩類,就投射到一維。要分三類就投射到二維平面上。這樣的投射當然有很多種不同的方式,LDA投射的標準就是讓同類的樣本儘量靠近,而不同類的儘量分開。對於未來要預測的樣本,用同樣的方式投射之後就可以輕易地分辨類別了。

 

使用情景:

判別分析適用於高維資料需要降維的情況,自帶降維功能使得我們能方便地觀察樣本分佈。它的正確性有數學公式可以證明,所以同樣是很經得住推敲的方式。

但是它的分類準確率往往不是很高,所以不是統計系的人就把它作為降維工具用吧。

同時注意它是假定樣本成正態分佈的,所以那種同心圓形的資料就不要嘗試了。

 

神經網路 (Neural network)

神經網路現在是火得不行啊。它的核心思路是利用訓練樣本(training sample)來逐漸地完善引數。還是舉個例子預測身高的例子,如果輸入的特徵中有一個是性別(1:男;0:女),而輸出的特徵是身高(1:高;0:矮)。那麼當訓練樣本是一個個子高的男生的時候,在神經網路中,從“男”到“高”的路線就會被強化。同理,如果來了一個個子高的女生,那從“女”到“高”的路線就會被強化。

最終神經網路的哪些路線比較強,就由我們的樣本所決定。

神經網路的優勢在於,它可以有很多很多層。如果輸入輸出是直接連線的,那它和LR就沒有什麼區別。但是通過大量中間層的引入,它就能夠捕捉很多輸入特徵之間的關係。卷積神經網路有很經典的不同層的視覺化展示(visulization),我這裡就不贅述了。

神經網路的提出其實很早了,但是它的準確率依賴於龐大的訓練集,原本受限於計算機的速度,分類效果一直不如隨機森林和SVM這種經典演算法。

 

使用情景:

資料量龐大,引數之間存在內在聯絡的時候。

當然現在神經網路不只是一個分類器,它還可以用來生成資料,用來做降維,這些就不在這裡討論了。

 

Rule-based methods

這個我是真不熟,都不知道中文翻譯是什麼。

它裡面典型的演算法是C5.0 Rules,一個基於決策樹的變體。因為決策樹畢竟是樹狀結構,理解上還是有一定難度。所以它把決策樹的結果提取出來,形成一個一個兩三個條件組成的小規則。

 

使用情景:

它的準確度比決策樹稍低,很少見人用。大概需要提供明確小規則來解釋決定的時候才會用吧。

 

提升演算法(Boosting)

接下來講的一系列模型,都屬於整合學習演算法(Ensemble Learning),基於一個核心理念:三個臭皮匠,頂個諸葛亮。

翻譯過來就是:當我們把多個較弱的分類器結合起來的時候,它的結果會比一個強的分類器更

典型的例子是AdaBoost。

AdaBoost的實現是一個漸進的過程,從一個最基礎的分類器開始,每次尋找一個最能解決當前錯誤樣本的分類器。用加權取和(weighted sum)的方式把這個新分類器結合進已有的分類器中。

它的好處是自帶了特徵選擇(feature selection),只使用在訓練集中發現有效的特徵(feature)。這樣就降低了分類時需要計算的特徵數量,也在一定程度上解決了高維資料難以理解的問題。

最經典的AdaBoost實現中,它的每一個弱分類器其實就是一個決策樹。這就是之前為什麼說決策樹是各種演算法的基石。

 

使用情景:

好的Boosting演算法,它的準確性不遜於隨機森林。雖然在[1]的實驗中只有一個擠進前十,但是實際使用中它還是很強的。因為自帶特徵選擇(feature selection)所以對新手很友好,是一個“不知道用什麼就試一下它吧”的演算法。

 

裝袋演算法(Bagging)

同樣是弱分類器組合的思路,相對於Boosting,其實Bagging更好理解。它首先隨機地抽取訓練集(training set),以之為基礎訓練多個弱分類器。然後通過取平均,或者投票(voting)的方式決定最終的分類結果。

因為它隨機選取訓練集的特點,Bagging可以一定程度上避免過渡擬合(overfit)。

在[1]中,最強的Bagging演算法是基於SVM的。如果用定義不那麼嚴格的話,隨機森林也算是Bagging的一種。

 

使用情景:

相較於經典的必使演算法,Bagging使用的人更少一些。一部分的原因是Bagging的效果和引數的選擇關係比較大,用預設引數往往沒有很好的效果。

雖然調對引數結果會比決策樹和LR好,但是模型也變得複雜了,沒事有特別的原因就別用它了。

 

Stacking

這個我是真不知道中文怎麼說了。它所做的是在多個分類器的結果上,再套一個新的分類器。

這個新的分類器就基於弱分類器的分析結果,加上訓練標籤(training label)進行訓練。一般這最後一層用的是LR。

Stacking在[1]裡面的表現不好,可能是因為增加的一層分類器引入了更多的引數,也可能是因為有過渡擬合(overfit)的現象。

 

使用情景:

沒事就別用了。

(修訂:

@莊巖

提醒說stacking在資料探勘競賽的網站kaggle上很火,相信引數調得好的話還是對結果能有幫助的。

http://blog.kaggle.com/2016/12/27/a-kagglers-guide-to-model-stacking-in-practice/

這篇文章很好地介紹了stacking的好處。在kaggle這種一點點提升就意味著名次不同的場合下,stacking還是很有效的,但是對於一般商用,它所帶來的提升就很難值回額外的複雜度了。)


 

多專家模型(Mixture of Experts)

最近這個模型還挺流行的,主要是用來合併神經網路的分類結果。我也不是很熟,對神經網路感興趣,而且訓練集異質性(heterogeneity)比較強的話可以研究一下這個。

 

講到這裡分類器其實基本說完了。講一下問題裡面其他一些名詞吧。

 

最大熵模型 (Maximum entropy model)

最大熵模型本身不是分類器,它一般是用來判斷模型預測結果的好壞的。

對於它來說,分類器預測是相當於是:針對樣本,給每個類一個出現概率。比如說樣本的特徵是:性別男。我的分類器可能就給出了下面這樣一個概率:高(60%),矮(40%)。

而如果這個樣本真的是高的,那我們就得了一個分數60%。最大熵模型的目標就是讓這些分數的乘積儘量大。

LR其實就是使用最大熵模型作為優化目標的一個演算法[4]。

 

EM

就像最大熵模型一樣,EM不是分類器,而是一個思路。很多演算法都是基於這個思路實現的。

@劉奕馳 已經講得很清楚了,我就不多說了。


 

隱馬爾科夫 (Hidden Markov model)

這是一個基於序列的預測方法,核心思想就是通過上一個(或幾個)狀態預測下一個狀態。

之所以叫“隱”馬爾科夫是因為它的設定是狀態本身我們是看不到的,我們只能根據狀態生成的結果序列來學習可能的狀態。

 

適用場景:

可以用於序列的預測,可以用來生成序列。

 

條件隨機場 (Conditional random field)

典型的例子是linear-chain CRF。

具體的使用 @Aron 有講,我就不獻醜了,因為我從來沒用過這個。

 

就是這些啦。

 

相關的文章:

[1]: Do we need hundreds of classifiers to solve real world classification problems.

Fernández-Delgado, Manuel, et al. J. Mach. Learn. Res 15.1 (2014)

[2]: An empirical evaluation of supervised learning in high dimensions.

Rich Caruana, Nikos Karampatziakis, and Ainur Yessenalina. ICML '08

[3]: Man vs. Machine: Practical Adversarial Detection of Malicious Crowdsourcing Workers

Wang, G., Wang, T., Zheng, H., & Zhao, B. Y. Usenix Security'14

[4]: http://www.win-vector.com/dfiles/LogisticRegressionMaxEnt.pdf

 

 

1決策樹(Decision Trees)的優缺點

決策樹的優點:

一、           決策樹易於理解和解釋.人們在通過解釋後都有能力去理解決策樹所表達的意義。

二、           對於決策樹,資料的準備往往是簡單或者是不必要的.其他的技術往往要求先把資料一般化,比如去掉多餘的或者空白的屬性。

三、           能夠同時處理資料型和常規型屬性。其他的技術往往要求資料屬性的單一。

四、           決策樹是一個白盒模型。如果給定一個觀察的模型,那麼根據所產生的決策樹很容易推出相應的邏輯表示式。

五、           易於通過靜態測試來對模型進行評測。表示有可能測量該模型的可信度。

六、          在相對短的時間內能夠對大型資料來源做出可行且效果良好的結果。

七、           可以對有許多屬性的資料集構造決策樹。

八、           決策樹可很好地擴充套件到大型資料庫中,同時它的大小獨立於資料庫的大小。

 

決策樹的缺點:

一、           對於那些各類別樣本數量不一致的資料,在決策樹當中,資訊增益的結果偏向於那些具有更多數值的特徵。

二、           決策樹處理缺失資料時的困難。

三、           過度擬合問題的出現。

四、           忽略資料集中屬性之間的相關性。



2 人工神經網路的優缺點

人工神經網路的優點:分類的準確度高,並行分佈處理能力強,分佈儲存及學習能力強,對噪聲神經有較強的魯棒性和容錯能力,能充分逼近複雜的非線性關係,具備聯想記憶的功能等。

人工神經網路的缺點:神經網路需要大量的引數,如網路拓撲結構、權值和閾值的初始值;不能觀察之間的學習過程,輸出結果難以解釋,會影響到結果的可信度和可接受程度;學習時間過長,甚至可能達不到學習的目的。




3 遺傳演算法的優缺點

遺傳演算法的優點:

一、           與問題領域無關切快速隨機的搜尋能力。

二、           搜尋從群體出發,具有潛在的並行性,可以進行多個個體的同時比較,魯棒性好。

三、           搜尋使用評價函式啟發,過程簡單。

四、           使用概率機制進行迭代,具有隨機性。

五、           具有可擴充套件性,容易與其他演算法結合。

 

遺傳演算法的缺點:

一、           遺傳演算法的程式設計實現比較複雜,首先需要對問題進行編碼,找到最優解之後還需要對問題進行解碼,

二、           另外三個運算元的實現也有許多引數,如交叉率和變異率,並且這些引數的選擇嚴重影響解的品質,而目前這些引數的選擇大部分是依靠經驗.沒有能夠及時利用網路的反饋資訊,故演算法的搜尋速度比較慢,要得要較精確的解需要較多的訓練時間。

三、           演算法對初始種群的選擇有一定的依賴性,能夠結合一些啟發演算法進行改進。



4 KNN演算法(K-Nearest Neighbour) 的優缺點

KNN演算法的優點:

一、          簡單、有效。

二、          重新訓練的代價較低(類別體系的變化和訓練集的變化,在Web環境和電子商務應用中是很常見的)。

三、          計算時間和空間線性於訓練集的規模(在一些場合不算太大)。

四、           由於KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。

五、           該演算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種演算法比較容易產生誤分。

 

KNN演算法缺點:

一、           KNN演算法是懶散學習方法(lazy learning,基本上不學習),一些積極學習的演算法要快很多。

二、           類別評分不是規格化的(不像概率評分)。

三、           輸出的可解釋性不強,例如決策樹的可解釋性較強。

四、           該演算法在分類時有個主要的不足是,當樣本不平衡時,如一個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本佔多數。該演算法只計算“最近的”鄰居樣本,某一類的樣本數量很大,那麼或者這類樣本並不接近目標樣本,或者這類樣本很靠近目標樣本。無論怎樣,數量並不能影響執行結果。可以採用權值的方法(和該樣本距離小的鄰居權值大)來改進。

五、           計算量較大。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。




5 支援向量機(SVM)的優缺點

SVM的優點:

一、           可以解決小樣本情況下的機器學習問題。

二、           可以提高泛化效能。

三、           可以解決高維問題。

四、           可以解決非線性問題。

五、           可以避免神經網路結構選擇和區域性極小點問題。

 

SVM的缺點:

一、           對缺失資料敏感。

二、           對非線性問題沒有通用解決方案,必須謹慎選擇Kernelfunction來處理。



6 樸素貝葉斯的優缺點

優點:

一、           樸素貝葉斯模型發源於古典數學理論,有著堅實的數學基礎,以及穩定的分類效率。

二、           NBC模型所需估計的引數很少,對缺失資料不太敏感,演算法也比較簡單。

 

缺點:

一、           理論上,NBC模型與其他分類方法相比具有最小的誤差率。但是實際上並非總是如此,這是因為NBC模型假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的(可以考慮用聚類演算法先將相關性較大的屬性聚類),這給NBC模型的正確分類帶來了一定影響。在屬性個數比較多或者屬性之間相關性較大時,NBC模型的分類效率比不上決策樹模型。而在屬性相關性較小時,NBC模型的效能最為良好。

二、           需要知道先驗概率。

三、           分類決策存在錯誤率



7 Adaboosting方法的優點

一、           adaboost是一種有很高精度的分類器。

二、           可以使用各種方法構建子分類器,Adaboost演算法提供的是框架。

三、           當使用簡單分類器時,計算出的結果是可以理解的。而且弱分類器構造極其簡單。

四、           簡單,不用做特徵篩選。

五、           不用擔心overfitting。



8 Rocchio的優點

Rocchio演算法的突出優點是容易實現,計算(訓練和分類)特別簡單,它通常用來實現衡量分類系統性能的基準系統,而實用的分類系統很少採用這種演算法解決具體的分類問題。




9各種分類演算法比較

根據這篇論文所得出的結論,

Calibrated boosted trees的效能最好,隨機森林第二,uncalibrated bagged trees第三,calibratedSVMs第四, uncalibrated neural nets第五。

    效能較差的是樸素貝葉斯,決策樹。

    有些演算法在特定的資料集下表現較好。

 

from:http://bbs.pinggu.org/thread-2604496-1-1.html

 


參考文獻:

 

[1] 羅森林, 馬俊, 潘麗敏.資料探勘理論與技術[M].電子工業出版社.2013.126-126

[2] 楊曉帆,陳廷槐.人工神經網路固有的優點和缺點[J].電腦科學.1994(vol.21).23-26

[3] Steve.遺傳演算法的優缺點.http://blog.sina.com.cn/s/blog_6377a3100100h1mj.html

[4] 楊建武.文字自動分類技術.

www.icst.pku.edu.cn/course/mining/12-13spring/TextMining04-%E5%88%86%E7%B1%BB.pdf

[5] 白雲球工作室. SVM(支援向量機)綜述.http://blog.sina.com.cn/s/blog_52574bc10100cnov.html

[6] 張夏天. 統計學習理論和SVM的不足(1).http://blog.sciencenet.cn/blog-230547-248821.html

[7] RichCaruana,AlexandruNiculescu-Mizil.An Empirical Comparison of Supervised LearningAlgorithms.2006