机器学习算法总结11:XGBoost

XGBoost(eXtreme Gradient Boosting)是于2015年提出的Gradient Boosting实现算法,在速度和精度较GBDT有显著提升。
机器学习算法总结11:XGBoost_第1张图片
XGBoost以类似牛顿法的方式进行优化。
任何机器学习问题都可以从目标函数出发,目标函数分为两部分:损失函数+正则化项,其中,损失函数用于描述模型拟合数据的程度,正则化项用于控制模型的复杂度。
与GDBT一样,XGBoost采用加法模型,设基学习器为f(x),那么,预测值为:
在这里插入图片描述
在第m步,前m-1个基学习器是固定的,所以,目标函数为:
在这里插入图片描述
注意:在GBDT中没有正则化项,XGBoost中采用的正则化项
在这里插入图片描述
其中,J为叶结点数目,bj为各个叶结点上的值即分数,也称权重,正则化项作用:限制树的复杂度,这样相当于使叶结点数目变少,同时限制叶结点上的分数,从而起到防止过拟合的效果。
将正则化项代入目标函数并进行二阶泰勒展开,得:
在这里插入图片描述
其中,gi为损失函数的一阶导,hi为损失函数的二阶导
在这里插入图片描述
二阶泰勒展开:
在这里插入图片描述
泰勒公式:将在x=x0处具有n阶导数的函数f(x),利用(x-x0)的n次多项式来逼近函数的方法。
机器学习算法总结11:XGBoost_第2张图片
已知单颗决策树可表示为:
在这里插入图片描述
将所有决策树相加得到(J为叶结点数目,bj为各个叶结点上的值即分数):
在这里插入图片描述
代入目标函数,并将常数项
在这里插入图片描述
去掉,得到最终的目标函数(二次函数):
机器学习算法总结11:XGBoost_第3张图片
其中,
在这里插入图片描述
XGBoost增益计算
精确划分决策树,使用贪心法,遍历每个特征(属性)的每个取值,计算分裂前后的增益,并选择增益最大的进行分裂。
XGBoost提出一种新的增益计算方法:
对(1.4)式求导,最优值为:
在这里插入图片描述
再代入(1.4)式得到最小的目标函数为:
在这里插入图片描述
上式可以认为是XGBoost的打分函数即树的分数,该值越小,说明树的结构越好。
上式类似于传统决策树中的不纯度指标,在决策树中希望分裂前后的不纯度越低越好,对应XGBoost则是希望上式越小越好,分裂前后(一个叶子结点变为两个叶子结点)的增益定义为:
在这里插入图片描述
Gain越大,说明越值得分裂,参数γ是一个超参数,具有双重含义:一是对叶结点数目进行控制(正则化项超参);二是作为分裂前后阈值,只有大于γ才选择分裂,起到预剪枝的作用,目的限制树的规模防止过拟合。
XGBoost采用后剪枝策略,建每棵树会一直分裂到指定的最大深度,然后递归自下而上进行剪枝。
决策树(贪心法)建树过程:
寻找最优分裂点:
对每一个结点,穷举所有特征,所有可能分裂点,具体地,对每个特征,通过特征值将实例进行排序,运用线性扫描来寻找该特征的最优分裂点,对所有特征,采用最优分裂点。
那么,深度为k的树的时间复杂度:
对于一层排序,需要时间Nlog(N),N为样本数目,由于有D个特征,k层,所以时间复杂度为:kDNlog(N)
采用预排序的方法,寻找最佳数据分裂点。
树的生长方式:
Level-wise:
优点:多线程优化更为简单、能够加速预排序算法;
缺点:可能生成不必要的叶子结点,不够高效。
机器学习算法总结11:XGBoost_第4张图片
决策树(近似搜索算法)建树过程:
当数据太多不能装载到内存时,不能进行精确搜索分裂,只能近似搜索分裂。具体地,根据特征分布的百分位数,提出特征的一些候选分裂点,根据候选提出的时间,分为:
1.全局近似:在构造树的初始阶段提出所有的候选分裂点,然后对各个层次采用相同的候选,优点是提出候选的次数少,但每次的候选数目多(因为候选不更新);
2.局部近似:在每次分裂都重新提出候选,对层次较深的树更适合。
机器学习算法总结11:XGBoost_第5张图片
建树过程中稀疏特征的处理
稀疏特征:缺失数据和人为设计的特征(eg:one-hot编码)
XGBoost处理方法:将稀疏特征视为缺失值,在树的每个结点设置一个缺省方向
稀疏感知算法:在构建树的过程中只考虑特征未缺失的样本遍历,而特征值缺失的样本无需遍历只需直接分配到左右结点(按照缺省方向分配),所以算法所需遍历的样本量减少。
机器学习算法总结11:XGBoost_第6张图片
机器学习算法总结11:XGBoost_第7张图片
XGBoost决策树生成策略:level-wise
在这里插入图片描述
XGBoost学习算法:
机器学习算法总结11:XGBoost_第8张图片
Column Block for Parallel Learning
使用Column Block,实现并行训练,大大提升训练速度。
XGBoost参数
机器学习算法总结11:XGBoost_第9张图片
机器学习算法总结11:XGBoost_第10张图片
机器学习算法总结11:XGBoost_第11张图片
XGBoost与GBDT的区别:
1.GBDT优化时只用到一阶导数信息,XGBoost对目标函数进行二阶泰勒展开,同时使用一阶导数和二阶导数,另外XGBoost支持自定义损失函数,只要函数一阶和二阶可导;
2.XGBoost在损失函数中加入正则化项(叶子结点的数目,叶子结点的分数),用于控制模型复杂度,防止过拟合,从而提高模型的泛化能力,GBDT损失函数没有正则化项;
3.GBDT建树利用启发式准则,采用均方误差作为分裂的增益计算指标(使用的都是回归树),XGBoost使用目标函数推导的Gain;
4.XGBoost添加了对稀疏数据的支持,可以自动处理缺失值,在计算分裂增益时不会考虑缺失值的样本,这样就减少了时间开销。稀疏感知算法:在构建树的过程中只考虑特征未缺失的样本遍历,而特征值缺失的样本无需遍历只需直接分配到左右结点,所以算法所需遍历的样本量减少。具体地,在分裂点确定后,将带有缺失值的样本分别放在左子树和右子树,比较两者分裂增益,选择增益较大的那一边作为默认分裂方向;
5.并行化处理:XGBoost的并行处理主要体现在特征粒度上,在对结点进行分裂时,由于已预先对特征预排序并保存为block结构,每个特征的增益计算就可以多线程进行,极大提升训练速度,但是,block操作对于空间的消耗较大;
XGBoost与GBDT的联系:
1.学习过程相同,基于Boosting思想:先学习前n-1个学习器,再基于前n-1个学习器学习第n个学习器;
2.都是使用学习率对拟合结果进行缩减(Shrinkage)以减少过拟合风险,具体地,XGBoost在进行完一次迭代后,会将叶子结点的权重乘上学习率,主要是削弱每棵树的影响,让后面有更大的学习空间,较小的收缩因子通常意味着更多的弱学习器。
为什么XGBoost比GBDT效果好?
因为XGBoost自定义的增益分裂,让每轮迭代模型的损失减小的幅度最大;GBDT用负梯度代替残差,拟合残差树,虽然每一轮迭代模型损失有所减小,但是减小的幅度不能保证最大。

参考文章:
XGBoost详解
集成学习之Boosting——XGBoost
XGBoost及LightGBM
XGBoost: A Scalable Tree Boosting System(陈天奇)
学习视频

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