GBDT為什么不能並行,XGBoost卻可以


傳統的GBDT是以CART作為基分類器,xgboost還支持線性分類器,這個時候XGBOOST相當於帶L1和L2正則化的邏輯斯蒂回歸(分類問題)或者線性回歸(回歸問題)。傳統的GBDT在優化的hih只用到一階導數信息,xgboost則對代價函數進行了二階泰勒展開,同時用到了一階和二階導數。順便提一下,xgboost工具支持自定義代價函數,只要函數可一階和二階求導。

xgboost在代價函數里加入了正則項,用於控制模型的復雜度。正則項里包含了樹的葉子節點個數、每個葉子節點上輸出的score是L2模的平方和。使學習出來的模型更加簡單,防止過擬合,這也是xgboost優於傳統GBDT的一個特性。

Shrinkage(縮減),相當於學習速率。xgboost在進行完一次迭代后,會將葉子節點的權重乘上該系數,主要是為了消弱每棵樹的影響,讓后面有更大的學習空間。在實際應用中,一般把學習率設置的小一點,然后迭代次數設置的大一點(補充:傳統GBDT的實現也有學習速率)

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

對缺失值的處理。對於特征的值有缺失的樣本,xgboost可以自動學習出她的分裂方向。

xgboost工具支持並行。boosting不是一種串行的結構嗎?怎么並行的?

注意xgboost的並行不是tree粒度的並行,xgboost也是一次迭代完成才能進行下一次迭代的(第t次迭代的代價函數里面包含了前面t-1次迭代的預測值)。xgboost的並行是在特征粒度上的。我們知道,決策樹的學習最耗時的一個步驟就是對特征的值進行排序(因為要確定最佳分割點),xgboost在訓練之前,預先對數據進行排序,然后保存block結構,后面的迭代中重復的使用這個結構,大大減小計算量。這個block結構也使得並行稱為了可能,在進行節點的分裂時,需要計算每個特征的增益,最終選增益最大的那個特征去做分裂,那么各個特征的增益計算就可以開多線程進行。

可並行的近似值方圖算法。樹節點在進行分裂時,我們需要計算每個特征的每個分割點對應的增益,即用貪心法枚舉所有可能的分割點。當數據無法一次載入內存或者在分布式情況下,貪心算法效率就會變得很低,所以xgboost還提出了一種可並行的近似直方圖算法,用於高效地生成候選的分割點


免責聲明!

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



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