XGBoost算法的原理推导

本节重点阐述 XGBoost 的算法原理和推导过程。既然 XGBoost 整体上仍属于 GBDT 算法系统,那么 XGBoost 也一定是由多个基模型组成的一个加性模型,所以 XGBoost 可表示为:
y ^ i = ∑ k = 1 K f k ( x i ) (12-1) \hat{y}_i = \sum_{k=1}^{K} f_k(x_i) \tag{12-1} y^i=k=1Kfk(xi)(12-1)

根据前向分步算法,假设第 t 次迭代的基模型为 f t ( x ) f_t(x) ft(x),有:
y ^ i ( t ) = ∑ k = 1 t y ^ i ( t − 1 ) + f t ( x i ) (12-2) \hat{y}_i^{(t)} = \sum_{k=1}^{t} \hat{y}_i^{(t-1)} + f_t(x_i) \tag{12-2} y^i(t)=k=1ty^i(t1)+ft(xi)(12-2)

下面推导 XGBoost 损失函数。损失函数基本形式由经验损失项和正则化项构成:
L = ∑ i = 1 n l ( y i , y ^ i ) + ∑ i = 1 t Ω ( f i ) (12-3) L = \sum_{i=1}^{n} l(y_i, \hat{y}_i) + \sum_{i=1}^{t} \Omega(f_i) \tag{12-3} L=i=1nl(yi,y^i)+i=1tΩ(fi)(12-3)

其中 ∑ i = 1 n l ( y i , y ^ i ) \sum_{i=1}^{n} l(y_i, \hat{y}_i) i=1nl(yi,y^i) 为经验损失项,表示训练数据预测值与真实值之间的损失; ∑ i = 1 t Ω ( f i ) \sum_{i=1}^{t} \Omega(f_i) i=1tΩ(fi) 为正则化项,表示全部 t 棵树的复杂度之和,这也是 XGBoost 控制模型过拟合的方法。

根据前向分步算法,以第 t 步模型为例,假设模型对第 i 个样本 x i x_i xi 的预测值为:
y ^ i ( t ) = y ^ i ( t − 1 ) + f t ( x i ) (12-4) \hat{y}_i^{(t)} = \hat{y}_i^{(t-1)} + f_t(x_i) \tag{12-4} y^i(t)=y^i(t1)+ft(xi)(12-4)

其中 y ^ i ( t − 1 ) \hat{y}_i^{(t-1)} y^i(t1) 是由第 t − 1 t-1 t1 步的模型给出的预测值,其作为一个已知常量存在, f t ( x i ) f_t(x_i) ft(xi) 为第 t 步树模型的预测值。因而式(12-3)的目标函数可以改写为:
L ( t ) = ∑ i = 1 n l ( y i , y ^ i ( t ) ) + ∑ i = 1 t Ω ( f i ) = ∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + ∑ i = 1 t Ω ( f i ) = ∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + Ω ( f t ) + Constant (12-5) \begin{aligned} L^{(t)} &= \sum_{i=1}^{n} l(y_i, \hat{y}_i^{(t)}) + \sum_{i=1}^{t} \Omega(f_i) \\ &= \sum_{i=1}^{n} l\left(y_i, \hat{y}_i^{(t-1)} + f_t(x_i)\right) + \sum_{i=1}^{t} \Omega(f_i) \\ &= \sum_{i=1}^{n} l\left(y_i, \hat{y}_i^{(t-1)} + f_t(x_i)\right) + \Omega(f_t) + \text{Constant} \tag{12-5} \end{aligned} L(t)=i=1nl(yi,y^i(t))+i=1tΩ(fi)=i=1nl(yi,y^i(t1)+ft(xi))+i=1tΩ(fi)=i=1nl(yi,y^i(t1)+ft(xi))+Ω(ft)+Constant(12-5)

式(12-5)对正则化项进行了拆分,因为前 t − 1 t-1 t1棵树的结构已经确定,所以前 t − 1 t-1 t1棵树的复杂度之和也可以表示为常数:
∑ i = 1 t Ω ( f i ) = Ω ( f i ) + ∑ i = 1 t − 1 Ω ( f i ) = Ω ( f i ) + Constant (12-6) \begin{aligned} \sum_{i=1}^{t} \Omega(f_i) &= \Omega(f_i) + \sum_{i=1}^{t-1} \Omega(f_i) \\ &= \Omega(f_i) + \text{Constant} \tag{12-6} \end{aligned} i=1tΩ(fi)=Ω(fi)+i=1t1Ω(fi)=Ω(fi)+Constant(12-6)

然后针对式(12-5)前半部分 l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) l\left(y_i, \hat{y}_i^{(t-1)} + f_t(x_i)\right) l(yi,y^i(t1)+ft(xi)),使用二阶泰勒展开式,这里需要用到函数的二阶导数信息,相应的损失函数经验损失项可以改写为:
l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) = l ( y i , y ^ i ( t − 1 ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) (12-7) l\left(y_i, \hat{y}_i^{(t-1)} + f_t(x_i)\right) = l\left(y_i, \hat{y}_i^{(t-1)}\right) + g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) \tag{12-7} l(yi,y^i(t1)+ft(xi))=l(yi,y^i(t1))+gift(xi)+21hift2(xi)(12-7)

其中 g i g_i gi 为损失函数一阶导数, h i h_i hi 为损失函数二阶导数,需要注意的是,这里是针对 y ^ i ( t − 1 ) \hat{y}_i^{(t-1)} y^i(t1) 进行求导。

XGBoost 相较于 GBDT 的一个最大的特点是用到了损失函数的二阶导数信息,所以当自定义或者选择 XGBoost 损失函数时,需要其二阶可导。以平方损失函数为例:
l ( y i , y ^ i ( t − 1 ) ) = ( y i − y ^ i ( t − 1 ) ) 2 (12-8) l\left(y_i, \hat{y}_i^{(t-1)}\right) = \left(y_i - \hat{y}_i^{(t-1)}\right)^2 \tag{12-8} l(yi,y^i(t1))=(yiy^i(t1))2(12-8)

对应的一阶导数和二阶导数分别为:
g i = ∂ l ( y i , y ^ i ( t − 1 ) ) ∂ y ^ i ( t − 1 ) = − 2 ( y i − y ^ i ( t − 1 ) ) (12-9) g_i = \frac{\partial l\left(y_i, \hat{y}_i^{(t-1)}\right)}{\partial \hat{y}_i^{(t-1)}} = -2\left(y_i - \hat{y}_i^{(t-1)}\right) \tag{12-9} gi=y^i(t1)l(yi,y^i(t1))=2(yiy^i(t1))(12-9)

h i = ∂ 2 l ( y i , y ^ i ( t − 1 ) ) ∂ ( y ^ i ( t − 1 ) ) 2 = 2 (12-10) h_i = \frac{\partial^2 l\left(y_i, \hat{y}_i^{(t-1)}\right)}{\partial \left(\hat{y}_i^{(t-1)}\right)^2} = 2 \tag{12-10} hi=(y^i(t1))22l(yi,y^i(t1))=2(12-10)

将式(12-7)的损失函数二阶泰勒展开式代入式(12-5),可得损失函数的近似表达式:
L ( t ) ≈ ∑ i = 1 n [ l ( y i , y ^ i ( t − 1 ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) + C o n s t a n t (12-11) L^{(t)} \approx \sum_{i=1}^{n} \left[l\left(y_i, \hat{y}_i^{(t-1)}\right) + g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i)\right] + \Omega(f_t) + Constant \tag{12-11} L(t)i=1n[l(yi,y^i(t1))+gift(xi)+21hift2(xi)]+Ω(ft)+Constant(12-11)

去掉相关常数项,式(12-11)简化后的损失函数表达式为:
L ( t ) ≈ ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) (12-12) L^{(t)} \approx \sum_{i=1}^{n} \left[g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i)\right] + \Omega(f_t) \tag{12-12} L(t)i=1n[gift(xi)+21hift2(xi)]+Ω(ft)(12-12)

由式(12-12)可知,只需要求出损失函数每一步的一阶导数和二阶导数值,并对目标函数进行优化求解,就可以得到前向分步中每一步的模型 f ( x ) f(x) f(x),最后根据加性模型得到 XGBoost 模型。

然而关于 XGBoost 的推导并没有到此结束。为了计算 XGBoost 决策树结点分裂条件,我们还需要进一步的推导。

我们对决策树做以下定义。假设一棵决策树是由叶子节点的权重 w w w 和样本实例到叶子节点的映射关系 q q q 构成,这种映射关系可以理解为决策树的分支结构。所以一棵树的数学表达可以定义为:
f t ( x ) = w q ( x ) (12-13) f_t(x) = w_{q(x)} \tag{12-13} ft(x)=wq(x)(12-13)

然后定义决策树复杂度的正则化项。模型复杂度 Ω \Omega Ω 可由单棵决策树的叶子节点数 T T T 和叶子权重 w w w 决定,即损失函数的复杂度由决策树的所有叶子节点数和叶子权重所决定。所以,模型的复杂度可以表示为:
Ω ( f t ) = γ T + 1 2 λ ∑ j = 1 T w j 2 (12-14) \Omega(f_t) = \gamma T + \frac{1}{2} \lambda \sum_{j=1}^{T} w_j^2 \tag{12-14} Ω(ft)=γT+21λj=1Twj2(12-14)

