RF,GBDT,XGBoost,lightGBM的對比


轉載地址:https://blog.csdn.net/u014248127/article/details/79015803

RF,GBDT,XGBoost,lightGBM都屬於集成學習(Ensemble Learning),集成學習的目的是通過結合多個基學習器的預測結果來改善基本學習器的泛化能力和魯棒性。 
根據基本學習器的生成方式,目前的集成學習方法大致分為兩大類:即基本學習器之間存在強依賴關系、必須串行生成的序列化方法,以及基本學習器間不存在強依賴關系、可同時生成的並行化方法;前者的代表就是Boosting,后者的代表是Bagging和“隨機森林”(Random Forest)。 
關於集成學習的介紹參考:機器學習模型優化之模型融合

這篇文章主要對集成學習中重要的、使用廣泛的方法進行對比:RF(隨機森林),ET(極端隨機樹),GBDT(梯度提升決策樹),XGBoost,lightGBM

一、RF(隨機森林): 
1,RF的原理: 
RF是Bagging算法的優化版本,改進一:基本學習器限定為決策樹,改進二:除了bagging的在樣本上加上擾動,同時在屬性上也加上擾動,即是在決策樹學習的過程中引入了隨機屬性選擇,對基決策樹的每個結點,先從該結點的屬性集合中隨機選擇一個包含k個屬性的子集,然后再從這個子集中選擇一個最優屬性用於划分。

2,RF的生成: 算法如下

輸入為樣本集D={(x,y1),(x2,y2),...(xm,ym)}D={(x,y1),(x2,y2),...(xm,ym)},弱分類器迭代次數T。 輸出為最終的強分類器f(x)f(x) 1)對於t=1,2...,T: a)對訓練集進行第t次隨機采樣,共采集m次,得到包含m個樣本的采樣集D-m    b)用采樣集D-m訓練'第m個決策樹模型Gm(x)',在訓練決策樹模型的節點的時候, '
    在節點上所有的樣本特征中選擇一部分樣本特征, 在這些隨機選擇的部分樣本特征中選擇一個最優的特征來做決策樹的左右子樹划分' 2) 如果是'分類算法預測',則T個弱學習器投出最多票數的類別或者類別之一為最終類別。 '如果是回歸算法',T個弱學習器得到的回歸結果進行算術平均得到的值為最終的模型輸出。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3,RF和Bagging對比: RF的起始性能較差,特別當只有一個基學習器時,隨着學習器數目增多,隨機森林通常會收斂到更低的泛化誤差。隨機森林的訓練效率也會高於Bagging,因為在單個決策樹的構建中,Bagging使用的是‘確定性’決策樹,在選擇特征划分結點時,要對所有的特征進行考慮,而隨機森林使用的是‘隨機性’特征數,只需考慮特征的子集。

4,優缺點: 
  優點:訓練可以高度並行化,對於大數據時代的大樣本訓練速度有優勢(個人覺得這是的最主要的優點);能夠處理很高維的數據,並且不用特征選擇,而且在訓練完后,給出特征的重要性;相對於Boosting系列的Adaboost和GBDT, RF實現比較簡單。。 
  缺點:在噪聲較大的分類或者回歸問題上容易過擬合。

二、ET(極端隨機樹)Extra-Trees(Extremely randomized trees): 
1,ET的原理:算法與隨機森林算法十分相似,都是由許多決策樹構成。但該算法與隨機森林有兩點主要的區別: 
1) 對於每個決策樹的訓練集,RF采用的是隨機采樣bootstrap來選擇采樣集作為每個決策樹的訓練集,而extra trees一般不采用隨機采樣,即每個決策樹采用原始訓練集。 
2) 在選定了划分特征后,RF的決策樹會基於信息增益,基尼系數,均方差之類的原則,選擇一個最優的特征值划分點,這和傳統的決策樹相同。但是extra trees比較的激進,他會隨機的選擇一個特征值來划分決策樹。

2,ET隨機選擇特征值的解釋: 
當特征屬性是類別的形式時,隨機選擇具有某些類別的樣本為左分支,而把具有其他類別的樣本作為右分支;當特征屬性是數值的形式時,隨機選擇一個處於該特征屬性的最大值和最小值之間的任意數,當樣本的該特征屬性值大於該值時,作為左分支,當小於該值時,作為右分支。這樣就實現了在該特征屬性下把樣本隨機分配到兩個分支上的目的。然后計算此時的分叉值(如果特征屬性是類別的形式,可以應用基尼指數;如果特征屬性是數值的形式,可以應用均方誤差)。遍歷節點內的所有特征屬性,按上述方法得到所有特征屬性的分叉值,我們選擇分叉值最大的那種形式實現對該節點的分叉。

