GBDT算法基于经验损失函数的负梯度构造新的决策树,并且在决策树构建完成后进行剪枝(后剪枝)。
XGBoost在决策树构建阶段就加入了正则项,如下为XGBoost的损失函数:
其中 表示现有的t-1棵树最优解。
树结构的正则项定义为
其中T为叶子节点个数, 表示第j个叶子节点的预测值。
对该损失函数在 处进行二阶泰勒展开可以推导出
其中T为决策树 中叶子节点的个数, , , 表示所有属于叶子节点 的样本的索引的集合。
假设决策树的结构已知,通过令损失函数相对于 的导数为0可以求出在最小化损失函数的情况下各个叶子节点上的预测值
实际使用贪心方法来构建一个次优的树结构,基本思想是从根节点开始,每次对一个叶子节点进行分裂,针对每一种可能的分裂,根据特定的准则选取最优的分裂。不同的决策树采用不同的准则。
XGBoost有特定的专责来选取最优分裂
通过将预测值 代入到损失函数中可求得损失函数的最小值
然后计算出分裂前后损失函数的差值为:
XGBoost采用最大化这个插值作为准则来进行决策树的构建,通过遍历所有特征的所有取值,寻找使得损失函数前后相差最大时对应的分裂方式。此外,由于损失函数前后存在一定为正的限制,此时 起到了一定的预剪枝效果。
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、二阶信息本身就能让梯度收敛更快更准确。这一点在优化算法里的牛顿法里已经证实了。可以简单认为一阶导指引梯度方向,二阶导指引梯度方向如何变化。这是从二阶导本身的性质,也就是为什么要用泰勒二阶展开的角度来说的。