xgboost 是指extreme gradient boosting。boosting的思想就是指利用一系列弱模型达到较强的效果。具体到xgboost算法,每个弱模型是一个决策树,然后依次生成,第一个拟合完,第二个去拟合第一个的误差,直至生成指定数量的树。
考虑一个预测问题,样本数量为N,特征为xi, 标签为yi,前t个决策树的预测值为y^i(t)=∑k=1tfk(xi),其中fk(xi)表示第k个树的输出。
接下来设计损失函数,这里我们假设前t−1个树已经确定了,现在来设计第t个。这个损失函数并不是只有一个预测误差,也包含了对模型复杂程度的惩罚,具体如下
L=i=1∑NL(yi,y^i)+k=1∑tΩ(fk)
对第一项,∑i=1NL(yi,y^i)=∑i=1NL(yi,y^it−1+fk(xi))利用taylor展开近似一下,即把新增的fk(xi)看作Δx,把前面确定的y^it−1看作x0那么展开两项之后有
L=i=1∑N(L(yi,y^it−1)+gifk(xi)+hifk(xi)2)+k=1∑tΩ(fk)
其中gi=∂yi(t−1)∂L(yi,yi(t−1)), hi=(∂yi(t−1))2∂2L(yi,yi(t−1))。
对于后面Ω(fk)我们采用叶节点数量(设为T)和叶节点输出大小综合考虑。我们设置为
Ω(fk)=γT+2λj=1∑T(wj(k))2
这里简单说明一下决策树的结构,树复杂意味着选择用来决策分类的属性数量多,每多选择一个属性,因为这叶节点数量增加1个,最后分类完他会落在一个叶节点上,按理说这就结束了,但是如果是回归问题,并不满足于分类,因此叶节点会有一个参数wj,决策树的输出就是决策完落在的叶节点对应的参数。
带入到前面,并且把前t−1个树固定的常数部分省略掉,我们可以得到
L=i=1∑N(gifk(xi)+hifk(xi)2)+Ω(fk)=i=1∑N(gifk(xi)+hifk(xi)2)+γT+2λj=1∑T(wj(k))2
之后为了把两个求和项和在一起,把第一个按照叶子结点输出重排,得到
L=j=1∑T(Gjwj+21(Hj+λ)(wj(k))2)+γT
这里重排的意思就是把所有经过决策树落在叶子结点j的样本放在一起,因为落在节点j,所以fk(x)的输出就是wj,相应地,Gj=∑i∈Ijgi,Hj=∑i∈Ijhi,是落在节点j样本的梯度和。
对L求偏导数并令其等于0,求极值点
∂wj∂L=Gj+(Hj+λ)(wj(k))=0
所以wj(k)=−Hj+λGj,带入可以得到最小的loss为
Lm=−21j=1∑THj+λGj2+γT
以此为依据,我们按照增益可以知道如何构造树,对样本的每个属性,按照该属性值从小到大排序,然后依次遍历尝试找到最优的分裂点,这个点具有最大的增益
Gain=21(HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2)−γ
注意最后一个γ是由于Loss里的γT导致的,多分裂之后,模型复杂度多了一个叶子结点,相应产生惩罚。Gl,GR分别是分裂点左右两侧的样本梯度和。
这是精确方法,复杂度有点高,所以有一个近似方法是先对每个属性分成若干段,计算分位点,然后对每个属性,就按照分位点划分的段去计算Gain。