集成学习(5)——XGBoost

GBDT算法基于经验损失函数的负梯度构造新的决策树,并且在决策树构建完成后进行剪枝(后剪枝)。

XGBoost在决策树构建阶段就加入了正则项,如下为XGBoost的损失函数:

L t = ∑ i l ( y i , F t − 1 + f t ( x i ) ) + Ω ( f t ) L_t=\sum_il(y_i,F_{t-1}+f_t(x_i))+\Omega(f_t) Lt=il(yi,Ft1+ft(xi))+Ω(ft)

其中 F t − 1 F_{t-1} Ft1表示现有的t-1棵树最优解。

树结构的正则项定义为 Ω ( f t ) = γ T + 0.5 λ ∑ j = 1 T w j 2 \Omega(f_t)=\gamma T+0.5\lambda\sum_{j=1}^Tw_j^2 Ω(ft)=γT+0.5λj=1Twj2

其中T为叶子节点个数, w j w_j wj表示第j个叶子节点的预测值。

对该损失函数在 F t − 1 F_{t-1} Ft1处进行二阶泰勒展开可以推导出

L t ≈ ∑ j = 1 T [ G j w j + 0.5 ( H j + λ ) w j 2 ] + γ T L_t\thickapprox\sum_{j=1}^T[G_jw_j+0.5(H_j+\lambda)w_j^2]+\gamma T Ltj=1T[Gjwj+0.5(Hj+λ)wj2]+γT

其中T为决策树 f t f_t ft中叶子节点的个数, G j = ∑ i ∈ I j ∇ F t − 1 l ( y i , F t − 1 ( x i ) ) G_j=\sum_{i\in I_j}\nabla_{F_{t-1}}l(y_i,F_{t-1}(x_i)) Gj=iIjFt1l(yi,Ft1(xi)) H j = ∑ i ∈ I j ∇ F t − 1 2 l ( y i , F t − 1 ( x i ) ) H_j=\sum_{i\in I_j}\nabla^2_{F_{t-1}}l(y_i,F_{t-1}(x_i)) Hj=iIjFt12l(yi,Ft1(xi)) I j I_j Ij表示所有属于叶子节点 j j j的样本的索引的集合。

假设决策树的结构已知,通过令损失函数相对于 w j w_j wj的导数为0可以求出在最小化损失函数的情况下各个叶子节点上的预测值

w j ∗ = − G j H j + λ w_j^*=-\frac{G_j}{H_j+\lambda} wj=Hj+λGj

实际使用贪心方法来构建一个次优的树结构,基本思想是从根节点开始,每次对一个叶子节点进行分裂,针对每一种可能的分裂,根据特定的准则选取最优的分裂。不同的决策树采用不同的准则。

XGBoost有特定的专责来选取最优分裂

通过将预测值 w j ∗ w_j^* wj代入到损失函数中可求得损失函数的最小值

L t ∗ = − 0.5 ∑ j = 1 T G j 2 H j + λ + γ T L_t^*=-0.5\sum_{j=1}^T\frac{G_j^2}{H_j+\lambda}+\gamma T Lt=0.5j=1THj+λGj2+γT

然后计算出分裂前后损失函数的差值为:

G a i n = G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ − γ Gain=\frac{G_L^2}{H_L+\lambda}+\frac{G_R^2}{H_R+\lambda}-\frac{(G_L+G_R)^2}{H_L+H_R+\lambda}-\gamma Gain=HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2γ

XGBoost采用最大化这个插值作为准则来进行决策树的构建,通过遍历所有特征的所有取值,寻找使得损失函数前后相差最大时对应的分裂方式。此外,由于损失函数前后存在一定为正的限制,此时 γ \gamma γ起到了一定的预剪枝效果。

XGBoost和GBDT的区别与联系

1)GBDT是机器学习算法,XGBoost是该算法的工程实现;
2)在使用CART作为基分类器时,XGBoost显式地加入了正则项来控制模型的复杂度,有利于防止过拟合,从而提高模型的泛化能力;
3)GBDT在模型训练时只使用了代价函数的一阶导数信息,XGBoost对代价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数;
4)传统的GBDT采用CART作为基分类器,XGBoost支持多种类型的基分类器,比如线性分类器;
5)传统的GBDT在每轮迭代时使用全部的数据,XGBoost则采用了与随机森林相似的策略,支持对数据进行采样;
6)传统的GBDT没有设计对缺失值进行处理,XGBoost能够自动学习出缺失值的处理策略。

关于Xgboost用泰勒二阶展开的原因

主要有两点:
1、Xgboost官网上有说,当目标函数是MSE时,展开是一阶项(残差)+二阶项的形式(官网说这是一个nice form),而其他目标函数,如logloss的展开式就没有这样的形式。为了能有个统一的形式,所以采用泰勒展开来得到二阶项,这样就能把MSE推导的那套直接复用到其他自定义损失函数上。简短来说,就是为了统一损失函数求导的形式以支持自定义损失函数。这是从为什么会想到引入泰勒二阶的角度来说的。

2、二阶信息本身就能让梯度收敛更快更准确。这一点在优化算法里的牛顿法里已经证实了。可以简单认为一阶导指引梯度方向,二阶导指引梯度方向如何变化。这是从二阶导本身的性质,也就是为什么要用泰勒二阶展开的角度来说的。

你可能感兴趣的:(机器学习)