下面对决策树所有叶子节点重新进行归组。将属于第 j 个叶子节点的所有样本 x i x_i xi 划人一个叶子节点的样本集合中,即 I j = { i ∣ q ( x i ) = j } I_j = \{i | q(x_i) = j\} Ij={ iq(xi)=j},因而 XGBoost 的损失函数式(12-12)可以改写为:
L ( t ) ≈ ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) = ∑ i = 1 n [ g i w q ( x i ) + 1 2 h i w q ( x i ) 2 ] + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ j = 1 T [ ( ∑ i ∈ I j g i ) w j + 1 2 ( ∑ i ∈ I j h i + λ ) w j 2 ] + γ T (12-15) \begin{aligned} L^{(t)} &\approx \sum_{i=1}^{n} \left[g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i)\right] + \Omega(f_t) \\ &= \sum_{i=1}^{n} \left[g_i w_{q(x_i)} + \frac{1}{2} h_i w_{q(x_i)}^2\right] + \gamma T + \frac{1}{2} \lambda \sum_{j=1}^{T} w_j^2 \\ &= \sum_{j=1}^{T} \left[\left(\sum_{i \in I_j} g_i\right) w_j + \frac{1}{2} \left(\sum_{i \in I_j} h_i + \lambda\right) w_j^2\right] + \gamma T \tag{12-15} \end{aligned} L(t)i=1n[gift(xi)+21hift2(xi)]+Ω(ft)=i=1n[giwq(xi)+21hiwq(xi)2]+γT+21λj=1Twj2=j=1T iIjgi wj+21 iIjhi+λ wj2 +γT(12-15)

定义 G j = ∑ i ∈ I j g i G_j = \sum_{i \in I_j} g_i Gj=iIjgi H j = ∑ i ∈ I j h i H_j = \sum_{i \in I_j} h_i Hj=iIjhi,其中 G j G_j Gj 可以理解为叶子节点 j 所包含样本的一阶偏导数累加之和, H j H_j Hj 可以理解为叶子节点 j 所包含样本的二阶偏导数累加之和, G j G_j Gj H j H_j Hj均为常量。

G j G_j Gj H j H_j Hj 代入式(12-15),损失函数又可以变换为:
L ( t ) = ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T (12-16) L^{(t)} = \sum_{j=1}^{T} \left[G_j w_j + \frac{1}{2} (H_j + \lambda) w_j^2\right] + \gamma T \tag{12-16} L(t)=j=1T[Gjwj+21(Hj+λ)wj2]+γT(12-16)

对于每个叶子节点 j j j,将其从目标函数中单独取出:
G j w j + 1 2 ( H j + λ ) w j 2 (12-17) G_j w_j + \frac{1}{2} (H_j + \lambda) w_j^2 \tag{12-17} Gjwj+21(Hj+λ)wj2(12-17)

由前述推导可知, G j G_j Gj H j H_j Hj 相对于第 t t t 棵树来说是可以计算出来的。所以式(12-17)是一个只包含一个变量叶子节点权重 w j w_j wj 的一元二次函数,可根据最值公式求其最值点。当相互独立的每棵树的叶子节点都达到最优值时,整个损失函数也相应地达到最优。在树结构固定的情况下,对式(12-17)求导并令其为 0,可得最优点和最优值为:
w j ∗ = − G j H j + λ (12-18) w_j^* = -\frac{G_j}{H_j + \lambda} \tag{12-18} wj=Hj+λGj(12-18)

L = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T (12-19) L = -\frac{1}{2} \sum_{j=1}^{T} \frac{G_j^2}{H_j + \lambda} + \gamma T \tag{12-19} L=21j=1THj+λGj2+γT(12-19)

假设决策树模型在某个结点进行了特征分裂,分裂前的损失函数为:
L b e f o r e = − 1 2 [ ( G L + G R ) 2 H L + H R + λ ] + γ (12-20) L_{before} = -\frac{1}{2} \left[\frac{(G_L + G_R)^2}{H_L + H_R + \lambda}\right] + \gamma \tag{12-20} Lbefore=21[HL+HR+λ(GL+GR)2]+γ(12-20)

分裂后的损失函数为:
L a f t e r = − 1 2 [ G L 2 H L + λ + G R 2 H R + λ ] + 2 γ (12-21) L_{after} = -\frac{1}{2} \left[\frac{G_L^2}{H_L + \lambda} + \frac{G_R^2}{H_R + \lambda}\right] + 2\gamma \tag{12-21} Lafter=21[HL+λGL2+HR+λGR2]+2γ(12-21)

那么,分裂后的信息增益为:
G a i n = 1 2 [ G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ ] − γ (12-22) Gain = \frac{1}{2} \left[\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}\right] - \gamma \tag{12-22} Gain=21[HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2]γ(12-22)

如果增益 G a i n > 0 Gain > 0 Gain>0,即分裂为两个叶子节点后,目标函数下降了,则考虑此次分裂的结果。实际处理时需要遍历所有特征寻找最优分裂特征。

以上就是 XGBoost 相对完整的数学推导过程,核心是通过损失函数展开到二阶导数来进一步逼近真实损失。

猜你喜欢

转载自blog.csdn.net/u013172930/article/details/143490922