【论文阅读】XGBoost: A Scalable Tree Boosting System

 本文通过对原论文和相关介绍的梳理后,把自己的理解记录下来。

XGBoost是一个基于boosting的可扩展的Tree Ensemble机器学习方法。

 

定义目标函数

假设我们用$F$表示一个空间中的所有决策树的集合,那么有:

$$F = \{f(x) = w_{q(x)}\}(q: R^m \rightarrow T, w \in R^T)  \tag{1}$$

这里$q$表示一棵树的结构,$q(x)$表示把样本$x$映射到一个叶节点上,假如$q(x) = j$,那么$w_j$就表示叶节点$j$的权重,所以函数$f(x) = w_{q(x)}$表示样本$x$分配到结构为$q$的树上的一个叶节点上对应的权重。

XGBoost就是由集合$F$的$K$棵决策树组合而成,那么对于样本集$D = \{(x_i,y_i)\} (|D|=n,x_i \in R^m, y_i \in R)$中的每一个样本$x_i$,它的预测值是$\hat{y}_i$:

$$\hat{y}_i = \sum_{k=1}^{K} f_k(x_i), \,\, f_k \in F \tag{2}$$

标准值$y_i$和预测值$\hat{y}_i$的差是损失值,记为$l(y_i, \hat{y}_i)$,所以我们这样定义目标函数:

$$L(\phi) = \sum_i l(y_i, \hat{y}_i) \tag{3}$$

即目标函数所有样本的损失值之和。

为了防止过拟合,我们给式$(3)$的目标函数加上正则项:

$$\Omega(f_k) = \gamma T + \frac{1}{2} \lambda ||w||^2 \tag{4}$$

$$L(\phi) = \sum_i l(y_i, \hat{y}_i) + \sum_k \Omega(f_k) \tag{5}$$

至此,我们得到了一个完整的目标函数,从式$(5)$我们明白了XGBoost要做的工作是从空间集$F$中找到最优的$K$颗决策树,使它们对目标函数取值最小。

 

启发式算法

由于$F$空间包含的不同结构的决策树的数量级是指数级别,从这个空间中选择$K$颗树是一个NP完全问题。对于NP完全问题,我们可以退一步采用启发式方法,对这个最优问题进行近似求解。

采用启发式算法就是对集合$F$中的决策树,通过每一轮迭代选择一棵最优树加入到XGBoost中。每一轮迭代加入一棵新的决策树后,对于样本$i$都有一个新的预测值。经过$t$轮迭代后,记录如下:

\begin{align*}
& \hat{y}_i^{(0)} = 0 \\
& \hat{y}_i^{(1)} = f_1(x_i) = \hat{y}_i^{(0)} + f_1(x_i) \\
& \hat{y}_i^{(2)} = f_1(x_i) + f_2(x_i) = \hat{y}_i^{(1)} + f_2(x_i) \\
& \cdots \\
& \hat{y}_i^{(t)} = \sum_{k=1}^{t} f_k(x_i) = \hat{y}_i^{(t-1)} + f_t(x_i)
\end{align*}

那么在第$t$轮迭代,我们需要优化的目标函数就是:

\begin{align*}
L^{(t)} & = \sum_{i=1}^{n}l(y_i, \hat{y_i}^{(t)}) + \sum_{i=1}^{t}\Omega(f_t) \\
& = \sum_{i=1}^{n}l(y_i, \hat{y_i}^{(t-1)} + f_t(x_i)) + \Omega(f_t) + const \tag{6}
\end{align*}

由于$l$是一个可微的凸函数,可以对其进行二阶泰勒展开,有:

$$l(y_i, \hat{y_i}^{(t-1)} + f_t(x_i))  = l(y_i, \hat{y_i}^{(t-1)}) + g_if_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) \tag{7}$$

其中,$g_i = \partial_{\hat{y}^{(t-1)}} \, \, l(y_i, \hat{y}^{(t-1)}),\,\, h_i = \partial_{\hat{y}^{(t-1)}}^{2} \,\, l(y_i, \hat{y}^{(t-1)})$

这里需要指明,$g_i, \, h_i$的值仅依赖$t-1$轮的运算,在$t$轮运算时是常数。

目标函数:

$$L^{(t)} \approx \sum_{i=1}^{n}[l(y_i, \hat{y_i}^{(t-1)}) + g_if_t(x_i) + \frac{1}{2} h_i f_t^2(x_i)] +  \Omega(f_t) + const \tag{8}$$

去除常数项,目标函数简化为:

$$L^{(t)} \approx \sum_{i=1}^{n}[g_if_t(x_i) + \frac{1}{2} h_i f_t^2(x_i)] +  \Omega(f_t) \tag{9}$$

定义第$t$轮迭代中每个叶节点的样本集合,$I_j = \{i|q(x_i) = j\}$,以叶节点为单位整理$L^{(t)}$

$$L^{(t)} = \sum_{i=1}^{n}[g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i)] + \gamma T + \frac{1}{2} \lambda \sum_{j=1}^{T}{w_j^2} \\\,\,\,= (\sum_{j=1}^{T}[(\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 \tag{10}$$

对$w_j$求导,

$$\frac{\partial{L^{(t)}}}{\partial{w_j}} = \sum_{i \in I_j} g_i +  (\sum_{i \in I_j} h_i + \lambda) w_j \tag{11}$$

令式$(11) = 0$,有:

$$w_j^{\ast} = - \frac{\sum_{i \in I_j} g_i}{\sum_{i \in I_j} h_i + \lambda} \tag{12}$$

把$w_j^{\ast}$带入式$(10)$有

$$L^{(t)}(q) = -\frac{1}{2} \sum_{j=1}^T \frac{(\sum_{i \in I_j} g_i)^2}{\sum_{i \in I_j} h_i + \lambda}  + \gamma T \tag{13}$$

整理$G_j = \sum_{i \in I_j} g_i, \,\, H_j = \sum_{i \in I_j} h_i $,得

$$L^{(t)}(q) = -\frac{1}{2} \sum_{j=1}^T \frac{G_j^2}{H_j+ \lambda} + \gamma T \tag{14}$$

 

构建一棵决策树

 $ \frac{G_j^2}{H_j + \lambda}$表示叶节点$j$对损失函数值的贡献度,记为叶节点$j$的得分。

对于这棵树上的每一个叶节点,我们尝试对其划分为左右两个子节点,$I_j^{(left)}$和$I_j^{(right)}$分别代表左右子节点上样本的集合,所以两个子节点的得分分别为$\frac{G_L^2}{H_L + \lambda}$和$\frac{G_R^2}{H_R + \lambda}$

节点$j$按划分成左右两个子节点后的减少的损失称为增益,即:

$$Gain = \frac{1}{2}[\frac{G_L^2}{H_L + \lambda} + \frac{G_R^2}{H_R + \lambda} - \frac{G_j^2}{H_j+ \lambda}] - \gamma \tag{15}$$

对于节点$j$的最优划分就是$Gain$最大的划分,步骤如下:

1) 对于每个叶节点枚举其所有特征;

2) 把样本按照当前特征的取值排序;

3)从先前后遍历这些样本,把当前遍历到的样本及其前面的样本分配到左子节点,后面的样本放到右子节点,计算$Gain$值。

$Gain$值最大的划分即为当前叶节点最优划分。

 

posted on 2020-06-02 11:29  ClementCJ  阅读(384)  评论(0)    收藏  举报

导航