3,ET與RF的對比:由於隨機選擇了特征值的划分點位,而不是最優點位,這樣會導致生成的決策樹的規模一般會大於RF所生成的決策樹。也就是說,模型的方差相對於RF進一步減少,但是偏倚相對於RF進一步增大。在某些時候,extra trees的泛化能力比RF更好。 
(RF還有一個變形Isolation Forest是用來尋找異常點的,與本文關系不大,可以自行關注)

三、GBDT(梯度提升決策樹): 
1,GBDT原理: 
GBDT是集成學習Boosting家族的成員,是對提升樹的改進。提升樹是加法模型、學習算法為前向分布算法時的算法。不過它限定基本學習器為決策樹。對於二分類問題,損失函數為指數函數,就是把AdaBoost算法中的基本學習器限定為二叉決策樹就可以了;對於回歸問題,損失函數為平方誤差,此時,擬合的是當前模型的殘差。梯度提升樹GBDT是對提升樹算法的改進,提升樹算法只適合誤差函數為指數函數和平方誤差,對於一般的損失函數,梯度提升樹算法利用損失函數的負梯度在當前模型的值,作為殘差的近似值。

GBDT的會累加所有樹的結果,而這種累加是無法通過分類完成的,因此GBDT的樹都是CART回歸樹,而不是分類樹(盡管GBDT調整后也可以用於分類但不代表GBDT的樹為分類樹)。

2,GBDT算法: 
GBDT算法原理的詳細內容參考:梯度提升樹(GBDT)原理小結 
下面總結出關鍵部分: 
輸入是訓練集樣本T={(x,y1),(x2,y2),...(xm,ym)}T={(x,y1),(x2,y2),...(xm,ym)}, 最大迭代次數T, 損失函數L。 
輸出是強學習器f(x) 
1) 初始化弱學習器 
這里寫圖片描述 
2) 對迭代輪數t=1,2,…T有: 
  a)對樣本i=1,2,…m,計算負梯度 
這里寫圖片描述 
  b)利用(xi,rti)(i=1,2,..m)(xi,rti)(i=1,2,..m), 擬合一顆CART回歸樹,得到第t顆回歸樹,其對應的葉子節點區域為![這里寫圖片描述](http://latex.codecogs.com/gif.latex?R_%7Btj%7D),j=1,2,...,J。其中J為回歸樹t的葉子節點的個數。 
  c) 對葉子區域j =1,2,..J,計算最佳擬合值 
這里寫圖片描述 
  d) 更新強學習器 
這里寫圖片描述 
3) 得到強學習器f(x)的表達式 
這里寫圖片描述

3,GBDT與Boosting的區別: 
GBDT與傳統的Boosting區別較大,它的每一次計算都是為了減少上一次的殘差,而為了消除殘差,我們可以在殘差減小的梯度方向上建立模型,所以說,在GradientBoost中,每個新的模型的建立是為了使得之前的模型的殘差往梯度下降的方法,與傳統的Boosting中關注正確錯誤的樣本加權有着很大的區別。

4, 優缺點: 
  優點:它能靈活的處理各種類型的數據;在相對較少的調參時間下,預測的准確度較高,這個是相對SVM來說的。 
  缺點:基學習器之前存在串行關系,難以並行訓練數據。

四、XGBoost: 
1,XGBoost的原理認識: 
XGBoost的原理詳細,我推薦兩篇大神博客, xgboost原理 ,xgboost 算法原理。 
這里我簡要解釋一下我的認識: 
XGBoost是集成學習Boosting家族的成員,是在GBDT的基礎上對boosting算法進行的改進。GBDT是用模型在數據上的負梯度作為殘差的近似值,從而擬合殘差。XGBoost也是擬合的在數據上的殘差,但是它是用泰勒展式對模型損失殘差的近似;同時XGBoost對模型的損失函數進行的改進,並加入了模型復雜度的正則項。

2,XGBoost與GBDT的區別: 在了解了XGBoost原理后容易理解二者的不同 
損失函數的改變:(導數和正則項的認識)

  • 傳統的GBDT以CART樹作為基學習器,XGBoost還支持線性分類器,這個時候XGBoost相當於L1和L2正則化的邏輯斯蒂回歸(分類)或者線性回歸(回歸);
  • 傳統的GBDT在優化的時候只用到一階導數信息,XGBoost則對代價函數進行了二階泰勒展開,得到一階和二階導數;
  • XGBoost在代價函數中加入了正則項,用於控制模型的復雜度。從權衡方差偏差來看,它降低了模型的方差,使學習出來的模型更加簡單,放置過擬合,這也是XGBoost優於傳統GBDT的一個特性;

