1.思想

首先,要说明XGBoost是一种提升方法,基本的分类模型就是决策树;决策树最重要的问题就是怎么分裂?分裂的标准是什么?如何找到分裂的点?

2.数据集和模型

训练数据集D={(x1,y1),,(xn,yn)}D = \{(\vec{x}_1, y_1), \cdots, (\vec{x}_n, y_n)\}其中xiRm,yR\vec{x}_i \in R^m, y \in R

整个XGBoost最终的模型为
y^i=ϕ(xi)=k=1Kfk(xi),fkF \hat{y}_i = \phi(\vec{x}_i) = \sum^K_{k = 1}f_k(\vec{x}_i), f_k \in F
其中F={f(x)=wq(x)}F = \{f(\vec{x}) = w_{q(\vec{x})}\},是决策树的空间;

q(x):RmTq(\vec{x}): R^m \rightarrow T,将x\vec{x}映射到一个树叶上;

wRTw \in R^T:每个树叶的标签

注意:这里的q只是一个决策树的结构,具体树叶上的标签是由w确定的,所以实际上可以把w看成一个向量w=(w1,,wT)\vec{w} = (w_1, \cdots, w_T),每一个维度的值就是一个树叶的标签

为了说明这里用一下原论文的图片:
XGBoost简介

可以看到小女孩被tree1(q函数)映射到最左边的树叶上,该树叶的标签为+2,小女孩被tree2(q函数)映射到最左边的树叶上,该树叶的标签为+0.9;因此整个模型得到小女孩的值为2.9;同理老爷爷得到的值为1.9

3.学习函数
L(ϕ)=il(y^i,yi)+kΩ(fk)Ω(fk)=γT+12λw2 L(\phi) = \sum_il(\hat{y}_i, y_i) + \sum_k \Omega(f_k)\\ \Omega(f_k) = \gamma T + \frac{1}{2}\lambda||w||^2
学习的最终目的就是最小化L(ϕ)L(\phi)

其中l(y^i,yi)l(\hat{y}_i, y_i)是损失函数;

其中Ω(fk)\Omega(f_k)是正则化项,防止过拟合,其中的γ,λ\gamma, \lambda就是调参的对象

4.化简

由于上面的函数不能直接求最优解,因此要迭代优化出每一次生成的决策树。其中第t次生成决策树的学习函数如下
L(t)=i=1nl(yi,y^(t1)+ft(xi))+Ω(ft) L^{(t)} = \sum^n_{i = 1}l(y_i, \hat{y}^{(t - 1)} + f_t(\vec{x}_i)) + \Omega(f_t)
将这个式子泰勒展开
L(t)i=1n[l(yi,y^i(t1))+gift(xi)+12hift2(xi)]+Ω(ft)gi=l(yi,y^(t1))y^(t1)hi=2l(yi,y^(t1))y^(t1)2 L^{(t)} \approx \sum^n_{i = 1}[l(y_i, \hat{y}^{(t-1)}_i) + g_i f_t(\vec{x}_i) + \frac{1}{2} h_if_t^2(\vec{x}_i)] + \Omega(f_t)\\ g_i = \frac{\partial l(y_i, \hat{y}^{(t - 1)})}{\partial \hat{y}^{(t - 1)}}\\ h_i = \frac{\partial^2 l(y_i, \hat{y}^{(t - 1)})}{\partial {\hat{y}^{(t - 1)}}^2}
由于l(yi,y^i(t1))l(y_i, \hat{y}^{(t-1)}_i)是常数,因此可以忽略,继续化简得到下式
L(t)=i=1n[gift(xt)+12+hift2(xi)]+Ω(ft) L^{(t)} = \sum^n_{i = 1}[g_if_t(\vec{x}_t) + \frac{1}{2} + h_if_t^2(\vec{x}_i)] + \Omega(f_t)
Ω(ft)\Omega(f_t)带入函数得到
L(t)=i=1n[gift(xi)+12hift2(xi)]+γT+12λj=1Twj2=j=1T[(iIjgi)wj+12(iIjhi+λ)wj2]+γT \begin{aligned} L^{(t)} = &\sum^n_{i = 1}[g_i f_t(\vec{x}_i) + \frac{1}{2}h_if_t^2(\vec{x}_i)] + \gamma T + \frac{1}{2} \lambda\sum^T_{j = 1}w_j^2\\ = &\sum^T_{j = 1}[(\sum_{i \in I_j}g_i)w_j + \frac{1}{2}(\sum_{i \in I_j}h_i + \lambda)w_j^2] + \gamma T \end{aligned}
其中iIj={iq(xi)=j}i \in I_j = \{i | q(\vec{x}_i) = j\}表示被映射到第j片树叶的向量xi\vec{x}_i

5.优化

现在已经确定了最终的学习函数,那么开始暴力遍历所有的维度,找到分裂后拟合最好的情况。

选定一种分裂,那么树的结构q就固定,只需要考虑最优化w,直接求导可以得到最优化的

wj=iIjgiiIjhi+λ w^*_j = - \frac{\sum_{i \in I_j} g_i}{\sum_{i \in I_j} h_i + \lambda}

那么这种分裂的学习函数的值为
L(t)(q)=12j=1T(iIjgi)2iIjhi+λ+γT L^{(t)}(q) = -\frac{1}{2}\sum^T_{j = 1}\frac{(\sum_{i \in I_j} g_i)^2}{\sum_{i \in I_j} h_i + \lambda} + \gamma T
只要在一次分裂的过程中,找到最小的L(t)(q)L^{(t)}(q)就行了。到这里已经讲完XGBoost的学习过程,为了方便计算下面给出一次分裂的ΔL\Delta L,即L(t)(q)L^{(t)}(q)的减少值。记分裂一次形成的左树叶为ILI_L,右树叶为IRI_R,原本的树叶为II
ΔL=12[(iILgi)2iILhi+λ+(iIRgi)2iIRhi+λ+(iIgi)2iIhi+λ]γ \Delta L = \frac{1}{2} [\frac{(\sum_{i \in I_L}g_i)^2}{\sum_{i \in I_L} h_i + \lambda} + \frac{(\sum_{i \in I_R}g_i)^2}{\sum_{i \in I_R} h_i + \lambda} + \frac{(\sum_{i \in I}g_i)^2}{\sum_{i \in I} h_i + \lambda}] - \gamma
这个减少值ΔL\Delta L最大即为分裂点

6.XGBoost算法
XGBoost简介

补充

  • 强烈推荐看原文,写的很清楚易懂
  • 原文链接,应该是要翻墙?找不到可以私我
  • 这里的暴力搜索只是一种找最分裂点的办法,比较慢,但是方便、准确;原文讨论了另外两种找最优解的办法,牺牲了一定的准确率但是更快,另外两种算法如下
    XGBoost简介
    XGBoost简介

相关文章: