深度剖析集成学习Xgboost(续)

问题引入链接

对XGBoost来说,真正难度较大的部分并不是梳理以上算法流程,而是证明这一流程可以让模型向着目标函数最小化的方向运行。在这个流程中包括如下很明显的问题:

  1. 建树时拟合的 r i k = − g i k h i k r_{ik} = -\frac{g_{ik}}{h_{ik}} rik=hikgik究竟是什么?拟合它有什么意义?

  2. 结构分数和结构分数增益的公式是如何推导出来的?为什么这样建树可以提升模型的效果?

  3. 为什么叶子节点的输出值 w j w_j wj − ( ∑ i ∈ j g i k ) ∑ i ∈ j h i k + λ -\frac{(\sum_{i \in j} g_{ik})}{\sum_{i \in j} h_{ik} + \lambda} ijhik+λ(ijgik)?这样输出有什么意义?

  4. 课程的第一部分说XGBoost拟合的也是残差,残差在哪里?




定义目标函数与目标函数的自变量


首先,根据之前对目标函数的定义,XGBoost中目标函数是针对一棵树的目标函数,而不是针对一个样本或一整个算法的目标函数。并且,任意树的目标函数都包括三大部分:损失函数 l l l、叶子数量 T T T以及正则项。具体地来说:

假设单一树 f k f_k fk的目标函数为 O k O_k Ok,总共有 T T T片叶子,该树上任意样本 i i i的损失函数为 l ( ( y i , H ( x i ) ) l((y_i,H(x_i)) l((yi,H(xi)),其中 H ( x i ) H(x_i) H(xi) i i i号样本在集成算法上的预测结果。树上总共有M个样本,目标函数中使用L2正则化( λ \lambda λ不为0, α \alpha α为0),并且 γ \gamma γ不为0,则该树的目标函数为:

O k = ∑ i = 1 M l ( y i , H k ( x i ) ) + γ T + 1 2 λ ∑ j = 1 T w j 2 O_k = \sum_{i=1}^Ml(y_i,H_k(x_i)) + \gamma T + \frac{1}{2}\lambda\sum_{j=1}^Tw_j^2 Ok=i=1Ml(yi,Hk(xi))+γT+21λj=1Twj2

我们的目标是令目标函数最小,并找出令目标函数最小的某个自变量。对使用普通损失函数的Boosting算法来说,算法的输出值 H ( x ) H(x) H(x)是在迭代过程中不断变化的,损失函数 l ( y , H ( x ) ) l(y,H(x)) l(y,H(x))也是在迭代中不断变小的:

H k ( x i ) = H k − 1 ( x i ) + f k ( x i ) H_k(x_i) = H_{k-1}(x_i) + f_k(x_i) Hk(xi)=Hk1(xi)+fk(xi)

l k = l ( y i , H k − 1 ( x i ) + f k ( x i ) ) l_k = l(y_i,H_{k-1}(x_i) + f_k(x_i)) lk=l(yi,Hk1(xi)+fk(xi))

当迭代到第 k k k次时,损失函数中的 y i y_i yi H k − 1 ( x i ) H_{k-1}(x_i) Hk1(xi)都是常数,只有 f k ( x i ) f_k(x_i) fk(xi)是变量,因此我们只需要在损失函数上对 f k ( x i ) f_k(x_i) fk(xi)求导,并找到令整体损失函数最小的预测值 f k ( x i ) f_k(x_i) fk(xi)即可。在GBDT当中,我们提到过,无论弱评估器 f k f_k fk是什么结构、什么规则、如何建立、如何拟合,只要其最终的输出值 f k ( x i ) f_k(x_i) fk(xi)是令整体损失函数 L L L最小化的 f k ( x i ) f_k(x_i) fk(xi),那随着算法逐步迭代,损失函数必然会越来越小。因此,一个适合的 f k ( x i ) f_k(x_i) fk(xi)不仅能保证损失持续减小,还可以指导单个评估器的建立。

在XGBoost当中,我们也可以对目标函数求导、并找出令目标函数最小的某个自变量,但问题在于,XGBoost的目标函数中存在多个自变量:

O k = ∑ i = 1 M l ( y i , H k ( x i ) ) + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ i = 1 M l ( y i , H k − 1 ( x i ) + f k ( x i ) ) + γ T + 1 2 λ ∑ j = 1 T w j 2 \begin{aligned} O_k &= \sum_{i=1}^Ml(y_i,H_k(x_i)) + \gamma T + \frac{1}{2}\lambda\sum_{j=1}^Tw_j^2 \\ &= \sum_{i=1}^M l \left( y_i,H_{k-1}(x_i) + \boldsymbol{\color{red}{f_k(x_i)}} \right) + \gamma \boldsymbol{\color{red}T} + \frac{1}{2}\lambda\sum_{j=1}^T\boldsymbol{\color{red}{w_j}}^2 \end{aligned} Ok=i=1Ml(yi,Hk(xi))+γT+21λj=1Twj2=i=1Ml(yi,Hk1(xi)+fk(xi))+γT+21λj=1Twj2

其中, T T T是第 k k k棵树上的叶子总量, f k ( x i ) f_k(x_i) fk(xi) w j w_j wj都是模型输出的预测值(叶子上的输出值),不过表现形式不同,对任意位于叶子 j j j上的样本 i i i而言,数值上 f k ( x i ) = w j f_k(x_i) = w_j fk(xi)=wj。对XGBoost来说,只能选择一个变量作为自变量,考虑到 f k ( x i ) f_k(x_i) fk(xi)只与单个样本的精确程度有关,而 T T T只与树结构有关,XGBoost论文最终选择了即与精确度有关、又与树结构有关的变量 w j w_j wj。同时,如果知道叶子的最佳输出值 w j w_j wj就可以引导树成长为合理的结构,但只知道叶子的总量 T T T是无法指导建树的。

因此,求解XGBoost目标函数的第一步,就是将目标函数尽量整理成以 w j w_j wj表示的形式。



泰勒展开目标函数

在我们的目标函数 O k O_k Ok中,可以被泰勒展开的是第一部分损失函数 L L L

O k = ∑ i = 1 M l ( y i , H k − 1 ( x i ) + f k ( x i ) ) + γ T + 1 2 λ ∑ j = 1 T w j 2 O_k = \sum_{i=1}^Ml \left( y_i,H_{k-1}(x_i) + f_k(x_i) \right) + \gamma T + \frac{1}{2}\lambda\sum_{j=1}^T w_j^2 Ok=i=1Ml(yi,Hk1(xi)+fk(xi))+γT+21λj=1Twj2

由于损失函数 l l l中只有唯一变量 H k − 1 ( x i ) + f k ( x i ) H_{k-1}(x_i) + f_k(x_i) Hk1(xi)+fk(xi),因此可以将函数简写为 l ( H k − 1 ( x i ) + f k ( x i ) ) l(H_{k-1}(x_i) + f_k(x_i)) l(Hk1(xi)+fk(xi))

根据二阶泰勒展开,已知:

f ( x ) ≈ ∑ n = 0 2 f ( n ) ( a ) n ! ( x − a ) n ≈ f ( a ) + f ′ ( a ) 1 ! ( x − a ) + f ′ ′ ( a ) 2 ! ( x − a ) 2 \begin{aligned} f(x) &\approx \sum_{n=0}^{2}\frac{f^{(n)}(a)}{n!}(x-a)^n \\ &\approx f(a) + \frac{f'(a)}{1!}(x-a) + \frac{f''(a)}{2!}(x-a)^2 \end{aligned} f(x)n=02n!f(n)(a)(xa)nf(a)+1!f(a)(xa)+2!f′′(a)(xa)2

令泰勒展开中的 x = H k − 1 ( x i ) + f k ( x i ) x = H_{k-1}(x_i) + f_k(x_i) x=Hk1(xi)+fk(xi),令泰勒展开中的 a = H k − 1 ( x i ) a = H_{k-1}(x_i) a=Hk1(xi),则 ( x − a ) = f k ( x i ) (x-a) = f_k(x_i) (xa)=fk(xi)。据此,损失函数 l ( H k − 1 ( x i ) + f k ( x i ) ) l(H_{k-1}(x_i) + f_k(x_i)) l(Hk1(xi)+fk(xi))可以被表示为:

l ( H k − 1 ( x i ) + f k ( x i ) ) ≈ l ( H k − 1 ( x i ) ) + ∂ l ( H k − 1 ( x i ) ) ∂ H k − 1 ( x i ) ∗ f k ( x i ) + ∂ 2 l ( H k − 1 ( x i ) ) 2 ∂ H k − 1 2 ( x i ) ∗ f k 2 ( x i ) \begin{aligned} l(H_{k-1}(x_i) + f_k(x_i)) &\approx l(H_{k-1}(x_i)) + \frac{\partial{l(H_{k-1}(x_i))}}{\partial{H_{k-1}(x_i)}} * f_k(x_i) + \frac{\partial^2{l(H_{k-1}(x_i))}}{2\partial{H^2_{k-1}(x_i)}} * f^2_k(x_i)\\ \end{aligned} l(Hk1(xi)+fk(xi))l(Hk1(xi))+Hk1(xi)l(Hk1(xi))fk(xi)+2Hk12(xi)2l(Hk1(xi))fk2(xi)

在XGBoost中我们定义过损失函数的一阶导数与二阶导数:

g i k = ∂ l ( y i , H k − 1 ( x i ) ) ∂ H t − 1 ( x i ) g_{ik} = \frac{\partial{l(y_i,H_{k-1}(x_i))}}{\partial{H_{t-1}(x_i)}} gik=Ht1(xi)l(yi,Hk1(xi))

h i k = ∂ 2 l ( y i , H k − 1 ( x i ) ) ∂ H t − 1 2 ( x i ) h_{ik} = \frac{\partial^2{l(y_i,H_{k-1}(x_i))}}{\partial{H^2_{t-1}(x_i)}} hik=Ht12(xi)2l(yi,Hk1(xi))

在XGBoost原论文中,为了公式简洁, g i g_i gi h i h_i hi并没有呈现下标 k k k,但我们已经很清楚: g g g h h h是在每一轮迭代时需要被重新计算的。在这里我们也参照原论文中的做法去掉下标 k k k。因此,经过泰勒展开后的式子可以化简为:

l ( H k − 1 ( x i ) + f k ( x i ) ) ≈ l ( H k − 1 ( x i ) ) + g i f k ( x i ) + 1 2 h i f k 2 ( x i ) ≈ 常数 + g i f k ( x i ) + 1 2 h i f k 2 ( x i ) \begin{aligned}l(H_{k-1}(x_i) + f_k(x_i)) &\approx l(H_{k-1}(x_i)) + g_if_k(x_i) + \frac{1}{2}h_if^2_k(x_i) \\ &\approx 常数 + g_if_k(x_i) + \frac{1}{2}h_if^2_k(x_i) \end{aligned} l(Hk1(xi)+fk(xi))l(Hk1(xi))+gifk(xi)+21hifk2(xi)常数+gifk(xi)+21hifk2(xi)

不难发现,该式子中 H k − 1 ( x i ) H_{k-1}(x_i) Hk1(xi)是常数,因此第一部分 l ( H t − 1 ( x i ) ) l(H_{t-1}(x_i)) l(Ht1(xi))也是一个常数,常数无法被最小化,因此我们可以将常数从该目标函数中剔除。经过泰勒展开,目标函数变为:

O ~ k = ∑ i = 1 M ( g i f k ( x i ) + 1 2 h i f k 2 ( x i ) ) + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ i = 1 M g i f k ( x i ) + 1 2 ∑ i = 1 M h i f k 2 ( x i ) + γ T + 1 2 λ ∑ j = 1 T w j 2 \begin{aligned} \tilde{O}_k &= \sum_{i=1}^M\left(g_if_k(x_i) + \frac{1}{2}h_if^2_k(x_i)\right) + \gamma T + \frac{1}{2}\lambda\sum_{j=1}^T w_j^2 \\ &= \sum_{i=1}^Mg_if_k(x_i) + \frac{1}{2}\sum_{i=1}^Mh_if^2_k(x_i) + \gamma T + \frac{1}{2}\lambda\sum_{j=1}^T w_j^2\end{aligned} O~k=i=1M(gifk(xi)+21hifk2(xi))+γT+21λj=1Twj2=i=1Mgifk(xi)+21i=1Mhifk2(xi)+γT+21λj=1Twj2



统一自变量

现在目标函数的前两项分别代表所有样本的 g i f k ( x i ) g_if_k(x_i) gifk(xi)之和,以及所有样本的 h i f k 2 ( x i ) h_if^2_k(x_i) hifk2(xi)之和乘1/2。别忘记,我们选择的唯一的自变量是 w j w_j wj,因此我们希望能够将 f k f_k fk以某种方式转化为 w j w_j wj。之前已经提到过多次,对任意位于叶子 j j j上的样本 i i i而言,数值上 f k ( x i ) = w j f_k(x_i) = w_j fk(xi)=wj,我们可以尝试着从一个样本开始进行转化:

对于单一样本 i i i,假设这个样本位于叶子 j j j上,应该有:

g i f k ( x i ) = g i w j g_if_k(x_i) = g_iw_j gifk(xi)=giwj

对于一片叶子 j j j,我们可以计算这片叶子上所有样本的 g i w j g_iw_j giwj之和:

∑ i ∈ j g i w j \sum_{i \in j} g_iw_j ijgiwj

而一片叶子上所有样本的 w j w_j wj都是一致的,因此一片叶子上的 g i w j g_iw_j giwj之和可以转变为:

∑ i ∈ j g i w j = g 1 w j   +   g 2 w j   +   . . .   +   g n w j ,其中 1 , 2... n 是叶子 j 上的样本 = w j ∑ i ∈ j g i \begin{aligned}\sum_{i \in j} g_iw_j &= g_1w_j \ + \ g_2w_j \ + \ ... \ + \ g_nw_j,其中1,2...n是叶子j上的样本 \\ &= w_j\sum_{i \in j} g_i\end{aligned} ijgiwj=g1wj + g2wj + ... + gnwj,其中1,2...n是叶子j上的样本=wjijgi

假设现在一共有 T T T片叶子,则整棵树上所有样本的 g i w j g_iw_j giwj之和为:

∑ j = 1 T ( w j ∑ i ∈ j g i ) \sum_{j=1}^T \left( w_j\sum_{i \in j} g_i \right) j=1T(wjijgi)

所以:

∑ i = 1 M g i f k ( x i ) = ∑ j = 1 T ( w j ∑ i ∈ j g i ) \sum_{i=1}^Mg_if_k(x_i) = \sum_{j=1}^T \left( w_j\sum_{i \in j} g_i \right) i=1Mgifk(xi)=j=1T(wjijgi)

同理,单一样本 i i i h i f k 2 ( x i ) h_if^2_k(x_i) hifk2(xi)也可以以相同方式转化。对单一样本:

h i f k 2 ( x i ) = h i w j 2 h_if^2_k(x_i) = h_iw^2_j hifk2(xi)=hiwj2

对一片叶子:

∑ i ∈ j h i w j 2 = h 1 w j 2   +   h 2 w j 2   +   . . .   +   h n w j 2 ,其中 1 , 2... n 是叶子 j 上的样本 = w j 2 ∑ i ∈ j h i \begin{aligned}\sum_{i \in j}h_iw^2_j &= h_1w^2_j \ + \ h_2w^2_j \ + \ ... \ + \ h_nw^2_j,其中1,2...n是叶子j上的样本 \\ &= w^2_j\sum_{i \in j} h_i \end{aligned} ijhiwj2=h1wj2 + h2wj2 + ... + hnwj2,其中1,2...n是叶子j上的样本=wj2ijhi

对整棵树:

∑ i = 1 M h i f k 2 ( x i ) = ∑ j = 1 T ( w j 2 ∑ i ∈ j h i ) \sum_{i=1}^Mh_if^2_k(x_i) = \sum_{j=1}^T \left( w^2_j\sum_{i \in j} h_i \right) i=1Mhifk2(xi)=j=1T(wj2ijhi)

因此对整个目标函数有:

O ~ k = ∑ i = 1 M g i f k ( x i ) + 1 2 ∑ i = 1 M h i f k 2 ( x i ) + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ j = 1 T ( w j ∑ i ∈ j g i + 1 2 w j 2 ∑ i ∈ j h i ) + γ T + 1 2 λ ∑ j = 1 T w j 2 \begin{aligned} \tilde{O}_k &= \sum_{i=1}^Mg_if_k(x_i) + \frac{1}{2}\sum_{i=1}^Mh_if^2_k(x_i) + \gamma T + \frac{1}{2}\lambda\sum_{j=1}^T w_j^2 \\ &=\sum_{j=1}^T \left( w_j\sum_{i \in j} g_i + \frac{1}{2}w^2_j\sum_{i \in j} h_i \right) + \gamma T + \frac{1}{2}\lambda\sum_{j=1}^T w_j^2\end{aligned} O~k=i=1Mgifk(xi)+21i=1Mhifk2(xi)+γT+21λj=1Twj2=j=1T(wjijgi+21wj2ijhi)+γT+21λj=1Twj2

不难发现,现在正则项可以与原来损失函数的部分合并了:

= ∑ j = 1 T ( w j ∑ i ∈ j g i + 1 2 w j 2 ∑ i ∈ j h i + 1 2 λ w j 2 ) + γ T = ∑ j = 1 T ( w j ∑ i ∈ j g i + 1 2 w j 2 ( ∑ i ∈ j h i + λ ) ) + γ T \begin{aligned} &= \sum_{j=1}^T \left( w_j\sum_{i \in j} g_i + \frac{1}{2}w^2_j\sum_{i \in j} h_i + \frac{1}{2}\lambda w_j^2 \right) + \gamma T \\ &= \sum_{j=1}^T \left( w_j\sum_{i \in j} g_i + \frac{1}{2}w^2_j(\sum_{i \in j} h_i + \lambda) \right) + \gamma T\end{aligned} =j=1T(wjijgi+21wj2ijhi+21λwj2)+γT=j=1T(wjijgi+21wj2(ijhi+λ))+γT

合并之后,整个目标函数变为两项,一项是所有叶子上的(损失+正则)之和,另一项是叶子总量。现在,我们可以开始求解最小目标函数以及对应的最优自变量 w j w_j wj了。


求解XGBoost的目标函数

首先,令目标函数中的叶子总量最小是不可能的,过度降低叶子总量会大幅度伤害模型的学习能力,因此我们只能考虑令所有叶子上的(损失+正则)之和最小。

其次,当树建好之后,叶子与叶子之间是相互独立的,因此每片叶子上的(损失+正则)也是相互独立的。我们只要令每片叶子的(损失+正则)都最小,就可以保证全部叶子的(损失+正则)之和最小。故而,我们要令式子中标注为红色的部分最小:

O ~ k = ∑ j = 1 T ( w j ∑ i ∈ j g i + 1 2 w j 2 ( ∑ i ∈ j h i + λ ) ) + γ T \begin{aligned} \tilde{O}_k &= \sum_{j=1}^T \left( \boldsymbol{\color{red}{w_j\sum_{i \in j} g_i + \frac{1}{2}w^2_j(\sum_{i \in j} h_i + \lambda)}} \right) + \gamma T\end{aligned} O~k=j=1T wjijgi+21wj2(ijhi+λ) +γT

叶子权重 w j w_j wj
将标注为红色的部分命名为 μ j \mu_j μj,表示叶子 j j j上的损失+正则。则有:

μ j = w j ∑ i ∈ j g i + 1 2 w j 2 ( ∑ i ∈ j h i + λ ) \mu_j = w_j\sum_{i \in j} g_i + \frac{1}{2}w^2_j(\sum_{i \in j} h_i + \lambda) μj=wjijgi+21wj2(ijhi+λ)

现在,对叶子 j j j而言,在 μ j \mu_j μj上对唯一自变量 w j w_j wj求导,则有:

∂ μ j ∂ w j = ∂ w j ∑ i ∈ j g i + 1 2 w j 2 ( ∑ i ∈ j h i + λ ) ∂ w j = ∑ i ∈ j g i + w j ( ∑ i ∈ j h i + λ ) \begin{aligned}\frac{\partial{\mu_j}}{\partial w_j} &= \frac{\partial{w_j\sum_{i \in j} g_i + \frac{1}{2}w^2_j(\sum_{i \in j} h_i + \lambda)}}{\partial w_j} \\ \\ &= \sum_{i \in j} g_i + w_j(\sum_{i \in j} h_i + \lambda)\end{aligned} wjμj=wjwjijgi+21wj2(ijhi+λ)=ijgi+wj(ijhi+λ)

令一阶导数为0,则有:

∑ i ∈ j g i + w j ( ∑ i ∈ j h i + λ ) = 0 w j ( ∑ i ∈ j h i + λ ) = − ∑ i ∈ j g i w j = − ∑ i ∈ j g i ∑ i ∈ j h i + λ \begin{aligned} \sum_{i \in j} g_i + w_j(\sum_{i \in j} h_i + \lambda) &= 0 \\ \\ w_j(\sum_{i \in j} h_i + \lambda) &= -\sum_{i \in j} g_i \\ \\ w_j &= -\frac{\sum_{i \in j} g_i}{\sum_{i \in j} h_i + \lambda}\end{aligned} ijgi+wj(ijhi+λ)wj(ijhi+λ)wj=0=ijgi=ijhi+λijgi

你应该发现了,对一片叶子来说,令目标函数最小的 w j w_j wj就是我们之前提过的叶子权重,也就是XGBoost数学流程当中叶子上的输出值。如果要令叶子的输出非常接近叶子权重公式,那应该如何拟合每个样本呢?



拟合值

对任意位于叶子 j j j上的样本 i i i来说

μ i = w j g i + 1 2 w j 2 h i \mu_i = w_jg_i + \frac{1}{2}w^2_jh_i μi=wjgi+21wj2hi

将一片叶子上的 μ j \mu_j μj转变成 μ i \mu_i μi时,原则上需要将 μ j \mu_j μj中的每一项都转换为单个样本所对应的项,然而在转换正则项时则存在问题:与 ∑ i ∈ j g i \sum_{i \in j} g_i ijgi这样可以直接指向单个样本的项不同, λ \lambda λ是针对与一片叶子设置的值,如果要将 λ \lambda λ转变为针对单一样本的正则项,则需要知道当前叶子上一共有多少样本。然而,拟合发生在建树之前,因此在这一时间点不可能知道一片叶子上的样本总量,因此在xgboost的实际实现过程当中,拟合每一片叶子时不涉及正则项,只有在计算结构分数与叶子输出值时才使用正则项。

μ i \mu_i μi上唯一的自变量 w j w_j wj求导,则有:

∂ μ i ∂ w j = ∂ ( w j g i + 1 2 w j 2 h i ) ∂ w j = g i + w j h i \begin{aligned}\frac{\partial{\mu_i}}{\partial w_j} &= \frac{\partial{\left( w_jg_i + \frac{1}{2}w^2_jh_i \right)}}{\partial w_j} \\ \\ &= g_i + w_jh_i\end{aligned} wjμi=wj(wjgi+21wj2hi)=gi+wjhi

令一阶导数为0,则有:

g i + w j h i = 0 w j h i = − g i w j = − g i h i \begin{aligned} g_i + w_jh_i &= 0 \\ \\ w_jh_i &= - g_i \\ \\ w_j &= -\frac{g_i}{h_i} \end{aligned} gi+wjhiwjhiwj=0=gi=higi

对任意样本 i i i而言,令目标函数最小的最优 w j w_j wj就是我们的伪残差 r i r_i ri,也就是XGBoost数学流程当中用于进行拟合的拟合值



结构分数

现在,我们把令目标函数最小的最优 w j w_j wj带回到 μ j \mu_j μj中,查看 μ j \mu_j μj如何变化:

μ j = w j ∑ i ∈ j g i + 1 2 w j 2 ( ∑ i ∈ j h i + λ ) = − ∑ i ∈ j g i ∑ i ∈ j h i + λ ∗ ∑ i ∈ j g i + 1 2 ( − ∑ i ∈ j g i ∑ i ∈ j h i + λ ) 2 ∗ ∑ i ∈ j h i + λ = − ( ∑ i ∈ j g i ) 2 ∑ i ∈ j h i + λ + 1 2 ( ∑ i ∈ j g i ) 2 ∑ i ∈ j h i + λ = − 1 2 ( ∑ i ∈ j g i ) 2 ∑ i ∈ j h i + λ \begin{aligned} \mu_j &= w_j\sum_{i \in j} g_i + \frac{1}{2}w^2_j(\sum_{i \in j} h_i + \lambda) \\ &= -\frac{\sum_{i \in j} g_i}{\sum_{i \in j} h_i + \lambda} * \sum_{i \in j} g_i + \frac{1}{2}(-\frac{\sum_{i \in j} g_i}{\sum_{i \in j} h_i + \lambda})^2 * {\sum_{i \in j} h_i + \lambda}\\ &= -\frac{(\sum_{i \in j} g_i)^2}{\sum_{i \in j} h_i + \lambda} + \frac{1}{2}\frac{(\sum_{i \in j} g_i)^2}{\sum_{i \in j} h_i + \lambda} \\ &= - \frac{1}{2}\frac{(\sum_{i \in j} g_i)^2}{\sum_{i \in j} h_i + \lambda} \end{aligned} μj=wjijgi+21wj2(ijhi+λ)=ijhi+λijgiijgi+21(ijhi+λijgi)2ijhi+λ=ijhi+λ(ijgi)2+21ijhi+λ(ijgi)2=21ijhi+λ(ijgi)2

因此,目标函数(所有叶子上的损失)就可以变为:

O ~ k = ∑ j = 1 T ( w j ∑ i ∈ j g i + 1 2 w j 2 ( ∑ i ∈ j h i + λ ) ) + γ T = ∑ j = 1 T ( − 1 2 ( ∑ i ∈ j g i ) 2 ∑ i ∈ j h i + λ ) + γ T \begin{aligned} \tilde{O}_k &= \sum_{j=1}^T \left( \boldsymbol{\color{red}{w_j\sum_{i \in j} g_i + \frac{1}{2}w^2_j(\sum_{i \in j} h_i + \lambda)}} \right) + \gamma T \\ \\ &= \sum_{j=1}^T \left( -\frac{1}{2}\frac{(\sum_{i \in j} g_i)^2}{\sum_{i \in j} h_i + \lambda} \right) + \gamma T \end{aligned} O~k=j=1T wjijgi+21wj2(ijhi+λ) +γT=j=1T(21ijhi+λ(ijgi)2)+γT

因此,一片叶子上的目标函数就是:

O j = − 1 2 ( ∑ i ∈ j g i ) 2 ∑ i ∈ j h i + λ + γ O_j = -\frac{1}{2}\frac{(\sum_{i \in j} g_i)^2}{\sum_{i \in j} h_i + \lambda} + \gamma Oj=21ijhi+λ(ijgi)2+γ

对任意一片叶子来说,目标函数可以衡量叶子的质量,其中 γ \gamma γ是可以设定的超参数, 1 2 \frac{1}{2} 21为常数,因此对任意叶子,我们希望标注为红色的部分越小越好:

O j = 1 2 ( − ( ∑ i ∈ j g i ) 2 ∑ i ∈ j h i + λ ) + γ O_j = \frac{1}{2}\left( \boldsymbol{\color{red}{-\frac{(\sum_{i \in j} g_i)^2}{\sum_{i \in j} h_i + \lambda}}} \right)+ \gamma Oj=21(ijhi+λ(ijgi)2)+γ

故而,我们希望以下式子越大越好:

( ∑ i ∈ j g i ) 2 ∑ i ∈ j h i + λ \frac{(\sum_{i \in j} g_i)^2}{\sum_{i \in j} h_i + \lambda} ijhi+λ(ijgi)2

这个式子,正是XGBoost用于分枝时的指标“结构分数”(Structure Score)



结构分数的增益

当分枝的时候,我们希望目标函数越小越好,因此在分枝过程中,父节点的目标函数是大于子节点的目标函数的,因此我们可以使用(父节点目标函数 - 子节点目标函数之和)来衡量分枝的质量,则有:

G a i n = O p − ( O l + O r ) = − 1 2 ( ∑ i ∈ P g i ) 2 ∑ i ∈ P h i + λ + γ − ( − 1 2 ( ∑ i ∈ L g i ) 2 ∑ i ∈ L h i + λ + γ − 1 2 ( ∑ i ∈ R g i ) 2 ∑ i ∈ R h i + λ + γ ) = − 1 2 ( ∑ i ∈ P g i ) 2 ∑ i ∈ P h i + λ + γ + 1 2 ( ∑ i ∈ L g i ) 2 ∑ i ∈ L h i + λ − γ + 1 2 ( ∑ i ∈ R g i ) 2 ∑ i ∈ R h i + λ − γ = 1 2 ( ( ∑ i ∈ L g i ) 2 ∑ i ∈ L h i + λ + ( ∑ i ∈ R g i ) 2 ∑ i ∈ R h i + λ − ( ∑ i ∈ P g i ) 2 ∑ i ∈ P h i + λ ) − γ = 1 2 ( S c o r e L + S c o r e R − S c o r e P ) − γ \begin{aligned} Gain &= O_p - (O_l + O_r) \\ \\ &= -\frac{1}{2}\frac{(\sum_{i \in P} g_i)^2}{\sum_{i \in P} h_i + \lambda} + \gamma - (-\frac{1}{2}\frac{(\sum_{i \in L} g_i)^2}{\sum_{i \in L} h_i + \lambda} + \gamma -\frac{1}{2}\frac{(\sum_{i \in R} g_i)^2}{\sum_{i \in R} h_i + \lambda} + \gamma) \\ \\ &= -\frac{1}{2}\frac{(\sum_{i \in P} g_i)^2}{\sum_{i \in P} h_i + \lambda} + \gamma + \frac{1}{2}\frac{(\sum_{i \in L} g_i)^2}{\sum_{i \in L} h_i + \lambda} - \gamma + \frac{1}{2}\frac{(\sum_{i \in R} g_i)^2}{\sum_{i \in R} h_i + \lambda} - \gamma \\ \\ &= \frac{1}{2}\left( \frac{(\sum_{i \in L} g_i)^2}{\sum_{i \in L} h_i + \lambda} + \frac{(\sum_{i \in R} g_i)^2}{\sum_{i \in R} h_i + \lambda} - \frac{(\sum_{i \in P} g_i)^2}{\sum_{i \in P} h_i + \lambda} \right) - \gamma \\ \\ &= \frac{1}{2} (Score_L + Score_R - Score_P) - \gamma \end{aligned} Gain=Op(Ol+Or)=21iPhi+λ(iPgi)2+γ(21iLhi+λ(iLgi)2+γ21iRhi+λ(iRgi)2+γ)=21iPhi+λ(iPgi)2+γ+21iLhi+λ(iLgi)2γ+21iRhi+λ(iRgi)2γ=21(iLhi+λ(iLgi)2+iRhi+λ(iRgi)2iPhi+λ(iPgi)2)γ=21(ScoreL+ScoreRScoreP)γ

其中, γ \gamma γ是可以设定的超参数, 1 2 \frac{1}{2} 21为常数,因此:

G a i n = S c o r e L + S c o r e R − S c o r e P Gain = Score_L + Score_R - Score_P Gain=ScoreL+ScoreRScoreP

这就是我们在分枝时所使用的结构分数增益了

现在你发现了,XGBoost流程中所使用的全部新公式(包括独特的拟合值、独特的分枝指标、独特的输出值)都是通过令目标函数最小而求解出来的。因此,XGBoost整个流程就保证了目标函数一定是向着最小化方向进行迭代的,新生成的每片叶子上的输出值 w j w_j wj都是会令目标函数最小化的输出值。现在,你可以回答最开始的问题了

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「 25' h 」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值