工具的優化:(趨勢值和並行的認識)

  • shrinkage**(縮減),**相當於學習速率(XGBoost中的eta)。XGBoost在進行完一次迭代時,會將葉子節點的權值乘上該系數,主要是為了削弱每棵樹的影響,讓后面有更大的學習空間。(GBDT也有學習速率);
  • 列抽樣。XGBoost借鑒了隨機森林的做法,支持列抽樣,不僅防止過 擬合,還能減少計算;
  • 對缺失值的處理。對於特征的值有缺失的樣本,XGBoost還可以自動 學習出它的分裂方向;
  • XGBoost工具支持並行。Boosting不是一種串行的結構嗎?怎么並行 的?注意XGBoost的並行不是tree粒度的並行,XGBoost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函數里包含了前面t-1次迭代的預測值)。XGBoost的並行是在特征粒度上的。我們知道,決策樹的學習最耗時的一個步驟就是對特征的值進行排序(因為要確定最佳分割點),XGBoost在訓練之前,預先對數據進行了排序,然后保存為block結構,后面的迭代 中重復地使用這個結構,大大減小計算量。這個block結構也使得並行成為了可能,在進行節點的分裂時,需要計算每個特征的增益,最終選增益最大的那個特征去做分裂,那么各個特征的增益計算就可以開多線程進行。實踐參考: xgboost入門與實戰(原理篇)

五、lightGBM: 
1,lightGBM的認識: 它是微軟出的新的boosting框架,基本原理與XGBoost一樣,只是在框架上做了一優化(重點在模型的訓練速度的優化)。 
關於lightGBM的介紹參考:比XGBOOST更快–LightGBM介紹

2,lightGBM與XGBoost的區別: 
(1)xgboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略,區別是xgboost對每一層所有節點做無差別分裂,可能有些節點的增益非常小,對結果影響不大,但是xgboost也進行了分裂,帶來了務必要的開銷。 leaft-wise的做法是在當前所有葉子節點中選擇分裂收益最大的節點進行分裂,如此遞歸進行,很明顯leaf-wise這種做法容易過擬合,因為容易陷入比較高的深度中,因此需要對最大深度做限制,從而避免過擬合。

(2)lightgbm使用了基於histogram的決策樹算法,這一點不同與xgboost中的 exact 算法,histogram算法在內存和計算代價上都有不小優勢。 
-. 內存上優勢:很明顯,直方圖算法的內存消耗為(#data* #features * 1Bytes)(因為對特征分桶后只需保存特征離散化之后的值),而xgboost的exact算法內存消耗為:(2 * #data * #features* 4Bytes),因為xgboost既要保存原始feature的值,也要保存這個值的順序索引,這些值需要32位的浮點數來保存。 
-. 計算上的優勢,預排序算法在選擇好分裂特征計算分裂收益時需要遍歷所有樣本的特征值,時間為(#data),而直方圖算法只需要遍歷桶就行了,時間為(#bin)

(3)直方圖做差加速 
-. 一個子節點的直方圖可以通過父節點的直方圖減去兄弟節點的直方圖得到,從而加速計算。

(4)lightgbm支持直接輸入categorical 的feature 
-. 在對離散特征分裂時,每個取值都當作一個桶,分裂時的增益算的是”是否屬於某個category“的gain。類似於one-hot編碼。

(5)但實際上xgboost的近似直方圖算法也類似於lightgbm這里的直方圖算法,為什么xgboost的近似算法比lightgbm還是慢很多呢? 
-. xgboost在每一層都動態構建直方圖, 因為xgboost的直方圖算法不是針對某個特定的feature,而是所有feature共享一個直方圖(每個樣本的權重是二階導),所以每一層都要重新構建直方圖,而lightgbm中對每個特征都有一個直方圖,所以構建一次直方圖就夠了。 
-. lightgbm做了cache優化?

(6)lightgbm哪些方面做了並行? 
-. feature parallel 
一般的feature parallel就是對數據做垂直分割(partiion data vertically,就是對屬性分割),然后將分割后的數據分散到各個workder上,各個workers計算其擁有的數據的best splits point, 之后再匯總得到全局最優分割點。但是lightgbm說這種方法通訊開銷比較大,lightgbm的做法是每個worker都擁有所有數據,再分割?(沒懂,既然每個worker都有所有數據了,再匯總有什么意義?這個並行體現在哪里??) 
-. data parallel 
傳統的data parallel是將對數據集進行划分,也叫 平行分割(partion data horizontally), 分散到各個workers上之后,workers對得到的數據做直方圖,匯總各個workers的直方圖得到全局的直方圖。 lightgbm也claim這個操作的通訊開銷較大,lightgbm的做法是使用”Reduce Scatter“機制,不匯總所有直方圖,只匯總不同worker的不同feature的直方圖(原理?),在這個匯總的直方圖上做split,最后同步。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM