版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011599639/article/details/82832130
一 说明
xgboost是boosting算法的其中一种,该算法思想就是不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。具体的目标函数如下:
Obj(t)=i=1∑nl(yi,yi^(t−1)+ft(xi))+Ω(ft)+constant(1)
主要就是找到
ft来优化这一目标函数,通过一个简单的例子来形象的理解该目标函数。例如是小明真实有100个糖果,现在建立一个决策系统来预测小明有多少个糖。首先建立一棵树,记为树1,它的预测结果是90个,这时得到一个残差,这个残差值就是100-90=10,此时和真实值差别是10。为了提高精度,可以在该决策系统中再添加一棵树,记为树2。树2就是为了弥补上一棵树存在的残差,假设它的预测结果是5,此时总体的残差值是10-5=5,即和真实值相差为5。符号化表示:之前的结果10表示为输出结果为
y1^,即上一时刻的残差值,树2的值为
f2,此时得到的值。接着可以再建立第三课树,记为树3。假设它的预测值为3,此时总体的残差值是5-3=2,即和真实值相差为2。符号化表示:上一时刻输出结果5为
y2^,即上一时刻的残差值,树3为
f3,此时得到的值。xgboost的目标就是通过找到
ft来优化这一目标函数,使得最终结果足够小。下面对该函数进行推导化简。
二 目标函数化简
1、预备知识,泰勒展开式。主要使用泰勒展开式来近似原来的目标函数
f(x+∇x)=f(x)+f’(x)∇x+21f′′(x)∇x(2)
2、推导过程:
Obj(t)=i=1∑n[l(yi,yi^(t−1))+∂y^(t−1)l(yi,y^(t−1))∗ft(xi)+∂y^(t−1)2l(yi,y^(t−1))∗2ft(xi)+Ω(ft)+constant(3)
≈i=1∑n[gi∗ft(xi)+hi∗2ft(xi)]+Ω(ft)+constant(4)
=i=1∑n[gi∗wq(xi)+21hi∗wq(xi)2]+γT+λj=1∑Tωj2(5)
=j=1∑T[(i∈Ij∑gi)wj+21((i∈Ij∑hi+λ)wj2)]+γT(6)
=j=1∑T[Gjwj+21(Hj+λ)wj2]+γT(7)
- 式(3):它是在(2)的基础上推导出来,是将
l(yi,yi^(t−1))看着(2)中的x,
ft(xi)记为
∇x(注:这里的变换是近似变换。后面式中的t,表示时刻;i表示第i个样本。将
gi=∂y^(t−1)l(yi,y^(t−1)),hi=∂y^(t−1)2l(yi,y^(t−1));又因为
l(yi,yi^(t−1))是一个固定值,可以合并到后面的常数项中。式(3)变形为式(4)
- 式(5):它是将
ft(xi)z和后面的正则项目展开了。
- 这里对于f的定义做一下细化,把树拆分成结构部分q和叶子权重部分w。下图是一个具体的例子。结构函数q把输入映射到叶子的索引号上面去,即第几个叶子;而w给定了每个索引号对应的叶子分数是什么。通俗的理解就是样本x落到那个叶子结点上,取该结点的值。
- 正则化项目选择了数据树的叶子个数,以及叶子权值大小平方。为了防止树在训练过程中过度复杂。当然这不是唯一的一种定义方式,不过这一定义方式学习出的树效果一般都比较不错。下图还给出了正则化项目计算的一个例子。
- 式(6)主要的变换是将对样本的遍历,转换为对树的叶子结点的遍历。(理解部分:假设一共5个样本,其中共有两个样本落在上图树中的leaf1,一个样本落在leaf2中,还有两个样本落在leaf3中。式(5)是直接统计各个样本的值,式(6)则是直接遍历叶子,遍历leaf1时可以取得统计2个样本的值,leaf2时可以取得统计1个样本的值, leaf3时可以取得统计2个样本的值,同样可以访问所有的样本。在叶子上遍历更加方便计算)。式(6)中就是统计落在每个叶子结点中所有的样本的一阶导数
gi和该叶子结点权值w的乘积,同时二阶导数
hi和该叶子结点权值w的乘积(每个样本的
gi和hi都不一样)。
- 使式中
Gj表示当前叶子结点所有样本一阶导数的和,同理
Hj表示当前样本所有二阶导数的和
3 目标函数转换
Obj(t)=j=1∑T[Gjwj+21(Hj+λ)wj2]+γT(8)
使得式(8)最小,令
∂wj∂j(ft)=Gj+(Hj+λ)wj=0(9)
得到
wj=−Hj+λGj(10)
将(10)代入(9)得到:
Obj=−21j=1∑THj+λGj2+γT(11)
举例说明:下图公有5个样本,三个叶子结点,计算的目标函数如下,最终的目标是得到最小值:
三 分支
如何找到最佳的分支切割点,如上图所示。如何选取合适的a点分割,使目标函数值变小。这里是基于式(11),得到分支增益的公式:
Gain=21[HL+λGL2+HR+λGR2+HL+HR+λGL2+GR2]−γ(12)
选取是Gain最小的切割点进行分支。