xgboost與gbdt區別


1.基分類器的選擇:傳統GBDT以CART作為基分類器,XGBoost還支持線性分類器,這個時候XGBoost相當於帶L1和L2正則化項的邏輯斯蒂回歸(分類問題)或者線性回歸(回歸問題)。

 

2.二階泰勒展開:傳統GBDT在優化時只用到一階導數信息;XGBoost則對代價函數進行了二階泰勒展開,同時用到了一階和二階損失函數的導數。順便提一下,XGBoost工具支持自定義損失函數,只要函數可一階和二階求導。GBDT和GBDT擬合的是都是殘差。

  a.二階泰勒展開:

  b.xgboost訓練:

  c.最后等式被優化成這個樣子,包含gi和hi兩個變量,因為ft(xi)是當前樹的預測值,已知,而gi和hi是從損失函數來的,所以自定義的損失函數只要滿足一階和二階可導就行,因為帶入到整體的式子中要滿足泰勒二階展開。

 

3.方差-方差權衡:XGBoost在目標函數里加入了正則項,用於控制模型的復雜度。正則項里包含了樹的葉子節點個數、每個葉子節點上輸出分數的L2模的平方和。從Bias-variance tradeoff角度來講,正則項降低了模型的variance,使學習出來的模型更加簡單,防止過擬合,這也是XGBoost優於傳統GBDT的一個特性。

 

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

 

5.列抽樣(column subsampling):XGBoost借鑒了隨機森林的做法,支持列抽樣,我們會在同一層的結點分割前先隨機選一部分特征,遍歷的時候只用遍歷這部分特征就行了,不需要便利全部特征,不僅能降低過擬合,還能減少計算,這也是XGBoost異於傳統GBDT的一個特性。

 

6.缺失值處理:XGBoost考慮了訓練數據為稀疏值的情況,可以為缺失值或者指定的值指定分支的默認方向,這能大大提升算法的效率,論文中“枚舉”指的不是枚舉每個缺失樣本在左邊還是在右邊,而是枚舉缺失樣本整體在左邊,還是在右邊兩種情況。分裂點還是只評估特征不缺失的樣本,paper提到50倍。即對於特征的值有缺失的樣本,XGBoost可以自動學習出它的分裂方向。

 

7.XGBoost工具支持並行

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

8.線程緩沖區存儲:按照特征列方式存儲能優化尋找最佳的分割點,但是當以行計算梯度數據時會導致內存的不連續訪問,嚴重時會導致cache miss,降低算法效率。paper中提到,可先將數據收集到線程內部的buffer(緩沖區),主要是結合多線程、數據壓縮、分片的方法,然后再計算,提高算法的效率。

 

9.可並行的近似直方圖算法:樹節點在進行分裂時,我們需要計算每個特征的每個分割點對應的增益,即用貪心法枚舉所有可能的分割點。當數據無法一次載入內存或者在分布式情況下,貪心算法效率就會變得很低,所以xgboost還提出了一種可並行的近似直方圖算法,用於高效地生成候選的分割點。大致的思想是根據百分位法列舉幾個可能成為分割點的候選者,然后從候選者中根據上面求分割點的公式計算找出最佳的分割點。


免責聲明!

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



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