8種常見機器學習算法比較

2021-01-08 雷鋒網

雷鋒網(公眾號:雷鋒網)按:本文轉自劉志偉責編,在機器學習中選擇一個恰當的算法十分重要,文中主要介紹了8種計算機算法及其優缺點,為大家進行算法選擇時提供一點意見。

簡介

機器學習算法太多了,分類、回歸、聚類、推薦、圖像識別領域等等,要想找到一個合適算法真的不容易,所以在實際應用中,我們一般都是採用啟發式學習方式來實驗。通常最開始我們都會選擇大家普遍認同的算法,諸如SVM,GBDT,Adaboost,現在深度學習很火熱,神經網絡也是一個不錯的選擇。假如你在乎精度(accuracy)的話,最好的方法就是通過交叉驗證(cross-validation)對各個算法一個個地進行測試,進行比較,然後調整參數確保每個算法達到最優解,最後選擇最好的一個。但是如果你只是在尋找一個「足夠好」的算法來解決你的問題,或者這裡有些技巧可以參考,下面來分析下各個算法的優缺點,基於算法的優缺點,更易於我們去選擇它。

偏差&方差

在統計學中,一個模型好壞,是根據偏差和方差來衡量的,所以我們先來普及一下偏差和方差:

偏差:描述的是預測值(估計值)的期望E』與真實值Y之間的差距。偏差越大,越偏離真實數據。

方差:描述的是預測值P的變化範圍,離散程度,是預測值的方差,也就是離其期望值E的距離。方差越大,數據的分布越分散。

模型的真實誤差是兩者之和,如下圖:

                       

如果是小訓練集,高偏差/低方差的分類器(例如,樸素貝葉斯NB)要比低偏差/高方差大分類的優勢大(例如,KNN),因為後者會過擬合。但是,隨著你訓練集的增長,模型對於原數據的預測能力就越好,偏差就會降低,此時低偏差/高方差分類器就會漸漸的表現其優勢(因為它們有較低的漸近誤差),此時高偏差分類器此時已經不足以提供準確的模型了。

當然,你也可以認為這是生成模型(NB)與判別模型(KNN)的一個區別。

為什麼說樸素貝葉斯是高偏差低方差?

以下內容引自知乎:

首先,假設你知道訓練集和測試集的關係。簡單來講是我們要在訓練集上學習一個模型,然後拿到測試集去用,效果好不好要根據測試集的錯誤率來衡量。但很多時候,我們只能假設測試集和訓練集的是符合同一個數據分布的,但卻拿不到真正的測試數據。這時候怎麼在只看到訓練錯誤率的情況下,去衡量測試錯誤率呢?

由於訓練樣本很少(至少不足夠多),所以通過訓練集得到的模型,總不是真正正確的。(就算在訓練集上正確率100%,也不能說明它刻畫了真實的數據分布,要知道刻畫真實的數據分布才是我們的目的,而不是只刻畫訓練集的有限的數據點)。而且,實際中,訓練樣本往往還有一定的噪音誤差,所以如果太追求在訓練集上的完美而採用一個很複雜的模型,會使得模型把訓練集裡面的誤差都當成了真實的數據分布特徵,從而得到錯誤的數據分布估計。這樣的話,到了真正的測試集上就錯的一塌糊塗了(這種現象叫過擬合)。但是也不能用太簡單的模型,否則在數據分布比較複雜的時候,模型就不足以刻畫數據分布了(體現為連在訓練集上的錯誤率都很高,這種現象較欠擬合)。過擬合表明採用的模型比真實的數據分布更複雜,而欠擬合表示採用的模型比真實的數據分布要簡單。

在統計學習框架下,大家刻畫模型複雜度的時候,有這麼個觀點,認為Error = Bias + Variance。這裡的Error大概可以理解為模型的預測錯誤率,是有兩部分組成的,一部分是由於模型太簡單而帶來的估計不準確的部分(Bias),另一部分是由於模型太複雜而帶來的更大的變化空間和不確定性(Variance)。

所以,這樣就容易分析樸素貝葉斯了。它簡單的假設了各個數據之間是無關的,是一個被嚴重簡化了的模型。所以,對於這樣一個簡單模型,大部分場合都會Bias部分大於Variance部分,也就是說高偏差而低方差。

在實際中,為了讓Error儘量小,我們在選擇模型的時候需要平衡Bias和Variance所佔的比例,也就是平衡over-fitting和under-fitting。

偏差和方差與模型複雜度的關係使用下圖更加明了:

           

當模型複雜度上升的時候,偏差會逐漸變小,而方差會逐漸變大。

常見算法優缺點

1.樸素貝葉斯

樸素貝葉斯屬於生成式模型(關於生成模型和判別式模型,主要還是在於是否是要求聯合分布),非常簡單,你只是做了一堆計數。如果注有條件獨立性假設(一個比較嚴格的條件),樸素貝葉斯分類器的收斂速度將快於判別模型,如邏輯回歸,所以你只需要較少的訓練數據即可。即使NB條件獨立假設不成立,NB分類器在實踐中仍然表現的很出色。它的主要缺點是它不能學習特徵間的相互作用,用mRMR中R來講,就是特徵冗餘。引用一個比較經典的例子,比如,雖然你喜歡Brad Pitt和Tom Cruise的電影,但是它不能學習出你不喜歡他們在一起演的電影。

優點:

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

對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練;

對缺失數據不太敏感,算法也比較簡單,常用於文本分類。

缺點:

需要計算先驗概率;

分類決策存在錯誤率;

對輸入數據的表達形式很敏感。

2.Logistic Regression(邏輯回歸)

屬於判別式模型,有很多正則化模型的方法(L0, L1,L2,etc),而且你不必像在用樸素貝葉斯那樣擔心你的特徵是否相關。與決策樹與SVM機相比,你還會得到一個不錯的概率解釋,你甚至可以輕鬆地利用新數據來更新模型(使用在線梯度下降算法,online gradient descent)。如果你需要一個概率架構(比如,簡單地調節分類閾值,指明不確定性,或者是要獲得置信區間),或者你希望以後將更多的訓練數據快速整合到模型中去,那麼使用它吧。

Sigmoid函數

優點

缺點

當特徵空間很大時,邏輯回歸的性能不是很好;

容易欠擬合,一般準確度不太高

不能很好地處理大量多類特徵或變量;

只能處理兩分類問題(在此基礎上衍生出來的softmax可以用於多分類),且必須線性可分;

對於非線性特徵,需要進行轉換;

3.線性回歸

線性回歸是用於回歸的,而不像Logistic回歸是用於分類,其基本思想是用梯度下降法對最小二乘法形式的誤差函數進行優化,當然也可以用normal equation直接求得參數的解,結果為:

而在LWLR(局部加權線性回歸)中,參數的計算表達式為:

由此可見LWLR與LR不同,LWLR是一個非參數模型,因為每次進行回歸計算都要遍歷訓練樣本至少一次。

優點: 實現簡單,計算簡單;
缺點: 不能擬合非線性數據.

4.最近領算法——KNN

KNN即最近鄰算法,其主要過程為:

1. 計算訓練樣本和測試樣本中每個樣本點的距離(常見的距離度量有歐式距離,馬氏距離等);2. 對上面所有的距離值進行排序;3. 選前k個最小距離的樣本;4. 根據這k個樣本的標籤進行投票,得到最後的分類類別;

如何選擇一個最佳的K值,這取決於數據。一般情況下,在分類時較大的K值能夠減小噪聲的影響。但會使類別之間的界限變得模糊。一個較好的K值可通過各種啟發式技術來獲取,比如,交叉驗證。另外噪聲和非相關性特徵向量的存在會使K近鄰算法的準確性減小。

近鄰算法具有較強的一致性結果。隨著數據趨於無限,算法保證錯誤率不會超過貝葉斯算法錯誤率的兩倍。對於一些好的K值,K近鄰保證錯誤率不會超過貝葉斯理論誤差率。

KNN算法的優點

缺點

5.決策樹

易於解釋。它可以毫無壓力地處理特徵間的交互關係並且是非參數化的,因此你不必擔心異常值或者數據是否線性可分(舉個例子,決策樹能輕鬆處理好類別A在某個特徵維度x的末端,類別B在中間,然後類別A又出現在特徵維度x前端的情況)。它的缺點之一就是不支持在線學習,於是在新樣本到來後,決策樹需要全部重建。另一個缺點就是容易出現過擬合,但這也就是諸如隨機森林RF(或提升樹boosted tree)之類的集成方法的切入點。另外,隨機森林經常是很多分類問題的贏家(通常比支持向量機好上那麼一丁點),它訓練快速並且可調,同時你無須擔心要像支持向量機那樣調一大堆參數,所以在以前都一直很受歡迎。

決策樹中很重要的一點就是選擇一個屬性進行分枝,因此要注意一下信息增益的計算公式,並深入理解它。

信息熵的計算公式如下:

其中的n代表有n個分類類別(比如假設是2類問題,那麼n=2)。分別計算這2類樣本在總樣本中出現的概率p1和p2,這樣就可以計算出未選中屬性分枝前的信息熵。

現在選中一個屬性xixi用來進行分枝,此時分枝規則是:如果xi=vxi=v的話,將樣本分到樹的一個分支;如果不相等則進入另一個分支。很顯然,分支中的樣本很有可能包括2個類別,分別計算這2個分支的熵H1和H2,計算出分枝後的總信息熵H』 =p1H1+p2 H2,則此時的信息增益ΔH = H - H』。以信息增益為原則,把所有的屬性都測試一邊,選擇一個使增益最大的屬性作為本次分枝屬性。

決策樹自身的優點:

缺點

5.1 Adaboosting

Adaboost是一種加和模型,每個模型都是基於上一次模型的錯誤率來建立的,過分關注分錯的樣本,而對正確分類的樣本減少關注度,逐次迭代之後,可以得到一個相對較好的模型。是一種典型的boosting算法。下面是總結下它的優缺點。

優點

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

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

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

簡單,不用做特徵篩選。

不容易發生overfitting。

關於隨機森林和GBDT等組合算法,參考這篇文章:機器學習-組合算法總結

缺點:對outlier比較敏感

6.SVM支持向量機

高準確率,為避免過擬合提供了很好的理論保證,而且就算數據在原特徵空間線性不可分,只要給個合適的核函數,它就能運行得很好。在動輒超高維的文本分類問題中特別受歡迎。可惜內存消耗大,難以解釋,運行和調參也有些煩人,而隨機森林卻剛好避開了這些缺點,比較實用。

優點

可以解決高維問題,即大型特徵空間;

能夠處理非線性特徵的相互作用;

無需依賴整個數據;

可以提高泛化能力;

缺點

對於核的選擇也是有技巧的(libsvm中自帶了四種核函數:線性核、多項式核、RBF以及sigmoid核):

第一,如果樣本數量小於特徵數,那麼就沒必要選擇非線性核,簡單的使用線性核就可以了;

第二,如果樣本數量大於特徵數目,這時可以使用非線性核,將樣本映射到更高維度,一般可以得到更好的結果;

第三,如果樣本數目和特徵數目相等,該情況可以使用非線性核,原理和第二種一樣。

對於第一種情況,也可以先對數據進行降維,然後使用非線性核,這也是一種方法。

7. 人工神經網絡的優缺點

人工神經網絡的優點

人工神經網絡的缺點

8、K-Means聚類

之前寫過一篇關於K-Means聚類的文章,博文連結:機器學習算法-K-means聚類。關於K-Means的推導,裡面有著很強大的EM思想。

優點

算法簡單,容易實現 ;

對處理大數據集,該算法是相對可伸縮的和高效率的,因為它的複雜度大約是O(nkt),其中n是所有對象的數目,k是簇的數目,t是迭代的次數。通常k<<n。這個算法通常局部收斂。

算法嘗試找出使平方誤差函數值最小的k個劃分。當簇是密集的、球狀或團狀的,且簇與簇之間區別明顯時,聚類效果較好。

缺點

對數據類型要求較高,適合數值型數據;

可能收斂到局部最小值,在大規模數據上收斂較慢

K值比較難以選取;

對初值的簇心值敏感,對於不同的初始值,可能會導致不同的聚類結果;

不適合於發現非凸面形狀的簇,或者大小差別很大的簇。

對於」噪聲」和孤立點數據敏感,少量的該類數據能夠對平均值產生極大影響。

算法選擇參考

之前翻譯過一些國外的文章,有一篇文章中給出了一個簡單的算法選擇技巧:

1. 首當其衝應該選擇的就是邏輯回歸,如果它的效果不怎麼樣,那麼可以將它的結果作為基準來參考,在基礎上與其他算法進行比較;

2. 然後試試決策樹(隨機森林)看看是否可以大幅度提升你的模型性能。即便最後你並沒有把它當做為最終模型,你也可以使用隨機森林來移除噪聲變量,做特徵選擇;

3. 如果特徵的數量和觀測樣本特別多,那麼當資源和時間充足時(這個前提很重要),使用SVM不失為一種選擇。

通常情況下:【GBDT>=SVM>=RF>=Adaboost>=Other…】,現在深度學習很熱門,很多領域都用到,它是以神經網絡為基礎的,目前我自己也在學習,只是理論知識不是很厚實,理解的不夠深,這裡就不做介紹了。

算法固然重要,但好的數據卻要優於好的算法,設計優良特徵是大有裨益的。假如你有一個超大數據集,那麼無論你使用哪種算法可能對分類性能都沒太大影響(此時就可以根據速度和易用性來進行抉擇)。

雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • 常見機器學習算法優缺點比較
    · 第一,如果樣本數量小於特徵數,那麼就沒必要選擇非線性核,簡單的使用線性核就可以了;  · 第二,如果樣本數量大於特徵數目,這時可以使用非線性核,將樣本映射到更高維度,一般可以得到更好的結果;  · 第三,如果樣本數目和特徵數目相等,該情況可以使用非線性核,原理和第二種一樣
  • Python機器學習11:機器學習中的六種分類算法及實現(下)
    在機器學習中,往往需要根據具體的研究問題,選取合適的機器學習模型。上一篇文章介紹了模型選擇的基本原則和二種線性分類模型,本文將會接著介紹另外四種常見的非線性分類模型。引言本教程分為三部分,分別如下所示。
  • 常見的機器學習算法,你知道幾個?
    誕生於1956年的人工智慧,由於受到智能算法、計算速度、存儲水平等因素的影響,在六十多年的發展過程中經歷了多次高潮和低谷。最近幾年,得益於數據量的上漲、運算力的提升,特別是機器學習新算法的出現,人工智慧迎來了大爆發的時代。提到機器學習這個詞時,有些人首先想到的可能是科幻電影裡的機器人。
  • 63種機器學習算法
    但是有一個問題,機器學習是複雜的,對於剛進入該領域的人來說,這是第一次在B學校中學習它,似乎很難將這些概念與繁忙的日程一起掌握。 以前沒有編碼經驗的B-school學生,機器學習很困難,一個人會迷失在監督學習與無監督學習的所有不同算法和分支中。 它們背後的數學很難理解並且學習曲線陡峭。 對於開始,python或R本身似乎是一個波濤洶湧的大海,需要一些專門的實踐。
  • 常見機器學習算法背後的數學
    不同的機器學習算法是如何從數據中學習並預測未見數據的呢機器學習算法是這樣設計的,它們從經驗中學習,當它們獲取越來越多的數據時,性能就會提高。每種算法都有自己學習和預測數據的方法。在本文中,我們將介紹一些機器學習算法的功能,以及在這些算法中實現的有助於學習過程的一些數學方程。
  • 常見的幾種加密算法比較
    ②尋求新算法:跳出以常見的迭代為基礎的構造思路,脫離基於某些數學問題複雜性的構造方法。如劉尊全先生提出的劉氏算法,是一種基於密鑰的公開密鑰體制,它採用了隨機性原理構造加解密變換,並將其全部運算控制隱匿於密鑰中,密鑰長度可變。它是採用選取一定長度的分割來構造大的搜索空間,從而實現一次非線性變換。此種加密算法加密強度高、速度快、計算開銷低。
  • 分享最適合新手入門的10種機器學習算法
    編者按:Medium博主James Le近日在網絡上分享了他認為的最適合新手的機器學習算法,並授權論智進行編譯。以下是我們對原文的編譯,如有錯誤還請指出。 在機器學習界,有這樣一個「沒有免費午餐」的定理。簡單地說,該理論認為,沒有一種算法能解決所有問題,尤其對監督學習而言。
  • 隱藏在機器視覺中的6種常見機器學習應用
    隱藏在機器視覺中的6種常見機器學習應用機器學習是人工智慧的子分支無論是電子商務還是醫療保健,幾乎所有行業都在廣泛使用機器學習來製作未來派解決方案和產品。機器學習在很大程度上取決於幫助機器進行自我學習而無需明確指示的程序和算法。機器學習幾乎決定了我們的日常生活-您想知道如何?讓我們看一下機器學習的頂級應用,以了解它如何塑造數字經濟。
  • 三張圖讀懂機器學習:基本概念、五大流派與九種常見算法
    四大會計師事務所之一的普華永道(PwC)近日發布了多份解讀機器學習基礎的圖表,其中介紹了機器學習的基本概念、原理、歷史、未來趨勢和一些常見的算法。為便於讀者閱讀,機器之心對這些圖表進行了編譯和拆分,分三大部分對這些內容進行了呈現,其中也加入了一些擴展連結,希望能幫助你進一步擴展閱讀。 一、機器學習概覽
  • 機器學習常見基本概念
    機器學習是什麼• 人工智慧的一個重要學科分支多領域交叉學科。• 數據驅動,在數據上通過算法總結規律模式,應用在新數據上。交叉驗證法的思想是:每次用k-1個子集的併集作為訓練集,餘下的那個子集作為測試集,這樣就有K種訓練集/測試集劃分的情況,從而可進行k次訓練和測試,最終返回k次測試結果的均值。交叉驗證法也稱「k折交叉驗證」,k最常用的取值是10,下圖給出了10折交叉驗證的示意圖。
  • 機器學習算法盤點:人工神經網絡、深度學習
    機器學習算法盤點:人工神經網絡、深度學習 佚名 發表於 2016-08-01 16:26:33   機器學習無疑是當前數據分析領域的一個熱點內容。很多人在平時的工作中都或多或少會用到機器學習的算法。
  • 算法應用|機器學習python應用,簡單機器學習項目實踐
    1 機器學習中的Hello World頂目學習編程時,往往我們的第一句代碼就是print(「Hello World」),而接下來的這個數據集,可以說得上是機器學習中的Hello World頂目,入門學習機器學習的過程中最常見的一個數據集。
  • AI產品經理必修課:機器學習算法
    三個名詞之間的關係人工智慧>機器學習>深度學習以機器學習算法是否應用了神經網絡作為區分標準,應用了多隱含層神經網絡的機器學習就是深度學習。4. 對AI產品經理的要求熟悉機器學習流程(詳見文章第三部分);了解機器學習可以解決的問題分類(詳見文章第四部分);了解算法的基本原理;了解工程實踐中算數據和計算資源三者間的依賴關係等。
  • 流行的機器學習算法總結,幫助你開啟機器學習算法學習之旅
    機器學習算法概述「機器智能是人類永遠需要的一項發明。」— Nick Bostrom.如果您可以回顧幾年前的AI並將其與現在的AI進行比較,您會驚訝地發現AI的發展速度隨著時間的增長呈指數級增長。它已擴展到各種領域,例如ML,Expert Systems,NLP等數十個領域。
  • 機器學習算法匯總:人工神經網絡、深度學習及其它
    在機器學習或者人工智慧領域,人們首先會考慮算法的學習方式。在機器學習領域,有幾種主要的學習方式。將算法按照學習方式分類是一個不錯的想法,這樣可以讓人們在建模和算法選擇的時候考慮能根據輸入數據來選擇最合適的算法來獲得最好的結果。 監督式學習:
  • 教你學Python42-了解機器學習算法的5種方法(無數學)
    最後,您將發現在標準數據集上進行機器學習時可以使用的5種技術,以逐步增強對機器學習算法的理解。在我的新書中(包括22個excel教程和示例),了解機器學習算法如何工作,包括kNN,決策樹,樸素貝葉斯,SVM,集成等。如何學習機器學習沒有數學最後而不是先學理論向開發人員教授機器學習的方式很糟糕。它是自下而上的。
  • 幾種常見的校驗算法
    下面就介紹幾種常見的校驗算法。 一、校驗和 校驗和是最基本,也是嵌入式工程師最常用的一種校驗算法,其實現方法很簡單,簡單到只有幾行代碼。 uint8_t CheckXOR(uint8_t *Buf, uint8_t Len){ uint8_t i = 0; uint8_t x = 0; for(i=0; i<Len; i++) { x = x^(*(Buf+i)); } return x;} 校驗和、異或校驗的方式有很多種,比如有的還會傳入一個參數作為異或校驗的值
  • 機器學習前沿算法介紹
    上一篇推文介紹了機器學習領域比較常見的幾種算法,除此之外,隨著人工智慧深度學習技術的飛速發展,也湧現了不少前沿研究和新的算法,本文會對上一篇推文進行簡要回顧,並擴展介紹一些前沿算法機器學習算法回顧機器學習的本質就是尋找一個函數,它根據某種統計意義來預測現實中已發生或即將發生的現象,這個函數可以相當複雜,它也許具有上千萬個參數,以至於根本沒有人能夠把這個函數的數學表達式給手寫出來,但幸運的是,機器可以。
  • 算法應用|機器學習python應用,初識機器學習是怎樣滴感受?
    一般是在數據組中包含最終結果(0 , 1),通過算法讓機器自己減少誤差。這一類學習主要應用於分類和預測(Regression &Classify) 。監督學習從給定的訓練數據集中學習出一個目標函數,當新的數據到來時,可以根據這個函數預測結果。監督學習的訓練集要求包括輸入和輸出,也可以說包括特徵和目標,訓練集中的目標是由人標註的。常見的監督學習算法包括回歸分析和統計分類。
  • 機器學習算法的類型
    1.3.1 有監督學習算法在有監督的場景中,模型的任務是查找樣本的正確標籤,假設在訓練集時標記正確,並有可能將估計值與正確值進行比較),但一個非常常見的策略(尤其在深度學習中)是採用隨機梯度下降(Stochastic Gradient Descent,SGD)算法。