xgboost

61 阅读2分钟

xgboost 是指extreme gradient boosting。boosting的思想就是指利用一系列弱模型达到较强的效果。具体到xgboost算法,每个弱模型是一个决策树,然后依次生成,第一个拟合完,第二个去拟合第一个的误差,直至生成指定数量的树。

考虑一个预测问题,样本数量为NN,特征为xix_i, 标签为yiy_i,前tt个决策树的预测值为y^i(t)=k=1tfk(xi)\hat{y}^{(t)}_i=\sum_{k=1}^t f_k(x_i),其中fk(xi)f_k(x_i)表示第kk个树的输出。

接下来设计损失函数,这里我们假设前t1t-1个树已经确定了,现在来设计第tt个。这个损失函数并不是只有一个预测误差,也包含了对模型复杂程度的惩罚,具体如下

L=i=1NL(yi,y^i)+k=1tΩ(fk)L=\sum_{i=1}^N L(y_i,\hat{y}_i)+\sum_{k=1}^t \Omega(f_k)

对第一项,i=1NL(yi,y^i)=i=1NL(yi,y^it1+fk(xi))\sum_{i=1}^N L(y_i,\hat{y}_i)=\sum_{i=1}^N L(y_i,\hat{y}^{t-1}_i+f_k(x_i))利用taylor展开近似一下,即把新增的fk(xi)f_k(x_i)看作Δx\Delta x,把前面确定的y^it1\hat{y}^{t-1}_i看作x0x_0那么展开两项之后有

L=i=1N(L(yi,y^it1)+gifk(xi)+hifk(xi)2)+k=1tΩ(fk)L=\sum_{i=1}^N (L(y_i,\hat{y}^{t-1}_i) + g_i f_k(x_i) + h_i f_k(x_i)^2)+\sum_{k=1}^t \Omega(f_k)

其中gi=L(yi,yi(t1))yi(t1)g_i=\frac{\partial L(y_i,y_i^{(t-1)})}{\partial y_i^{(t-1)}}, hi=2L(yi,yi(t1))(yi(t1))2h_i=\frac{\partial^2 L(y_i,y_i^{(t-1)})}{(\partial y_i^{(t-1)})^2}
对于后面Ω(fk)\Omega(f_k)我们采用叶节点数量(设为TT)和叶节点输出大小综合考虑。我们设置为

Ω(fk)=γT+λ2j=1T(wj(k))2\Omega(f_k)=\gamma T+\frac{\lambda}{2}\sum_{j=1}^T (w^{(k)}_j)^2

这里简单说明一下决策树的结构,树复杂意味着选择用来决策分类的属性数量多,每多选择一个属性,因为这叶节点数量增加1个,最后分类完他会落在一个叶节点上,按理说这就结束了,但是如果是回归问题,并不满足于分类,因此叶节点会有一个参数wjw_j,决策树的输出就是决策完落在的叶节点对应的参数。

带入到前面,并且把前t1t-1个树固定的常数部分省略掉,我们可以得到

L=i=1N(gifk(xi)+hifk(xi)2)+Ω(fk)=i=1N(gifk(xi)+hifk(xi)2)+γT+λ2j=1T(wj(k))2L=\sum_{i=1}^N (g_i f_k(x_i) + h_i f_k(x_i)^2)+\Omega(f_k) \\ = \sum_{i=1}^N (g_i f_k(x_i) + h_i f_k(x_i)^2) + \gamma T+\frac{\lambda}{2}\sum_{j=1}^T (w^{(k)}_j)^2

之后为了把两个求和项和在一起,把第一个按照叶子结点输出重排,得到

L=j=1T(Gjwj+12(Hj+λ)(wj(k))2)+γTL=\sum_{j=1}^T (G_j w_j+\frac{1}{2} (H_j + \lambda) (w^{(k)}_j)^2) + \gamma T

这里重排的意思就是把所有经过决策树落在叶子结点jj的样本放在一起,因为落在节点jj,所以fk(x)f_k(x)的输出就是wjw_j,相应地,Gj=iIjgi,Hj=iIjhiG_j=\sum_{i\in I_j}g_i, H_j=\sum_{i\in I_j} h_i,是落在节点jj样本的梯度和。

LL求偏导数并令其等于0,求极值点

Lwj=Gj+(Hj+λ)(wj(k))=0\frac{\partial L}{\partial w_j}=G_j+(H_j+\lambda) (w_j^{(k)})=0

所以wj(k)=GjHj+λw_j^{(k)}=-\frac{G_j}{H_j+\lambda},带入可以得到最小的loss为

Lm=12j=1TGj2Hj+λ+γTL_m = -\frac{1}{2}\sum_{j=1}^T \frac{G_j^2}{H_j+\lambda} + \gamma T

以此为依据,我们按照增益可以知道如何构造树,对样本的每个属性,按照该属性值从小到大排序,然后依次遍历尝试找到最优的分裂点,这个点具有最大的增益

Gain=12(GL2HL+λ+GR2HR+λ(GL+GR)2HL+HR+λ)γGain = \frac{1}{2}(\frac{G_L^2}{H_L+\lambda} + \frac{G_R^2}{H_R+\lambda} - \frac{(G_L+G_R)^2}{H_L+H_R+\lambda}) - \gamma

注意最后一个γ\gamma是由于Loss里的γT\gamma T导致的,多分裂之后,模型复杂度多了一个叶子结点,相应产生惩罚。Gl,GRG_l,G_R分别是分裂点左右两侧的样本梯度和。

这是精确方法,复杂度有点高,所以有一个近似方法是先对每个属性分成若干段,计算分位点,然后对每个属性,就按照分位点划分的段去计算Gain。