关于GBDT的几个困惑很久的问题
参考链接
从梯度下降角度:https://www.zhihu.com/question/63560633/answer/340862845
XGBoost每一步迭代目标函数推导:https://www.zybuluo.com/yxd/note/611571
刘建平:https://www.cnblogs.com/pinard/p/6140514.html
为什么拟合负梯度?
GBDT模型:fk = fk-1(x) + hk(x)
模型目的:通过每一次加入一个新的学习器hk(x)后,相当于不断更新fk(x),使得当前全部样本代价函数Cost(y,fk(x)) 获得最大程度==地减小,从而 随着不断加入新的学习器,不断逼近代价函数全局最小值;
问题关键:新加入的学习器hk(x)如何才能保证更新后的fk(x)使得代价函数L(y,fk(x))朝着函数值减小最大的方向移动;
做法:
类似梯度下降做法,令hk(x)= - learning_rate * Cost’(y,fk-1(x)),即hk(x)等于近似地负梯度,即可利用cart树拟合上一个学习器损失函数对于各个样本预测值的负导数值(即负梯度);
为什么拟合残差?
当损失函数选择平方损失时,损失函数对于各个样本预测值的负梯度,即残差,即拟合残差仅仅是当损失函数取平方损失时GBDT一种特例
原理:利用学习器hk(x)通过拟合上一个学习器fk-1(x)的预测残差,通过不断地更新整合的学习器fk(x),将代价函数Cost(y,fk(x))沿着梯度下降的方向移动,从而不断降低整合的学习器偏差;
推广算法流程
GBDT推广算法:
(1)初始化学习器f0(x);
(2)由上一个fk-1(x)学习器获取损失函数在每一个样本i的负梯度值G(i,k-1);
(3)利用(Xi,Gi,k-1)数据集拟合上一轮负梯度值Gi,k-1,分裂节点基于最小化MSE,从而获取cart树划分样本的规则;
(4)基于(3)获取各叶节点样本后,基于叶节点代价函数最小化,获得各叶节点最优输出值,即获得最终学习器hk(x)(包含划分规则,以及各叶节点预测值);
(5)更新学习器为fk(x)=fk-1(x) + hk(x);
(6)重复(2)(3)(4)直至到达指定迭代次数;
与xgboost算法中的差别
- GBDT中算法流程3,4分开进行,先常规cart操作(基于MSE最小)获取划分样本规则,基于(3)结果再获取各叶节点输出预测值
xgBoost算法流程3,4同时进行,一次性计算同时获取树的样本划分规则,以及各叶节点最优输出值,推导过程见链接 - GBDT分裂节点增益计算标准:MSE
xgBoost分裂节点增益计算标准:分裂前后代价函数L(y,fk(x))减少最大 - xgboost中分裂节点选择可以并行
- xgboost缺失值处理不同
- xgboost代价函数增加了正则化项