機器學習算法太多了,分類、回歸、聚類、推薦、圖像識別領(lǐng)域等等,要想找到一個合適算法真的不容易,所以在實際應用中,我們一般都是采用啟發(fā)式學習方式來實驗。通常最開始我們都會選擇大家普遍認同的算法,諸如SVM,GBDT,Adaboost,現(xiàn)在深度學習很火熱,神經(jīng)網(wǎng)絡也是一個不錯的選擇。假如你在乎精度(accuracy)的話,最好的方法就是通過交叉驗證(cross-validation)對各個算法一個個地進行測試,進行比較,然后調(diào)整參數(shù)確保每個算法達到最優(yōu)解,最后選擇最好的一個。但是如果你只是在尋找一個“足夠好”的算法來解決你的問題,或者這里有些技巧可以參考,下面來分析下各個算法的優(yōu)缺點,基于算法的優(yōu)缺點,更易于我們?nèi)ミx擇它。
偏差&方差
在統(tǒng)計學中,一個模型好壞,是根據(jù)偏差和方差來衡量的,所以我們先來普及一下偏差和方差:
偏差:描述的是預測值(估計值)的期望E’與真實值Y之間的差距。偏差越大,越偏離真實數(shù)據(jù)。
方差:描述的是預測值P的變化范圍,離散程度,是預測值的方差,也就是離其期望值E的距離。方差越大,數(shù)據(jù)的分布越分散。
模型的真實誤差是兩者之和,如下圖:
如果是小訓練集,高偏差/低方差的分類器(例如,樸素貝葉斯NB)要比低偏差/高方差大分類的優(yōu)勢大(例如,KNN),因為后者會過擬合。但是,隨著你訓練集的增長,模型對于原數(shù)據(jù)的預測能力就越好,偏差就會降低,此時低偏差/高方差分類器就會漸漸的表現(xiàn)其優(yōu)勢(因為它們有較低的漸近誤差),此時高偏差分類器此時已經(jīng)不足以提供準確的模型了。
當然,你也可以認為這是生成模型(NB)與判別模型(KNN)的一個區(qū)別。
為什么說樸素貝葉斯是高偏差低方差?
以下內(nèi)容引自知乎:
首先,假設你知道訓練集和測試集的關(guān)系。簡單來講是我們要在訓練集上學習一個模型,然后拿到測試集去用,效果好不好要根據(jù)測試集的錯誤率來衡量。但很多時候,我們只能假設測試集和訓練集的是符合同一個數(shù)據(jù)分布的,但卻拿不到真正的測試數(shù)據(jù)。這時候怎么在只看到訓練錯誤率的情況下,去衡量測試錯誤率呢?
由于訓練樣本很少(至少不足夠多),所以通過訓練集得到的模型,總不是真正正確的。(就算在訓練集上正確率100%,也不能說明它刻畫了真實的數(shù)據(jù)分布,要知道刻畫真實的數(shù)據(jù)分布才是我們的目的,而不是只刻畫訓練集的有限的數(shù)據(jù)點)。而且,實際中,訓練樣本往往還有一定的噪音誤差,所以如果太追求在訓練集上的完美而采用一個很復雜的模型,會使得模型把訓練集里面的誤差都當成了真實的數(shù)據(jù)分布特征,從而得到錯誤的數(shù)據(jù)分布估計。這樣的話,到了真正的測試集上就錯的一塌糊涂了(這種現(xiàn)象叫過擬合)。但是也不能用太簡單的模型,否則在數(shù)據(jù)分布比較復雜的時候,模型就不足以刻畫數(shù)據(jù)分布了(體現(xiàn)為連在訓練集上的錯誤率都很高,這種現(xiàn)象較欠擬合)。過擬合表明采用的模型比真實的數(shù)據(jù)分布更復雜,而欠擬合表示采用的模型比真實的數(shù)據(jù)分布要簡單。
在統(tǒng)計學習框架下,大家刻畫模型復雜度的時候,有這么個觀點,認為Error = Bias + Variance。這里的Error大概可以理解為模型的預測錯誤率,是有兩部分組成的,一部分是由于模型太簡單而帶來的估計不準確的部分(Bias),另一部分是由于模型太復雜而帶來的更大的變化空間和不確定性(Variance)。
所以,這樣就容易分析樸素貝葉斯了。它簡單的假設了各個數(shù)據(jù)之間是無關(guān)的,是一個被嚴重簡化了的模型。所以,對于這樣一個簡單模型,大部分場合都會Bias部分大于Variance部分,也就是說高偏差而低方差。
在實際中,為了讓Error盡量小,我們在選擇模型的時候需要平衡Bias和Variance所占的比例,也就是平衡over-fitting和under-fitting。
偏差和方差與模型復雜度的關(guān)系使用下圖更加明了:
當模型復雜度上升的時候,偏差會逐漸變小,而方差會逐漸變大。
常見算法優(yōu)缺點
1.樸素貝葉斯
樸素貝葉斯屬于生成式模型(關(guān)于生成模型和判別式模型,主要還是在于是否是要求聯(lián)合分布),非常簡單,你只是做了一堆計數(shù)。如果注有條件獨立性假設(一個比較嚴格的條件),樸素貝葉斯分類器的收斂速度將快于判別模型,如邏輯回歸,所以你只需要較少的訓練數(shù)據(jù)即可。即使NB條件獨立假設不成立,NB分類器在實踐中仍然表現(xiàn)的很出色。它的主要缺點是它不能學習特征間的相互作用,用mRMR中R來講,就是特征冗余。引用一個比較經(jīng)典的例子,比如,雖然你喜歡Brad Pitt和Tom Cruise的電影,但是它不能學習出你不喜歡他們在一起演的電影。
優(yōu)點:
樸素貝葉斯模型發(fā)源于古典數(shù)學理論,有著堅實的數(shù)學基礎,以及穩(wěn)定的分類效率。
對小規(guī)模的數(shù)據(jù)表現(xiàn)很好,能個處理多分類任務,適合增量式訓練;
對缺失數(shù)據(jù)不太敏感,算法也比較簡單,常用于文本分類。
缺點:
需要計算先驗概率;
分類決策存在錯誤率;
對輸入數(shù)據(jù)的表達形式很敏感。
2.Logistic Regression(邏輯回歸)
屬于判別式模型,有很多正則化模型的方法(L0, L1,L2,etc),而且你不必像在用樸素貝葉斯那樣擔心你的特征是否相關(guān)。與決策樹與SVM機相比,你還會得到一個不錯的概率解釋,你甚至可以輕松地利用新數(shù)據(jù)來更新模型(使用在線梯度下降算法,online gradient descent)。如果你需要一個概率架構(gòu)(比如,簡單地調(diào)節(jié)分類閾值,指明不確定性,或者是要獲得置信區(qū)間),或者你希望以后將更多的訓練數(shù)據(jù)快速整合到模型中去,那么使用它吧。
Sigmoid函數(shù):
優(yōu)點:
實現(xiàn)簡單,廣泛的應用于工業(yè)問題上;
分類時計算量非常小,速度很快,存儲資源低;
便利的觀測樣本概率分數(shù);
對邏輯回歸而言,多重共線性并不是問題,它可以結(jié)合L2正則化來解決該問題;
缺點:
當特征空間很大時,邏輯回歸的性能不是很好;
容易欠擬合,一般準確度不太高
不能很好地處理大量多類特征或變量;
只能處理兩分類問題(在此基礎上衍生出來的softmax可以用于多分類),且必須線性可分;
對于非線性特征,需要進行轉(zhuǎn)換;
3.線性回歸
線性回歸是用于回歸的,而不像Logistic回歸是用于分類,其基本思想是用梯度下降法對最小二乘法形式的誤差函數(shù)進行優(yōu)化,當然也可以用normal equation直接求得參數(shù)的解,結(jié)果為:
而在LWLR(局部加權(quán)線性回歸)中,參數(shù)的計算表達式為:
由此可見LWLR與LR不同,LWLR是一個非參數(shù)模型,因為每次進行回歸計算都要遍歷訓練樣本至少一次。
優(yōu)點: 實現(xiàn)簡單,計算簡單;
缺點: 不能擬合非線性數(shù)據(jù).
4.最近領(lǐng)算法——KNN
KNN即最近鄰算法,其主要過程為:
1.計算訓練樣本和測試樣本中每個樣本點的距離(常見的距離度量有歐式距離,馬氏距離等);2.對上面所有的距離值進行排序;3.選前k個最小距離的樣本;4.根據(jù)這k個樣本的標簽進行投票,得到最后的分類類別;
如何選擇一個最佳的K值,這取決于數(shù)據(jù)。一般情況下,在分類時較大的K值能夠減小噪聲的影響。但會使類別之間的界限變得模糊。一個較好的K值可通過各種啟發(fā)式技術(shù)來獲取,比如,交叉驗證。另外噪聲和非相關(guān)性特征向量的存在會使K近鄰算法的準確性減小。
近鄰算法具有較強的一致性結(jié)果。隨著數(shù)據(jù)趨于無限,算法保證錯誤率不會超過貝葉斯算法錯誤率的兩倍。對于一些好的K值,K近鄰保證錯誤率不會超過貝葉斯理論誤差率。
KNN算法的優(yōu)點
理論成熟,思想簡單,既可以用來做分類也可以用來做回歸;
可用于非線性分類;
訓練時間復雜度為O(n);
對數(shù)據(jù)沒有假設,準確度高,對outlier不敏感;
缺點
計算量大;
樣本不平衡問題(即有些類別的樣本數(shù)量很多,而其它樣本的數(shù)量很少);
需要大量的內(nèi)存;
5.決策樹
易于解釋。它可以毫無壓力地處理特征間的交互關(guān)系并且是非參數(shù)化的,因此你不必擔心異常值或者數(shù)據(jù)是否線性可分(舉個例子,決策樹能輕松處理好類別A在某個特征維度x的末端,類別B在中間,然后類別A又出現(xiàn)在特征維度x前端的情況)。它的缺點之一就是不支持在線學習,于是在新樣本到來后,決策樹需要全部重建。另一個缺點就是容易出現(xiàn)過擬合,但這也就是諸如隨機森林RF(或提升樹boosted tree)之類的集成方法的切入點。另外,隨機森林經(jīng)常是很多分類問題的贏家(通常比支持向量機好上那么一丁點),它訓練快速并且可調(diào),同時你無須擔心要像支持向量機那樣調(diào)一大堆參數(shù),所以在以前都一直很受歡迎。
決策樹中很重要的一點就是選擇一個屬性進行分枝,因此要注意一下信息增益的計算公式,并深入理解它。
信息熵的計算公式如下:
其中的n代表有n個分類類別(比如假設是2類問題,那么n=2)。分別計算這2類樣本在總樣本中出現(xiàn)的概率p1和p2,這樣就可以計算出未選中屬性分枝前的信息熵。
現(xiàn)在選中一個屬性xixi用來進行分枝,此時分枝規(guī)則是:如果xi=vxi=v的話,將樣本分到樹的一個分支;如果不相等則進入另一個分支。很顯然,分支中的樣本很有可能包括2個類別,分別計算這2個分支的熵H1和H2,計算出分枝后的總信息熵H’ =p1 H1+p2H2,則此時的信息增益ΔH = H – H’。以信息增益為原則,把所有的屬性都測試一邊,選擇一個使增益最大的屬性作為本次分枝屬性。
決策樹自身的優(yōu)點
計算簡單,易于理解,可解釋性強;
比較適合處理有缺失屬性的樣本;
能夠處理不相關(guān)的特征;
在相對短的時間內(nèi)能夠?qū)Υ笮蛿?shù)據(jù)源做出可行且效果良好的結(jié)果。
缺點
容易發(fā)生過擬合(隨機森林可以很大程度上減少過擬合);
忽略了數(shù)據(jù)之間的相關(guān)性;
對于那些各類別樣本數(shù)量不一致的數(shù)據(jù),在決策樹當中,信息增益的結(jié)果偏向于那些具有更多數(shù)值的特征(只要是使用了信息增益,都有這個缺點,如RF)。
5.1 Adaboosting
Adaboost是一種加和模型,每個模型都是基于上一次模型的錯誤率來建立的,過分關(guān)注分錯的樣本,而對正確分類的樣本減少關(guān)注度,逐次迭代之后,可以得到一個相對較好的模型。是一種典型的boosting算法。下面是總結(jié)下它的優(yōu)缺點。
優(yōu)點
adaboost是一種有很高精度的分類器。
可以使用各種方法構(gòu)建子分類器,Adaboost算法提供的是框架。
當使用簡單分類器時,計算出的結(jié)果是可以理解的,并且弱分類器的構(gòu)造極其簡單。
簡單,不用做特征篩選。
不容易發(fā)生overfitting。
關(guān)于隨機森林和GBDT等組合算法,參考這篇文章:機器學習-組合算法總結(jié)
缺點:對outlier比較敏感
6.SVM支持向量機
高準確率,為避免過擬合提供了很好的理論保證,而且就算數(shù)據(jù)在原特征空間線性不可分,只要給個合適的核函數(shù),它就能運行得很好。在動輒超高維的文本分類問題中特別受歡迎。可惜內(nèi)存消耗大,難以解釋,運行和調(diào)參也有些煩人,而隨機森林卻剛好避開了這些缺點,比較實用。
優(yōu)點
可以解決高維問題,即大型特征空間;
能夠處理非線性特征的相互作用;
無需依賴整個數(shù)據(jù);
可以提高泛化能力;
缺點
當觀測樣本很多時,效率并不是很高;
對非線性問題沒有通用解決方案,有時候很難找到一個合適的核函數(shù);
對缺失數(shù)據(jù)敏感;
對于核的選擇也是有技巧的(libsvm中自帶了四種核函數(shù):線性核、多項式核、RBF以及sigmoid核):
第一,如果樣本數(shù)量小于特征數(shù),那么就沒必要選擇非線性核,簡單的使用線性核就可以了;
第二,如果樣本數(shù)量大于特征數(shù)目,這時可以使用非線性核,將樣本映射到更高維度,一般可以得到更好的結(jié)果;
第三,如果樣本數(shù)目和特征數(shù)目相等,該情況可以使用非線性核,原理和第二種一樣。
對于第一種情況,也可以先對數(shù)據(jù)進行降維,然后使用非線性核,這也是一種方法。
7. 人工神經(jīng)網(wǎng)絡的優(yōu)缺點
人工神經(jīng)網(wǎng)絡的優(yōu)點:
分類的準確度高;
并行分布處理能力強,分布存儲及學習能力強,
對噪聲神經(jīng)有較強的魯棒性和容錯能力,能充分逼近復雜的非線性關(guān)系;
具備聯(lián)想記憶的功能。
人工神經(jīng)網(wǎng)絡的缺點:
神經(jīng)網(wǎng)絡需要大量的參數(shù),如網(wǎng)絡拓撲結(jié)構(gòu)、權(quán)值和閾值的初始值;
不能觀察之間的學習過程,輸出結(jié)果難以解釋,會影響到結(jié)果的可信度和可接受程度;
學習時間過長,甚至可能達不到學習的目的。
8、K-Means聚類
之前寫過一篇關(guān)于K-Means聚類的文章,博文鏈接:機器學習算法-K-means聚類。關(guān)于K-Means的推導,里面有著很強大的EM思想。
優(yōu)點
算法簡單,容易實現(xiàn) ;
對處理大數(shù)據(jù)集,該算法是相對可伸縮的和高效率的,因為它的復雜度大約是O(nkt),其中n是所有對象的數(shù)目,k是簇的數(shù)目,t是迭代的次數(shù)。通常k< 算法嘗試找出使平方誤差函數(shù)值最小的k個劃分。當簇是密集的、球狀或團狀的,且簇與簇之間區(qū)別明顯時,聚類效果較好。
缺點
對數(shù)據(jù)類型要求較高,適合數(shù)值型數(shù)據(jù);
可能收斂到局部最小值,在大規(guī)模數(shù)據(jù)上收斂較慢
K值比較難以選取;
對初值的簇心值敏感,對于不同的初始值,可能會導致不同的聚類結(jié)果;
不適合于發(fā)現(xiàn)非凸面形狀的簇,或者大小差別很大的簇。
對于”噪聲”和孤立點數(shù)據(jù)敏感,少量的該類數(shù)據(jù)能夠?qū)ζ骄诞a(chǎn)生極大影響。
算法選擇參考
之前翻譯過一些國外的文章,有一篇文章中給出了一個簡單的算法選擇技巧:
首當其沖應該選擇的就是邏輯回歸,如果它的效果不怎么樣,那么可以將它的結(jié)果作為基準來參考,在基礎上與其他算法進行比較;
然后試試決策樹(隨機森林)看看是否可以大幅度提升你的模型性能。即便最后你并沒有把它當做為最終模型,你也可以使用隨機森林來移除噪聲變量,做特征選擇;
如果特征的數(shù)量和觀測樣本特別多,那么當資源和時間充足時(這個前提很重要),使用SVM不失為一種選擇。
通常情況下:【GBDT>=SVM>=RF>=Adaboost>=Other…】,現(xiàn)在深度學習很熱門,很多領(lǐng)域都用到,它是以神經(jīng)網(wǎng)絡為基礎的,目前我自己也在學習,只是理論知識不是很厚實,理解的不夠深,這里就不做介紹了。
算法固然重要,但好的數(shù)據(jù)卻要優(yōu)于好的算法,設計優(yōu)良特征是大有裨益的。假如你有一個超大數(shù)據(jù)集,那么無論你使用哪種算法可能對分類性能都沒太大影響(此時就可以根據(jù)速度和易用性來進行抉擇)。
核心關(guān)注:拓步ERP系統(tǒng)平臺是覆蓋了眾多的業(yè)務領(lǐng)域、行業(yè)應用,蘊涵了豐富的ERP管理思想,集成了ERP軟件業(yè)務管理理念,功能涉及供應鏈、成本、制造、CRM、HR等眾多業(yè)務領(lǐng)域的管理,全面涵蓋了企業(yè)關(guān)注ERP管理系統(tǒng)的核心領(lǐng)域,是眾多中小企業(yè)信息化建設首選的ERP管理軟件信賴品牌。
轉(zhuǎn)載請注明出處:拓步ERP資訊網(wǎng)http://www.guhuozai8.cn/
本文標題:盤點常見機器學習算法及比較
本文網(wǎng)址:http://www.guhuozai8.cn/html/consultation/10839319634.html