GBDT與xgb

GBDT

GBDT,梯度提升決策樹,是一種以決策樹爲base learner的集成方法,以串行的方式,不斷的學習新的base learner,每次都朝目標前進一些,形成一系列base learner,最終由這一系列base learner進行線性組合得到最終的ensemble learner,表示如下:

F^t = \sum_{i=1}^{t}f^i = F^{t-1}+f^t,其中f^t表示第t輪迭代的base learner,F^t表示第t輪迭代的ensemble learner。

設損失函數爲L,使用梯度下降法來更新F,有F^t =F^{t-1} - \eta \frac{\partial L}{\partial F^{t-1}} \; \rightarrow \; f^t = - \eta \frac{\partial L}{\partial F^{t-1}} = -\eta g_{F^{t-1}},其中\eta爲學習率或步長

可以看到第t輪迭代的base learnerf^t與(loss對之前的ensemble learner的)梯度成線性關係,所以這也是GBDT中gradient boosting部分的由來。

在GBDT中,base learner是用樹模型來表示的,構造一棵決策樹去逼近一階梯度,

\left\{\begin{matrix} \\ w^* = arg\min_w{\sum_{n=1}^{N}(\tilde{y_n} - h^t(X_n;w))^2} = arg\min_w{\sum_{i=1}^{T}\sum_{n \in leaf_i}(\tilde{y_n} - w_i)^2} \\ \tilde{y_n}=-g_{F^{t-1}} \end{matrix}\right.

其中T表示決策樹的葉子節點數目,葉子節點的取值w_i = \frac{1}{N_{leaf_i}}\sum_{n \in leaf_i}\tilde{y_n}等於屬於該葉子節點的樣本的一階梯度的平均;

然後line search步長\eta\eta^* = arg\min_{\eta}{\sum_{n=1}^N{L(y_n, F^{t-1}+\eta h^t(X_n;w^*))}},即可以使得當前迭代的loss最小的\eta值便是;

得到第t輪迭代的base learner f^t = \eta^* h^t(X;w^*)};更新模型 F^t = F^{t-1}+f^t

XGB

xgb是GBDT框架的一種實現,還有其它的如lightGBM、catboost也是GBDT的一種。xgb的主要特點是使用了二階泰勒展開式對loss進行了近似,使得整個求解框架可以適用於任意二階可導的loss;具體如下:

L(F^t) \approx L(F^{t-1}) + \frac{\partial L(F^{t-1})}{\partial F^{t-1}}(F^t-F^{t-1})+\frac{1}{2}\frac{\partial^2 L(F^{t-1})}{\partial F^{t-1}}(F^t-F^{t-1})^2 \\ \rightarrow L(F^t) \approx L(F^{t-1}) + gf^t + \frac{1}{2}h{f^t}^2

往loss中添加正則\Omega (f^t) = \gamma T + \frac{\lambda }{2}\sum_{i}^{T}w_i^2,其中第一部分約束葉子節點數量T,第二部分約束各葉子節點的取值,改寫loss,

L(F^t) \approx L(F^{t-1}) + gf^t + \frac{1}{2}h{f^t}^2 + \gamma T + \frac{\lambda}{2}\sum_{i=1}^{T}w_i^2 \\ \rightarrow L(F^t) \approx L(F^{t-1}) + \sum_{n=1}^{N}(g_nf_n^t+\frac{1}{2}h_n{f_n^t}^2) + \gamma T + \frac{\lambda}{2}\sum_{i=1}^{T}w_i^2 \\ = const + \sum_{i=1}^{T}\sum_{n \in \{leaf_i\}}(g_nw_i^t+\frac{1}{2}h_n{w_i^t}^2)+ \gamma T + \frac{\lambda}{2}\sum_{i=1}^{T}w_i^2 \\ = const + \sum_{i=1}^{T}(G_iw_i^t+\frac{1}{2}(H_i+\lambda){w_i^t}^2)+ \gamma T

其中G_i = \sum_{n \in \{leaf_i\}}g_n, \; H_i = \sum_{n \in \{leaf_i\}}h_n^2分佈表示屬於葉子節點i的樣本的一階梯度和、二階梯度和

令L對w_i的導數爲0,可得

w_i = -\frac{G_i}{H_i+\lambda},相對於使用二階的牛頓法進行優化、而非GBDT中的一階梯度下降法,其中\lambda相當於對-\frac{G_i}{H_i}進行了平滑

L_i = -\frac{G_i^2}{H_i+\lambda} + \gamma,表示L_i葉子節點i上的loss,

分裂節點i帶來的增益爲分裂前的loss-(分裂後兩個新節點的loss和),即Gain_i = \frac{G_{i,L}^2}{H_{i,L}+\lambda} + \frac{G_{i,R}^2}{H_{i,R}+\lambda} - \frac{G_{i}^2}{H_{i}+\lambda} - \gamma

當增益小於一定閾值的時候可以停止分裂,\gamma相當於起了個預剪枝的作用

由於無法知道樹結構,只能採取貪心,每次選擇一個增益最大的節點進行分裂生長,直至滿足一定條件(深度、葉子數量或增益閾值)。

得到base learner後,一般需要對得到base learner f^t乘以一個係數,以進行shrinkage

一方面,由於採用了二階泰勒展開式對loss進行了近似,shrinkage可以減少近似的誤差;

另一方面,由於base learner樹是通過貪心得到的,並非最佳結構,shrinkage相當於對每個base learner進行了降權,且shrinkage後會增多迭代次數、即有更多的base learner,有助於減小過擬合。

另外,xgb還借鑑了隨機森林的思想,支持行、列採樣,採樣可以加快計算速度、有助於減小過擬合。

分裂方法

精準模式:遍歷所有特徵的所有可能的分割點,計算gain值,選取值最大的(feature,value)去分割。

近似模式:對於每個特徵,只考察分位點,減少計算複雜度,即計算在分位點處分割的增益,選擇分裂。

  • Global:學習每棵樹前,提出候選切分點
  • Local:每次分裂前,重新提出候選切分點

實際上XGB不是簡單地按照樣本個數進行分位,而是以二階梯度值作爲權重(Weighted Quantile Sketch)進行分位,比如:

爲什麼用二階梯度h加權?把目標函數整理成以下形式,可以看出二階梯度h有對loss加權的作用

L(F^t) \approx L(F^{t-1}) + \sum_{n=1}^{N}(g_nf_n^t+\frac{1}{2}h_n{f_n^t}^2) + \Omega (f^t) \\ = \sum_{n=1}^{N}\frac{1}{2}h_n{(f_n^t- g_n/h_n)}^2 + \Omega (f^t) + const

缺失值處理

左右兩邊,含有缺失的部分樣本放哪邊帶來的增益更大就放哪邊,即選擇那邊爲默認方向。

 

樹模型的優缺點

優點

  • 節點分裂:天然支持缺失值(訓練得到的分裂默認方向)、對異常值魯棒、具有伸縮不變性(不用歸一化特徵)
  • 路徑:相對於進行了特徵組合、具有特徵選擇的作用(經常出現在路徑中的特徵比較重要,基本不出現在路徑中的特徵不怎麼重要)、可解釋性強

缺點

  • 通過路徑的方式進行特徵組合的效率太低,不適合處理高維數據、尤其是高維稀疏數據(太稀疏,特徵有效值便太少,得到的分裂值容易不合理)
  • 缺乏平滑性(迴歸預測時輸出值只能輸出有限的若干種數值)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章