天天看點

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

雖然現在深度學習的浪潮席卷了學術界和工業界,但是傳統的boosting算法仍值得學習和思考。在一些業務場景下基于樹模型的boosting算法仍然發揮着巨大的作用。本文針對這些算法做一個歸納總結,友善個人查閱。

一、Boosting

Boosting 是一類非常經典的內建學習方法,通過內建一系列的基礎模型得到加強版的模型,進而對任務有更好的結果。在這一部分我們關注兩個算法,分别是 gradient boosting 和 Newton boosting。在介紹這兩個算法之前,先簡單的回顧一下Gradient Descent 和 Newton‘s method。

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

表示損失函數,

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

表示參數,當第

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

次疊代時,

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

是這次疊代的更新。這個公式對于梯度下降和牛頓法都适用,差別隻在于

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

的計算方法。經過

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

次疊代後,

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

可以寫成一個求和的形式,

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

是初始值。

梯度下降法

使損失函數下降最快的方向是負的梯度。當第

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

次疊代時,有

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

有了方向,步長

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

一般可以通過 line search 得到,即

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

然後可以得到

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

牛頓法

首先

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

必須是二次可微的。牛頓法的目标是在每次疊代中通過近似求解

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

來得到

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

。在

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

處做二階泰勒展開,有

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

其中

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

是Hessian矩陣,

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

。由以上公式,可以得到

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

繼而有

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

。和梯度下降法不同的是,牛頓法的步長是1,也就不再需要line search。

上面介紹的部分是在參數空間的數值優化,而Boosting算法可以看作是在函數空間的數值優化。用

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

表示要尋找的函數,将

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

替換上面公式中的

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

就可以得到boosting算法 。如果

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

用base model

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

表示,那麼 gradient boosting 和 Newton boosting 分别是

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost
boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

兩種算法都是通過最小化

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

來得到base model。

二、基于樹模型的boosting

基于樹模型的boosting中一般都采用CART回歸樹作為基礎模型,因為無論是梯度法還是牛頓法都需要用回歸的方法拟合目标,即使任務是分類任務,但是每棵樹的目标都和梯度有關。CART每次分裂都隻分裂兩個節點,選擇CART的原因可能也是因為其簡單。樹模型最重要的就是樹結構的生成以及葉子結點的輸出。

當确定好樹結構之後,葉子結點的輸出

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

也就是對于落在第

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

個葉節點的樣本,使這些樣本的loss最小的

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

就是該葉子子節點的輸出值。比如如果loss函數是平方誤差,那麼

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

就是這些樣本在這棵樹的殘差的均值;如果loss是mae,那麼

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

是中位數。舉一個具體的例子,對于Poisson回歸,損失函數為

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

,求解

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

就是最小化

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

。求導有

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

。通過使得導數為0,有

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

樹每次分裂的基準

為最大

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

,也就是分裂前和分裂後的loss改變最大。

回到boosting算法,由于樹節點都是獨立的,是以loss函數可以寫成對樹節點求和的形式。對于

牛頓boosting

,有

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

進一步的,可以求的下面的公式,其中

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost
boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

是以葉節點的輸出為

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

。将其代回原來的公式,可以得到

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

進而分裂的準則為

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

如果是

梯度boosting

,損失函數為梯度的平方和,也可以寫成根據葉節點求和的形式。最終結果為葉節點為

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

,n為樣本數,分類的Gain是

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

但是對于梯度boosting,算出的葉節點輸出并不是最終的葉節點輸出。而是通過進一步求解

boosting算法_基于樹模型的boosting算法總結:GBDT、XGBoost

得到。但是牛頓boosting可以直接得到葉節點。

三、Gradient Boosting 和 Newton Boosting的對比

梯度boosting和牛頓boosting都是在boosting的架構下的兩種算法。梯度boosting拟合的是梯度,而牛頓boosting通過泰勒展開近似來求解最小。正是因為這兩個算法的優化目标不同,是以樹結構的分裂以及葉子結點的輸出也不同。尤其是葉子結點的輸出,牛頓boosting可以看作是同時優化樹結構和葉節點,而梯度boosting的葉節點通過進一步的求解得到,是以葉節點的輸出更準确,但是樹結構的準确性會下降。

除此之外,梯度boosting的适用範圍會更廣,因為隻需要loss 函數一階可微,但是牛頓boosting要二階可微。不過在實際應用上即使不能二階可微但可以手動設定Hession矩陣,當然這樣準确性會有所下降。

參考文獻

  1. Greedy Function Approximation : A Gradient Boosting Machine

2. Generalized Boosted Models : A guide to the gbm package

3. Tree Boosting With XGBoost. Why Does XGBoost Win "Every" Machine Learning Competition?