常用機器學習算法優缺點分析

1 評論 8439 瀏覽 38 收藏 22 分鐘

編輯導語:機器學習是當下數據分析領域的一個熱點內容,我們日常工作中多多少少都會涉及到一些。但在機器學習領域,算法并不能完全解決所有的問題。本文梳理了有監督學習和無監督學習的兩個方面,列舉了其中幾種算法,總結它們的優缺點,分享給你。

機器學習無疑是當前數據分析領域的一個熱點內容,其理論和方法已經廣泛應用于解決工程應用的復雜問題,很多人在平時的工作中都或多或少會用到機器學習的算法。在機器學習領域,沒有算法能完美地解決所有問題。比如說,神經網絡并不是在任何情況下都能比決策樹更有優勢,反之亦然。它們要受很多因素的影響,比如你的數據集的規?;蚪Y構。

其結果是,在用給定的測試集來評估性能并挑選算法時,你應當根據具體的問題來采用不同的算法。例如,如果模型要求可解釋性較強,首先想到的就是邏輯(線性)回歸,如果模型要求準確度較高且速度較快,首先想到的是Xgboost,如果數據量巨大且很稀疏,首先想到怎么用神經網絡解決此問題。

因此,如何選擇機器學習算法、選擇哪一個算法以及算法建模時該注意哪些問題成了工程師的一個難題,本文的目的總結了常用機器學習算法優缺點,供大家在工作、學習甚至面試中參考。機器學習主要分為有監督學習和無監督學習,本文從這兩方面進行了梳理。

一、有監督算法

有監督學習是指模型學習時有特定目標,即目標是人工標注的,主要用做分類或者回歸。常用的有監督學習主要有knn、邏輯(線性)回歸、決策樹、隨機森林、adaboost、GBDT、xgboost、svm、樸素貝葉斯、人工神經網絡等算法。

1. 最近鄰算法——KNN

KNN可以說是最簡單的分類算法,和另一種機器學習算法K均值算法有點像,但有著本質區別(K均值算法是無監督算法)。KNN的全稱是KNearestNeighbors,意思是K個最近的鄰居,KNN的原理就是當預測一個新的值x的時候,根據它距離最近的K個點是什么類別來判斷x屬于哪個類別。

KNN算法的優點:

  • 理論成熟,簡單易用,相比其他算法,KNN算是比較簡潔明了的算法,工程上非常容易實現;模型訓練時間快,訓練時間復雜度為O(n),KNN算法是惰性的;
  • 對數據沒有假設,準確度高,對異常值不敏感。

KNN算法的缺點:

  • 對內存要求較高,因為該算法存儲了所有訓練數據;
  • KNN每一次分類都會重新進行一次全局運算,且對于樣本容量大的數據集計算量比較大(一般涉及到距離計算的模型都會有這種缺點,如后面講的SVM、密度聚類等)。

2. 邏輯(線性)回歸

邏輯回歸是分類模型,線性回歸是回歸模型,邏輯回歸和線性回歸原理相似,邏輯回歸其實僅為在線性回歸的基礎上,套用了一個邏輯函數。

線性回歸的損失函數為均方誤差類損失,邏輯回歸的損失函數為交叉熵損失。

邏輯回歸的損失函數為什么選擇交叉熵損失而不選擇均方誤差是面試中經常問道的問題,這里簡單說一下:使用MSE作為損失函數的話,它的梯度是和sigmod函數的導數有關的,如果當前模型的輸出接近0或者1時,就會非常小,接近0,使得求得的梯度很小,損失函數收斂的很慢。

但是我們使用交叉熵的話就不會出現這樣的情況,它的導數就是一個差值,誤差大的話更新的就快,誤差小的話就更新的慢點,這正是我們想要的邏輯(線性)回歸的優點:

  • 可解釋行強。本人認為這是邏輯(線性)回歸最大的優點,應該是機器學習算法中可解釋最強的,因為它訓練的參數即為每個特征的權重,并且能夠定位到每個樣本的可解釋,而且它的輸出為概率值;
  • 計算量小,速度很快,存儲資源低,工程上實現簡單,廣泛應用于工業界。

邏輯(線性)回歸的缺點:

