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

缺失值处理

左右两边,含有缺失的部分样本放哪边带来的增益更大就放哪边,即选择那边为默认方向。

 

树模型的优缺点

优点

  • 节点分裂:天然支持缺失值(训练得到的分裂默认方向)、对异常值鲁棒、具有伸缩不变性(不用归一化特征)
  • 路径:相对于进行了特征组合、具有特征选择的作用(经常出现在路径中的特征比较重要,基本不出现在路径中的特征不怎么重要)、可解释性强

缺点

  • 通过路径的方式进行特征组合的效率太低,不适合处理高维数据、尤其是高维稀疏数据(太稀疏,特征有效值便太少,得到的分裂值容易不合理)
  • 缺乏平滑性(回归预测时输出值只能输出有限的若干种数值)

 

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