这一篇开始介绍XGBoost。
和GBDT不同, XGBoost不仅仅使用了一阶梯度, 还使用了二阶梯度。同时增加了正则化。
第m步的损失函数:
是第m棵树的复杂度,是前m-1棵树的复杂度之和, 对第m棵树的学习没有影响, 所以是常数。
同GBDT,我们把损失函数第一部分泰勒展开,但这次保留前两项,即
定义,
针对不同的场合, 选择不同的损失函数即可, 例如回归问题可以使用MSE,分类问题可以用对数似然。
其中,, 是对叶子节点个数的惩罚系数, 是对参数的惩罚系数
同GBDT一样, 我们可以把每一个基模型,写成 , 是叶子结点的输出值
现在我们的优化问题变成了
对于一个已经学习了步的模型,我们可以求出每一个样本的,所以对一个特定的树结构, 所有的,都是确定的
显而易见,当结构确定时,每个叶子节点的输出应该是
现在我们假设只有一个样本在这个叶子上,即
如果越大,说明该点附近梯度波动越大,所以我们就需要较小的学习率,还是比较直观的。
现在我们来说一下基模型的学习情况,
当前节点不分裂的时候, 把带入损失函数,得到
若该节点分成两个节点, 损失函数变成了
两式相减,得到
两式相减,得到
可以由Gain的正负情况判断需不需要继续分裂。
接下来说一下XGBoost是如何找分裂特征和分裂点的,GBDT优化的时候是贪心遍历所有特征及分裂点,非常消耗时间
XGBoost可以通过加权分位数的算法选出每个特征可能的分裂点,减小搜索次数
上式表示特征值k小于z的样本的加权分位数,确定分割的百分位数,例如5%一个分裂点,则就是20个分割点,即可实现寻找特征分割点的优化。
关于这边为什么可以用h作为权重,可以将目标函数变形称为
, 所以每个样本的权重跟自身的h有关。
XGBoost的介绍暂时就到这边,如果想到什么会继续补充。
转载请注明,谢谢。