XGBOOST/GBDT,RandomForest/Bagging的比較


 

原創文章:http://blog.csdn.net/qccc_dm/article/details/63684453

 

首先XGBOOST,GBDT,RF都是集成算法,RF是Bagging的變體,與Bagging相比,RF加入了屬性擾動,而XGBOOST,GBDT屬於boosting.

 

一、RandomForest 與 GBDT 的區別:

相同點:

1.都由很多棵樹組成

2.最終的結果是由多棵樹一起決定的

不同點:

1.RandomForest中的樹可以是分類樹,也可以是回歸樹,而GBDT只能由回歸樹(CART)組成,這也說明GBDT各個樹相加是有意義的

2.RandomForest中的樹是並行生成的,而GBDT是串行生成的,GBDT中下一顆樹要去擬合前一顆樹的殘差,所以GBDT中的樹是有相關關系的,而RandomForest中的樹的相關性依賴於Boostrap生成的樣本子集的相關性

3.RandomForest 對異常值不敏感,GBDT敏感

4.RandomForest是通過降低模型方差來提高性能的,而GBDT是通過降低偏差來提高性能

 

二、GBDT 與 XGBOOST的比較:

1.傳統的GBDT以CART樹作為基分類器,而XGBOOST還支持線性分類器,此時的線性分類器自帶正則項

2.傳統的GBDT在優化時,只用到了loss function的一階導信息,而XGBOOST對loss function做了Taylor展開,用到了二階導信息

3.XGBOOST在loss function中引入了正則項,防止過擬合,正則項里包含葉節點數以及每個葉節點上的score的L2的平方和

 

在計算划分增益時,如果gain < gamma, 不划分,gain> gamma,划分,這相當於決策樹的預剪枝。 gamma是葉節點個數的參數

4.XGBOOST還借用了RandomForest中的列抽樣思想,也支持在划分節點時,只考慮部分屬性

(現狀sklearn中的GBDT也實現了列抽樣)

5.XGBOOST可以自動學習出缺失值的分裂方向,論文中的default direction

(具體做法時,遍歷的嘗試將所有的缺失值分裂到所有方向{left or right},split and default directions with max gain)

6.XGBOOST實現了並行化,這個並行化是特征粒度上的並行化:划分節點時,每個特征並行計算,同時每個特征的划分節點也是並行計算(這是加速最猛的處理)

7.XGBOOST提出了block的概念,簡單的說將排序后的特征值放在block中,以后划分特征的時候,只需要遍歷一次即可,因為決策樹在處理屬性值時,需要將屬性值先排序,這是最耗時的步驟,而block預先存儲了排序的特征值,在后續過程中可以重復利用這個結構中的數據,同時,計算每個特征的划分增益可以並行處理了

Collecting statistics for each column can be parallelized,giving us a parallel algorithm for split finding!!

8.貪心算法在選擇最佳划分方式時需要遍歷所有的划分點子集,在數據非常大時,這會非常低效,xgboost提出了近似直方圖計算,根據數據的二階導信息進行排序,提出一些候選划分點子集

 

 

三、xgboost為什么快?xgboost如何支持並行?

  • 傳統GBDT以CART作為基分類器,xgboost還支持線性分類器,這個時候xgboost相當於帶L1和L2正則化項的邏輯斯蒂回歸(分類問題)或者線性回歸(回歸問題)。
  • 傳統GBDT在優化時只用到一階導數信息,xgboost則對代價函數進行了二階泰勒展開,同時用到了一階和二階導數。順便提一下,xgboost工具支持自定義代價函數,只要函數可一階和二階求導。
  • xgboost在代價函數里加入了正則項,用於控制模型的復雜度。正則項里包含了樹的葉子節點個數、每個葉子節點上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來講,正則項降低了模型的variance,使學習出來的模型更加簡單,防止過擬合,這也是xgboost優於傳統GBDT的一個特性。
  • Shrinkage(縮減),相當於學習速率(xgboost中的eta)。xgboost在進行完一次迭代后,會將葉子節點的權重乘上該系數,主要是為了削弱每棵樹的影響,讓后面有更大的學習空間。實際應用中,一般把eta設置得小一點,然后迭代次數設置得大一點。(補充:傳統GBDT的實現也有學習速率)
  • 列抽樣(column subsampling)。xgboost借鑒了隨機森林的做法,支持列抽樣,不僅能降低過擬合,還能減少計算,這也是xgboost異於傳統gbdt的一個特性。
  • 對缺失值的處理。對於特征的值有缺失的樣本,xgboost可以自動學習出它的分裂方向。
  • xgboost工具支持並行。boosting不是一種串行的結構嗎?怎么並行的?注意xgboost的並行不是tree粒度的並行,xgboost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函數里包含了前面t-1次迭代的預測值)。xgboost的並行是在特征粒度上的。我們知道,決策樹的學習最耗時的一個步驟就是對特征的值進行排序(因為要確定最佳分割點),xgboost在訓練之前,預先對數據進行了排序,然后保存為block結構,后面的迭代中重復地使用這個結構,大大減小計算量。這個block結構也使得並行成為了可能,在進行節點的分裂時,需要計算每個特征的增益,最終選增益最大的那個特征去做分裂,那么各個特征的增益計算就可以開多線程進行。
  • 可並行的近似直方圖算法。樹節點在進行分裂時,我們需要計算每個特征的每個分割點對應的增益,即用貪心法枚舉所有可能的分割點。當數據無法一次載入內存或者在分布式情況下,貪心算法效率就會變得很低,所以xgboost還提出了一種可並行的近似直方圖算法,用於高效地生成候選的分割點。
  • xgboost中樹節點分裂時所采用的公式:

這個公式形式上跟ID3算法(采用entropy計算增益) 、CART算法(采用gini指數計算增益) 是一致的,都是用分裂后的某種值 減去 分裂前的某種值,從而得到增益。為了限制樹的生長,我們可以加入閾值,當增益大於閾值時才讓節點分裂,上式中的gamma即閾值,它是正則項里葉子節點數T的系數,所以xgboost在優化目標函數的同時相當於做了預剪枝。另外,上式中還有一個系數lambda,是正則項里leaf score的L2模平方的系數,對leaf score做了平滑,也起到了防止過擬合的作用,這個是傳統GBDT里不具備的特性。

 

  • 多類別分類時,類別需要從0開始編碼;
  • 類別特征必須編碼,因為xgboost把特征默認都當成數值型的;
  • 訓練的時候,為了結果可復現,記得設置隨機數種子;
  • XGBoost的特征重要性是如何得到的?某個特征的重要性(feature score),等於它被選中為樹節點分裂特征的次數的和,比如特征A在第一次迭代中(即第一棵樹)被選中了1次去分裂樹節點,在第二次迭代被選中2次…..那么最終特征A的feature score就是 1+2+….


免責聲明!

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



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