它最大的缺點就是對特征工程要求較高,主要體現在以下方面:

  • 需要解決特征共線性問題,如果特征共線性較高,訓練的權重不滿秩,有模型不收斂的可能;對于異常值和缺失值非常敏感,需要提前進行數據處理;
  • 模型訓練前需要特征歸一化,不然進行梯度下降尋找最優值時會收斂很慢或者不收斂;
  • 對于非線性連續特征需要連續特征離散化。

當然除了以上缺點,還有它的容易欠擬合,準確度并不是很高(個人認為強于決策樹,弱于SVM、GBDT等強分類器)。

3. 決策樹

決策樹的生成算法有ID3,C4.5和C5.0等。決策樹是一種樹形結構,其中每個內部節點表示一個屬性上的判斷,每個分支代表一個判斷結果的輸出,最后每個葉節點代表一種分類結果。

決策樹的優點:

計算量相對較小,且容易轉化成分類規則.只要沿著樹根向下一直走到葉,沿途的分裂條件就能夠唯一確定一條分類的謂詞;有一定的可解釋性,樹的結構可視化;

具有一定的特征選擇能力,能夠自己處理不相關特征。

決策樹的缺點:

  • 屬于弱分類器,且容易過擬合,可用bagging的方式減小方差(如隨機森林),boosting的方式減少偏差(如GBDT、xgboost);于各類別樣本數量不一致的數據,信息增益偏向于那些更多數值的特征;
  • 容易忽略數據集中屬性的相互關聯。

4. 隨機森林

是以決策樹為基學習器的集成學習算法,如果分類模型,多個決策樹進行投票處理,如果為回歸模型,多個決策樹結果平均值處理。

隨機森林的優點:

  • 隨機森林具有防止過擬合能力,精度比大多數單個算法要好;隨機森林分類器可以處理缺失值;
  • 于有袋外數據(OOB),可以在模型生成過程中取得真實誤差的無偏估計,且不損失訓練數據量在訓練過程中,能夠檢測到feature間的互相影響,且可以得出feature的重要性,具有一定參考意義;
  • 每棵樹可以獨立、同時生成,容易做成并行化方法;
  • 具有一定的特征選擇能力。

隨機森林的缺點:

隨機森林已經被證明在某些噪音較大的分類或回歸問題上會過擬。對于有不同取值的屬性的數據,取值劃分較多的屬性會對隨機森林產生更大的影響,所以隨機森林在這種數據上產出的屬性權值是不可信的。

5. GBDT

GBDT是通過采用加法模型(即基函數的線性組合),以及不斷減小訓練過程產生的殘差來達到將數據分類或者回歸的算法,它是決策樹的boosting算法,在傳統機器學習算法里面是對真實分布擬合的最好的幾種算法之一。

GBDT的優點:

  • GBDT屬于強分類器,一般情況下比邏輯回歸和決策樹預測精度要高;GBDT可以自己選擇損失函數,當損失函數為指數函數時,GBDT變為Adaboost算法;
  • GBDT可以做特征組合,往往在此基礎上和其他分類器進行配合。

GBDT的缺點:

由于弱學習器之間存在依賴關系,難以并行訓練數據;和其他樹模型一樣,不適合高維稀疏特征。

6. Xgboost

XGBoost的全稱是eXtremeGradientBoosting,它是經過優化的分布式梯度提升庫,旨在高效、靈活且可移植。

XGBoost是大規模并行boostingtree的工具,它是目前最快最好的開源boostingtree工具包,比常見的工具包快10倍以上。

在數據科學方面,有大量的Kaggle選手選用XGBoost進行數據挖掘比賽,是各大數據科學比賽的必殺武器;在工業界大規模數據方面,XGBoost的分布式版本有廣泛的可移植性,支持在Kubernetes、Hadoop、SGE、MPI、Dask等各個分布式環境上運行,使得它可以很好地解決工業界大規模數據的問題。它是GBDT的進階,也就是Xgboost有著GBDT所有的優點。

此外與GBDT相比,xgBoosting有以下進步:

收斂速度增快:GBDT在優化時只用到一階導數,xgBoosting對代價函數做了二階Talor展開,引入了一階導數和二階導數;

正則化:一定程度防止過擬合。XGBoost在代價函數里加入了正則項,用于控制模型的復雜度。正則項里包含了樹的葉子節點個數、每個葉子節點上輸出的score的L2模的平方和。

從Bias-variancetradeoff角度來講,正則項降低了模型的variance,使學習出來的模型更加簡單,防止過擬合;

并行處理:XGBoost工具支持并行。Boosting不是一種串行的結構嗎?怎么并行的?

注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函數里包含了前面t-1次迭代的預測值)。XGBoost的并行是在特征粒度上的。

我們知道,決策樹的學習最耗時的一個步驟就是對特征的值進行排序(因為要確定最佳分割點),XGBoost在訓練之前,預先對數據進行了排序,然后保存為block結構,后面的迭代中重復地使用這個結構,大大減小計算量。

這個block結構也使得并行成為了可能,在進行節點的分裂時,需要計算每個特征的增益,最終選增益最大的那個特征去做分裂,那么各個特征的增益計算就可以開多線程進行;

Shrinkage(縮減):相當于學習速率。XGBoost在進行完一次迭代后,會將葉子節點的權重乘上該系數,主要是為了削弱每棵樹的影響,讓后面有更大的學習空間。傳統GBDT的實現也有學習速率。

列抽樣:XGBoost借鑒了隨機森林的做法,支持列抽樣,不僅能降低過擬合,還能減少計算。這也是XGBoost異于傳統GBDT的一個特性。

缺失值處理:對于特征的值有缺失的樣本,XGBoost采用的稀疏感知算法可以自動學習出它的分裂方向;

內置交叉驗證:XGBoost允許在每一輪Boosting迭代中使用交叉驗證。

因此,可以方便地獲得最優Boosting迭代次數。而GBM使用網格搜索,只能檢測有限個值。

Xgboost缺點:和其他樹模型一樣,不適合高維稀疏特征;算法參數過多,調參復雜,需要對XGBoost原理十分清楚才能很好的使用XGBoost。

7. SVM

SVM即支持向量機,它是將向量映射到一個更高維的空間里,在這個空間里建立有一個最大間隔超平面。在分開數據的超平面的兩邊建有兩個互相平行的超平面,分隔超平面使兩個平行超平面的距離最大化。假定平行超平面間的距離或差距越大,分類器的總誤差越小。

SVM的優點:

使用核函數可以向高維空間進行映射;屬于強分類器,準確的較高;

能夠處理非線性特征的相互作用。

SVM的缺點:

SVM最大的缺點,本人認為會耗費大量的機器內存和運算時間,這也是為什么隨著數據量越來越多,SVM在工業界運用越來越少的原因;對缺失數據敏感;對非線性問題沒有通用解決方案,有時候很難找到一個合適的核函數。

8. 樸素貝葉斯算法

樸素貝葉斯算法是基于貝葉斯定理和特征條件獨立假設的分類方法,屬于生成式模型。

