xgboost正则项_什么是XGboost
编辑:西兰
1. 什么是XGBoost
XGBoost是陈天奇等⼈开发的⼀个开源机器学习项⽬,⾼效地实现了GBDT算法并进⾏了算法和⼯程上的许多改进,被⼴泛应⽤在Kaggle 竞赛及其他许多机器学习竞赛中并取得了不错的成绩。
说到XGBoost,不得不提GBDT(Gradient Boosting Decision Tree)。因为XGBoost本质上还是⼀个GBDT,但是⼒争把速度和效率发挥到极致,所以叫X (Extreme) GBoosted。包括前⾯说过,两者都是boosting⽅法。
1.1 XGBoost树的定义
先来举个例⼦,我们要预测⼀家⼈对电⼦游戏的喜好程度,考虑到年轻和年⽼相⽐,年轻更可能喜欢电⼦游戏,以及男性和⼥性相⽐,男性更喜欢电⼦游戏,故先根据年龄⼤⼩区分⼩孩和⼤⼈,然后再通过性别区分开是男是⼥,逐⼀给各⼈在电⼦游戏喜好程度上打分,如下图所⽰。
就这样,训练出了2棵树tree1和tree2,类似之前gbdt的原理,两棵树的结论累加起来便是最终的结论,所以⼩孩的预测分数就是两棵树中⼩孩所落到的结点的分数相加:2 + 0.9 = 2.9。爷爷的预测分数同理:-1 + (-0.9)= -1.9。具体如下图所⽰:
恩,你可能要拍案⽽起了,惊呼,这不是跟上⽂介绍的GBDT乃异曲同⼯么?
事实上,如果不考虑⼯程实现、解决问题上的⼀些差异,XGBoost与GBDT⽐较⼤的不同就是⽬标函数的定义。XGBoost的⽬标函数如下图所⽰:
其中:
红⾊箭头所指向的L 即为损失函数(⽐如平⽅损失函数:l(yi,yi)=(yi−yi)2" role="presentation" >L(yi,yi)=(yi−yi)2l(yi,yi)=
(yi−yi)^2)
红⾊⽅框所框起来的是正则项(包括L1正则、L2正则)
红⾊圆圈所圈起来的为常数项
对于f(x),XGBoost利⽤泰勒展开三项,做⼀个近似。f(x)表⽰的是其中⼀颗回归树。
看到这⾥可能有些读者会头晕了,这么多公式,我在这⾥只做⼀个简要式的讲解,具体的算法细节和公式求解请查看这篇博⽂,讲得很仔细:通俗理解kaggle⽐赛⼤杀器xgboost
网页float是什么意思
XGBoost的核⼼算法思想不难,基本就是:
1. 不断地添加树,不断地进⾏特征分裂来⽣长⼀棵树,每次添加⼀个树,其实是学习⼀个新函数f(x),去拟合上次预测的残差。
2. 当我们训练完成得到k棵树,我们要预测⼀个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的⼀个叶⼦节点,每
个叶⼦节点就对应⼀个分数
3. 最后只需要将每棵树对应的分数加起来就是该样本的预测值。
显然,我们的⽬标是要使得树的预测值yi′" role="presentation" >y′i尽量接近真实值yi" role="presentation" >yi,⽽且有尽量⼤的泛化能⼒。类似之前GBDT的套路,XGBoost也是需要将多棵树的得分累加得到最终的预测得分(每⼀次迭代,都在现有树的基础上,增加⼀棵树去拟合前⾯树的预测结果与真实值之间的残差)。
那接下来,我们如何选择每⼀轮加⼊什么 f 呢?答案是⾮常直接的,选取⼀个 f 来使得我们的⽬标函数尽量最⼤地降低。这⾥ f 可以使⽤泰勒展开公式近似。
实质是把样本分配到叶⼦结点会对应⼀个obj,优化过程就是obj优化。也就是分裂节点到叶⼦不同的组合,不同的组合对应不同obj,所有的优化围绕这个思想展开。到⽬前为⽌我们讨论了⽬标函数中的第⼀个部分:训练误差。接下来我们讨论⽬标函数的第⼆个部分:正则项,即如何定义树的复杂度。
1.2 正则项:树的复杂度
XGBoost对树的复杂度包含了两个部分:
⼀个是树⾥⾯叶⼦节点的个数T
⼀个是树上叶⼦节点的得分w的L2模平⽅(对w进⾏L2正则化,相当于针对每个叶结点的得分增加L2平滑,⽬的是为了避免过拟合)
我们再来看⼀下XGBoost的⽬标函数(损失函数揭⽰训练误差 + 正则化定义复杂度):
正则化公式也就是⽬标函数的后半部分,对于上式⽽⾔,yi′" role="presentation" >y′iyi′是整个累加模型的输出,正则化项∑kΩ(ft)是则表⽰树的复杂度的函数,值越⼩复杂度越低,泛化能⼒越强。
1.3 树该怎么长
很有意思的⼀个事是,我们从头到尾了解了xgboost如何优化、如何计算,但树到底长啥样,我们却⼀直没看到。很显然,⼀棵树的⽣成是由⼀个节点⼀分为⼆,然后不断分裂最终形成为整棵树。那么树怎么分裂的就成为了接下来我们要探讨的关键。对于⼀个叶⼦节点如何进⾏分裂,XGBoost作者在其原始论⽂中给出了⼀种分裂节点的⽅法:枚举所有不同树结构的贪⼼法
不断地枚举不同树的结构,然后利⽤打分函数来寻出⼀个最优结构的树,接着加⼊到模型中,不断重复这样的操作。这个寻的过程使⽤的就是贪⼼算法。选择⼀个feature分裂,计算loss function最⼩值,然后再选⼀个feature分裂,⼜得到⼀个loss function最⼩值,你枚举完,⼀个效果最好的,把树给分裂,就得到了⼩树苗。
总⽽⾔之,XGBoost使⽤了和CART回归树⼀样的想法,利⽤贪婪算法,遍历所有特征的所有特征划分点,不同的是使⽤的⽬标函数不⼀样。具体做法就是分裂后的⽬标函数值⽐单⼦叶⼦节点的⽬标函数的增益,同时为了限制树⽣长过深,还加了个阈值,只有当增益⼤于该阈值才进⾏分裂。从⽽继续分裂,形成⼀棵树,再形成⼀棵树,每次在上⼀次的预测基础上取最优进⼀步分裂/建树。
1.4 如何停⽌树的循环⽣成
凡是这种循环迭代的⽅式必定有停⽌条件,什么时候停⽌呢?简⾔之,设置树的最⼤深度、当样本权重和⼩于设定阈值时停⽌⽣长以防⽌过拟合。具体⽽⾔,则
1. 当引⼊的分裂带来的增益⼩于设定阀值的时候,我们可以忽略掉这个分裂,所以并不是每⼀次分裂loss function整体都会增加的,有
点预剪枝的意思,阈值参数为(即正则项⾥叶⼦节点数T的系数);
2. 当树达到最⼤深度时则停⽌建⽴决策树,设置⼀个超参数max_depth,避免树太深导致学习局部样本,从⽽过拟合;
3. 样本权重和⼩于设定阈值时则停⽌建树。什么意思呢,即涉及到⼀个超参数-最⼩的样本权重和min_child_weight,和GBM的
min_child_leaf 参数类似,但不完全⼀样。⼤意就是⼀个叶⼦节点样本太少了,也终⽌同样是防⽌过拟合;
2. XGBoost与GBDT有什么不同
除了算法上与传统的GBDT有⼀些不同外,XGBoost还在⼯程实现上做了⼤量的优化。总的来说,两者之间的区别和联系可以总结成以下⼏个⽅⾯。
1. GBDT是机器学习算法,XGBoost是该算法的⼯程实现。
2. 在使⽤CART作为基分类器时,XGBoost显式地加⼊了正则项来控制模 型的复杂度,有利于防⽌过拟合,从⽽提⾼模型的泛化能⼒。
3. GBDT在模型训练时只使⽤了代价函数的⼀阶导数信息,XGBoost对代 价函数进⾏⼆阶泰勒展开,可以同时使⽤⼀阶和⼆阶导数。
4. 传统的GBDT采⽤CART作为基分类器,XGBoost⽀持多种类型的基分类 器,⽐如线性分类器。
5. 传统的GBDT在每轮迭代时使⽤全部的数据,XGBoost则采⽤了与随机 森林相似的策略,⽀持对数据进⾏采样。
6. 传统的GBDT没有设计对缺失值进⾏处理,XGBoost能够⾃动学习出缺 失值的处理策略。
3. 为什么XGBoost要⽤泰勒展开,优势在哪⾥?
XGBoost使⽤了⼀阶和⼆阶偏导, ⼆阶导数有利于梯度下降的更快更准. 使⽤泰勒展开取得函数做⾃变量的⼆阶导数形式, 可以在不选定损失函数具体形式的情况下, 仅仅依靠输⼊数据的值就可以进⾏叶⼦分裂优化计算, 本质上也就把损失函数的选取和模型算法优化/参数选择分开了. 这种去耦合增加了XGBoost的适⽤性, 使得它按需选取损失函数, 可以⽤于分类, 也可以⽤于回归。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。