樸素貝葉斯的優點:

  • 樸素貝葉斯模型發源于古典數學理論,有著堅實的數學基礎,以及穩定的分類效率;對大數量訓練和查詢時具有較高的速度。
  • 即使使用超大規模的訓練集,針對每個項目通常也只會有相對較少的特征數,并且對項目的訓練和分類也僅僅是特征概率的數學運算而已;
  • 對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練(即可以實時的對新增的樣本進行訓練;
  • 對缺失數據不太敏感,算法也比較簡單,常用于文本分類;
  • 樸素貝葉斯對結果解釋容易理解。

樸素貝葉斯的缺點:

理論上,樸素貝葉斯模型與其他分類方法相比具有最小的誤差率。但是實際上并非總是如此,這是因為樸素貝葉斯模型假設屬性之間是相互獨立的,而這個假設在實際應用中往往并不成立的。

雖然在屬性相關性較小時,樸素貝葉斯性能良好。但是,在屬性個數比較多或者屬性之間相關性較大時,分類效果并不好;需要知道先驗概率,并且先驗概率在很多時候多是取決于假設,假設的模型可以有多種,從而導致在某些時候會由于假設的先驗模型而使得預測效果不佳。

因為是通過先驗和數據來決定后驗的概率來決定分類的,所以分類決策存在一定的錯誤率;對輸入數據的表達形式很敏感。

9. 人工神經網絡

以上都是傳統有監督機器學習算法,但傳統的機器學習算法在數據量面前,會觸及一個天花板,一旦到達極限,傳統機器學習算法將無法跟上數據增長的步伐,性能則停滯不前。而數據越多,神經網絡越浪!隨著現在數據量越來越多,人工神經網絡運用越來越廣泛。

人工神經網絡的優點:

  • 可以充分逼近任意復雜的非線性關系;所有定量或定性的信息都等勢分布貯存于網絡內的各神經元,故有很強的魯棒性和容錯性;
  • 采用并行分布處理方法,使得快速進行大量運算成為可能;
  • 可學習和自適應不知道或不確定的系統;
  • 能夠同時處理定量、定性知識。

人工神經網絡的缺點:

  • 黑盒過程,不能觀察之間的學習過程,輸出結果難以解釋,會影響到結果的可信度和可接受程度;學習時間過長,有可能陷入局部極小值,甚至可能達不到學習的目的;
  • 神經網絡需要大量的參數,如網絡拓撲結構、權值和閾值的初始值。

二、無監督算法

無監督學習輸入數據沒有被標記,也沒有確定的結果,樣本數據類別未知,需要根據樣本間的相似性對樣本集進行分類。常用的無監督模型主要指各種聚類,主要有K均值聚類、層次聚類、密度聚類等。

1. K均值聚類

K-Means的主要優點:

原理簡單,容易實現;可解釋度較強。

K-Means的主要缺點:

  • K值很難確定;聚類效果依賴于聚類中心的初始化,收斂到局部最優;
  • 對噪音和異常點敏感;
  • 對于非凸數據集或類別規模差異太大的數據效果不好。

2. 密度聚類

密度聚類優點:

  • 可以對任意形狀的稠密數據集進行聚類,相對的K均值之類的聚類算法一般只適用于凸數據集;可以在聚類的同時發現異常點,對數據集中的異常點不敏感;
  • 聚類結果沒有偏倚,相對的,K-Means之類的聚類算法初始值對聚類結果有很大影響。

密度聚類缺點:

  • 如果樣本集的密度不均勻、聚類間距差相差很大時,聚類質量較差,這時用DBSCAN聚類一般不適合;如果樣本集較大時,聚類收斂時間較長,此時可以對搜索最近鄰時建立的KD樹或者球樹進行規模限制來改進;
  • 調參相對于傳統的K-Means之類的聚類算法稍復雜,主要需要對距離閾值?,鄰域樣本數閾值MinPts聯合調參,不同的參數組合對最后的聚類效果有較大影響。

3. 層次聚類

層次聚類優點:

  • 距離和規則的相似度容易定義,限制少。不需要預先制定聚類數。
  • 可以發現類的層次關系。
  • 可以聚類成其它形狀。

層次聚類的缺點:

  • 計算復雜度太高。奇異值也能產生很大影響。
  • 算法很可能聚類成鏈狀。

三、總述

總之,選擇哪一個算法必須要適用于你自己的問題,這就要求選擇正確的機器學習任務。但很多情況下好的數據卻要優于好的算法,設計優良特征和做特征工程更有意義,但只有了解每個機器算法的原理及優缺點,才能根據不同的機器學習算法做相應的特征工程(對特征工程感興趣的同學可以參考我在公眾號一個數據人的自留地寫的另一篇文章:機器學習中的特征工程)。

 

作者:飛狐沖沖,在國內知名央企負責AI算法建模類工作;曾經在京東、美團等大型互聯網公司擔任算法工程師的崗位;具有豐富的算法開發經驗;“數據人創作者聯盟”成員。

本文由@一個數據人的自留地 原創發布于人人都是產品經理。未經許可,禁止轉載。

題圖來自Unsplash,基于CC0協議。

專欄作家

一個數據人的自留地,公眾號:一個數據人的自留地。人人都是產品經理專欄作家,《數據產品經理修煉手冊》作者。

本文原創發布于人人都是產品經理。未經許可,禁止轉載

題圖來自Unsplash,基于CC0協議。

該文觀點僅代表作者本人,人人都是產品經理平臺僅提供信息存儲空間服務。

更多精彩內容,請關注人人都是產品經理微信公眾號或下載App
評論
評論請登錄
  1. 任何事物都具有兩面性,如何取其利,避其害,是我們要不斷學習的東西

    來自湖北 回復