XGBoost原理与实例分析

这几天一直在研究XGboost的基本原理与代码调参,其原理是在GBDT的基础上进行优化,但也有很多的不同之处;所以自己准备更新两篇博客分为XGBoost原理与实例XGBoost实战与调参优化来巩固这方面的知识。

一、XGBoost原理分析

在机器学习的问题中,目标函数(objective function)随处可见,目标函数一般由损失函数+正则化项。

                               O b j ( Θ ) = L ( Θ ) + Ω ( Θ ) \boldsymbol{Obj(\Theta)=L(\Theta)+\Omega(\Theta)} Obj(Θ)L(Θ)+Ω(Θ)

L ( Θ ) L(\Theta) L(Θ)(损失函数):用于描述模型拟合数据的程度;
Ω ( Θ ) \Omega(\Theta) Ω(Θ)(正则化项):用于描述模型复杂度的程度。

  • 训练数据的损失函数: L = Σ i = 1 n l ( y i , y i ^ ) L=\Sigma_{i=1}^nl(y_i,\hat{y_i}) L=Σi=1nl(yi,yi^),如:
    • Square loss: l ( y i , y i ^ ) = ( y i − y i ^ ) 2 l(y_i,\hat{y_i})=(y_i-\hat{y_i})^2 l(yi,yi^)=(yiyi^)2
    • Logistic loss: l ( y i , y i ^ ) = y i ln ⁡ ( y i ^ ) + ( 1 − y i ) ln ⁡ ( 1 − y i ^ ) l(y_i,\hat{y_i})=y_i\ln(\hat{y_i})+(1-y_i)\ln({1-\hat{y_i}}) l(yi,yi^)=yiln(yi^)+(1yi)ln(1yi^)
  • 正则化项:
    • L 2 L2 L2  norm: Ω ( ω ) = λ ∥ ω ∥ 2 \Omega(\omega)=\lambda\left \|\omega \right \|_2 Ω(ω)=λω2
      • ( L 2 L2 L2正则化是指权值向量 ω \omega ω各个元素的平方和然后再求根号;可以防止模型过拟合overfitting)
    • L 1 L1 L1  norm: Ω ( ω ) = λ ∥ ω ∥ 1 \Omega(\omega)=\lambda\left \|\omega \right \|_1 Ω(ω)=λω1
      • L 1 L1 L1正则化是指权值向量 ω \omega ω各个元素的绝对值之和;通常能产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择,一定程度上也能防止过拟合)

若想对正则化有一个较为清晰的理解,请参考博客机器学习中正则化项L1和L2的直观理解


我们训练的基学习器是CART回归树,因此模型的复杂度与树的深度叶子结点的个数叶子结点的输出值(XGBoost里称为叶子结点的权值)有关。那么假设我们有 T T T颗树,那么模型的输出值为:
                               y i ^ = Σ t = 1 T f t ( x i ) \hat{y_i}=\Sigma_{t=1}^{T}f_t(x_i) yi^=Σt=1Tft(xi)
因为每一棵的参数包括它的结构与叶子结点的值,所以我们不妨将每一颗树 f t f_t ft作为参数来进行优化,因此我们可以表示为 Ω = { f 1 , f 2 , f 3 , . . . , f T } \Omega=\left \{f_1,f_2,f_3,...,f_T \right \} Ω={f1,f2,f3,...,fT},所以我们的目标函数现在可以改写为:

                               O b j = Σ i = 1 n l ( y i , y i ^ ) + Σ t = 1 T Θ ( f t ) Obj=\Sigma_{i=1}^{n}l(y_i,\hat{y_i})+\Sigma_{t=1}^T\Theta(f_t) Obj=Σi=1nl(yi,yi^)+Σt=1TΘ(ft)

现在的问题是我们如何训练目标函数,学习基学习器,当然,XGBoost既然是GBDT的优化,自然大部分的思想是相通的,所以我们也采用前向分布算法(additive model),即我们把学习的过程分解为先学习第一颗树,然后基于学习好的第一颗树再去学习第二棵树,以此类推,直到通过第 t − 1 t-1 t1颗树来学习第 T T T颗树为止…

                               y i ^ 0 = c o n s t a n t \hat{y_{i}}^0=constant yi^0=constant

                               y i ^ 1 = y i ^ 0 + f 1 ( x i ) \hat{y_{i}}^1=\hat{y_{i}}^0+f_1(x_i) yi^1=yi^0+f1(xi)

                               y i ^ 2 = y i ^ 1 + f 2 ( x i ) \hat{y_{i}}^2=\hat{y_{i}}^1+f_2(x_i) yi^2=yi^1+f2(xi)

                               y i ^ 3 = y i ^ 2 + f 3 ( x i ) \hat{y_{i}}^3=\hat{y_{i}}^2+f_3(x_i) yi^3=yi^2+f3(xi)

                              …

                               y i ^ T = y i ^ T − 1 + f T ( x i ) \hat{y_{i}}^T=\hat{y_{i}}^{T-1}+f_T(x_i) yi^T=yi^T1+fT(xi)

假设我们预测第 T T T轮,有:

                               y i ^ T = y i ^ T − 1 + f T ( x i ) \hat{y_{i}}^T={\color{Blue} \hat{y_{i}}^{T-1}}+{\color{Red}f_T(x_i) } yi^T=yi^T1+fT(xi)
注意,上式中蓝色是一个定值,而红色的树是我们这轮要决定的,即我们要找到这样一个树,使下面的目标函数最小:

O b j ( T ) = Σ i = 1 n l ( y i , y i ^ T ) + Σ t = 1 T Ω ( f t ) Obj^{(T)}=\Sigma_{i=1}^{n}l(y_i,\hat{y_i}^T)+\Sigma_{t=1}^T\Omega(f_t) Obj(T)=Σi=1nl(yi,yi^T)+Σt=1TΩ(ft)

                = Σ i = 1 n l ( y i , y i ^ T − 1 + f T ( x i ) ) + Ω ( f t ) + c o n s t a n t =\Sigma_{i=1}^nl(y_i,\hat{y_{i}}^{T-1}+f_T(x_i))+\Omega(f_t)+constant =Σi=1nl(yi,yi^T1+fT(xi))+Ω(ft)+constant
那么我们如何找到这颗最优树呢?在GBDT中,我们采用启发式的思想,以平均最小误差为准则,用负梯度的值来近似代替残差,拟合一个回归树。而在XGBoost中,是通过对损失函数进行二阶泰勒公式展开的思想,回顾一下二阶泰勒公式:
                               f ( x + Δ x ) ≃ f ( x ) + f ′ ( x ) Δ x + 1 2 f ′ ′ ( x ) Δ x 2 f(x+\Delta x)\simeq f(x)+ {f}'(x)\Delta x+\frac{1}{2}{f}''(x)\Delta x_2 f(x+Δx)f(x)+f(x)Δx+21f(x)Δx2
那么对损失函数进行二阶泰勒公式展开:

Σ i = 1 n l ( y i , y i ^ T − 1 + f T ( x i ) ) = Σ i = 1 n [ l ( y i , y i ^ T − 1 ) + l ′ ( y i , y i ^ T − 1 ) f T ( x i ) + 1 2 l ′ ′ ( y i , y i ^ T − 1 ) f T 2 ( x i ) ] \Sigma_{i=1}^{n}l(y_i,\hat{y_{i}}^{T-1}+f_T(x_i))= \Sigma_{i=1}^{n}\left [ l(y_i,\hat{y_{i}}^{T-1})+{l}'(y_i,\hat{y_{i}}^{T-1})f_T(x_i)+\frac{1}{2}{l}''(y_i,\hat{y_{i}}^{T-1})f_{T}^2(x_i) \right ] Σi=1nl(yi,yi^T1+fT(xi))=Σi=1n[l(yi,yi^T1)+l(yi,yi^T1)fT(xi)+21l(yi,yi^T1)fT2(xi)]

另:
                               g i = l ′ ( y i , y i ^ T − 1 ) {\color{Red}g_i={l}'(y_i,\hat{y_{i}}^{T-1})} gi=l(yi,yi^T1), h i = l ′ ′ ( y i , y i ^ T − 1 ) {\color{Red}h_i={l}''(y_i,\hat{y_{i}}^{T-1}) } hi=l(yi,yi^T1)
则目标函数可表示为:
O b j ( T ) = Σ i = 1 n [ l ( y i , y i ^ T − 1 ) + g i f T ( x i ) + h i f T 2 ( x i ) ] + Ω ( f t ) + c o n s t a n t Obj^{(T)}=\Sigma_{i=1}^{n}\left [l(y_i,\hat{y_{i}}^{T-1})+g_if_T(x_i)+h_if_{T}^2(x_i) \right ]+\Omega(f_t)+constant Obj(T)=Σi=1n[l(yi,yi^T1)+gifT(xi)+hifT2(xi)]+Ω(ft)+constant
去除常数项,目标函数可简化为:
                               O b j ( T ) = Σ i = 1 n [ g i f T ( x i ) + h i f T 2 ( x i ) ] + Ω ( f t ) Obj^{(T)}=\Sigma_{i=1}^{n}\left [g_if_T(x_i)+h_if_{T}^2(x_i) \right ]+\Omega(f_t) Obj(T)=Σi=1n[gifT(xi)+hifT2(xi)]+Ω(ft)

回想一下GBDT中如何选取划分点的呢?GBDT是用平方误差最小化准则来选取最佳划分点,换句话说,无论我们选取哪种损失函数(平方损失、对数损失、指数损失、0-1损失、绝对损失等),寻找划分点的方法是不变的,即我们选取得损失函数对划分点的选取没有取到干涉作用,从直观上理解,这显然是GBDT的不足之处;因此,我们之所以花费那么大的努力将损失函数二阶泰勒展开,是将损失函数对划分点的选取起到干涉的作用。

接下来,我们定义叶节点的权值(输出值)函数:

f t ( x ) = w q ( x ) , w ∈ R T , q : R d → { 1 , 2 , 3 , . . . , T } f_t(x)=w_{q(x)},w\in R^T , q:R^d \rightarrow\left \{ 1,2,3,...,T \right \} ft(x)=wq(x),wRT,q:Rd{1,2,3,...,T}


权值解释图

上图的 q ( x ) q(x) q(x)是叶子结点的编号函数,把一个样本输入到 q ( x ) q(x) q(x)中,那么输出值就为该样本所在的叶子编号,例如上图中有5个人物,衣服颜色各不相同,若我们将蓝色人物输入 q ( x ) q(x) q(x)中,那么输出的结果为1,说明蓝色人物所在的叶子结点编号为1,那么蓝色人物的权值就是 w q ( 蓝 色 人 物 ) = w 1 = 2 w_{q(蓝色人物)}=w_{1}=2 wq()=w1=2.

有了这样的思路,那么我就可以将正则化引入到树的复杂度上去了,在一个基学习器(CART)中,影响其复杂度的因素主要有叶子结点数叶子的权值,因此我们树复杂度函数可以写为:

Ω ( f t ) = γ T + 1 2 λ Σ j = 1 T w j 2 \Omega(f_t)={\color{Red}\gamma T }+{\color{Blue}\frac{1}{2}\lambda \Sigma_{j=1}^{T}w^{2}_{j} } Ω(ft)=γT+21λΣj=1Twj2

上式中,红色的式子表示对叶节点数 T T T复杂度的惩罚项,蓝色的式子表示对叶节点权值的 L 2 L2 L2正则化,下图对该树的复杂度的计算做出简要解释:

树复杂度解释

假设上图是 t t t颗树,其叶节点的个数 T = 3 T=3 T=3 w 1 = 2 , w 2 = 0.1 , w 3 = − 1 w_1=2,w_2=0.1,w_3=-1 w1=2,w2=0.1,w3=1,带入上面公式得:

Ω = γ ∗ 3 + 1 2 λ ( 4 + 0.01 + 1 ) \Omega=\gamma *3 + \frac{1}{2}\lambda (4+0.01+1) Ω=γ3+21λ(4+0.01+1)

定义叶子结点 j j j的样本集合为:
I j = { i ∣ q ( x i ) = j } I_j=\left \{i\mid q(x_i)=j \right \} Ij={iq(xi)=j}

这时,目标函数可以改写为:

O b j ( T ) = Σ i = 1 n [ g i f T ( x i ) + h i f T 2 ( x i ) ] + Ω ( f t ) Obj^{(T)}=\Sigma_{i=1}^{n}\left [g_if_T(x_i)+h_if_{T}^2(x_i) \right ]+\Omega(f_t) Obj(T)=Σi=1n[gifT(xi)+hifT2(xi)]+Ω(ft)

          = Σ i = 1 n [ g i w q ( x i ) + h i w q ( x i ) 2 ] + γ T + 1 2 λ Σ j = 1 T w j 2 =\Sigma_{i=1}^{n}\left [g_iw_{q(x_i)}+h_iw^2_{q(x_i)} \right ]+\gamma T+\frac{1}{2}\lambda \Sigma_{j=1}^{T}w^{2}_{j} =Σi=1n[giwq(xi)+hiwq(xi)2]+γT+21λΣj=1Twj2

          = Σ j = 1 T [ Σ i ∈ I j g i w j + Σ i ∈ I j h i w j 2 + 1 2 λ w j 2 ] + γ T =\Sigma_{j=1}^T\left [\Sigma_{i\in I_j} g_iw_j+\Sigma_{i\in I_j}h_iw^{2}_{j}+\frac{1}{2}\lambda w^{2}_{j} \right ]+\gamma T =Σj=1T[ΣiIjgiwj+ΣiIjhiwj2+21λwj2]+γT

          = Σ j = 1 T [ Σ i ∈ I j g i w j + ( Σ i ∈ I j h i + 1 2 λ ) w j 2 ] + γ T =\Sigma_{j=1}^T\left [\Sigma_{i\in I_j} g_iw_j+(\Sigma_{i\in I_j}h_i+\frac{1}{2}\lambda)w^{2}_{j} \right ]+\gamma T =Σj=1T[ΣiIjgiwj+(ΣiIjhi+21λ)wj2]+γT

          = Σ j = 1 T [ G j w j + ( H j + 1 2 λ ) w j 2 ] + γ T {\color{Orange}=\Sigma_{j=1}^T\left [G_jw_j+(H_j+\frac{1}{2}\lambda)w^{2}_{j} \right ]+\gamma T } =Σj=1T[Gjwj+(Hj+21λ)wj2]+γT

其中定义:

G j = Σ i ∈ I j g i , H j = Σ i ∈ I j h i {\color{red}G_j= \Sigma_{i\in I_j} g_i,H_j=\Sigma_{i\in I_j}h_i} Gj=ΣiIjgi,Hj=ΣiIjhi

现在我们要找到最佳的 w j w_j wj使得上面的橙色式子最小,这个问题等价于下面简单的求导、找最值的例子:

a r g m i n x G x + 1 2 H x 2 = − G H argmin_x Gx+\frac{1}{2}Hx^2=-\frac{G}{H} argminxGx+21Hx2=HG

m i n x G x + 1 2 H x 2 = − 1 2 G 2 H min_xG_x+\frac{1}{2}Hx^2=-\frac{1}{2}\frac{G^2}{H} minxGx+21Hx2=21HG2

与上面例子类似,如果我们假设叶子结点已经确定,那么每个叶节点的最优权值与目标函数的最优解分别为:

w j ∗ = − G j H J + λ w_j^{*}=-\frac{G_j}{H_J+\lambda} wj=HJ+λGj

O b j = − 1 2 Σ j = 1 T G j 2 H j + λ + γ T Obj=-\frac{1}{2}\Sigma_{j=1}^{T}\frac{G_j^{2}}{H_j+\lambda} +\gamma T Obj=21Σj=1THj+λGj2+γT

下图展示了叶节点权值与目标函数的计算过程:

权值与目标函数计算例子


回顾下GBDT对划分点分类的方法,无论选取哪个损失函数,都是用平方误差最小准则划分,但XGBoost是计算增益来找最优划分点,并且划分的准则是与选取的损失函数相关的,划分时,对树的每个叶子结点尝试着去划分,然后由下面给出的增益准则决定是否划分该结点!


划分的增益准则为:

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 + λ ] − γ Gain=\frac{1}{2}\left [{\color{Red} \frac{G_{L}^2}{H_L+\lambda}}+{\color{Blue} \frac{G_{R}^2}{H_R+\lambda}}-{\color{Green} \frac{(G_L+G_R)^2}{H_L+H_R+\lambda} } \right ]-{\color{Magenta} \gamma} Gain=21[HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2]γ

红色式子表示:划分后左叶子结点的分值
蓝色式子表示:划分后右叶子结点的分值
绿色式子表示:划分前该结点的分值
粉色式子表示:将该结点划分为叶子结点的复杂度代价

上式其实就是说划分前的得分与划分后的得分谁大,而 λ \lambda λ相当于阈值,若划分后与划分前的差值大于 λ \lambda λ,那么就划分;若划分后与划分前的差值小于 λ \lambda λ,那么就不进行划分。比如说,我们以年龄是否小于a对上面的图例进行划分,那么规则如下图:

划分解释图

接下来就是枚举所有可能得划分点,重复上面的操作,然后划分叶子结点的样本集合,这就是XGboost的基本原理,实际上其步骤主要分为这么几步:

  1. 损失函数后加入正则化项;
  2. 将损失函数二阶泰勒公式展开;
  3. 根据增益准则划分结点,构建 T T T颗树。

XGBoost的算法流程总结如下:

1、精确贪婪划分点查找算法

精确算法流程图
解释说明:

  1. m m m为当前结点中样本特征个数;
  2. 第二个for 循环为:遍历由第 k k k个特征的第 j j j个特征值排序后的样本编号,计算 G a i n Gain Gain

2、寻找划分点的近似算法

如果样本很大,穷举其特征与特征值的暴力算法显然不是一个好方法,因此近似算法流程图如下:

近似算法流程图

解释说明:

  1. 第一个for循环是根据第 k k k个特征的百分比推荐该特征下的候选划分点集合 S k S_k Sk;
  2. 第二个for循环就是计算 G k , H k G_k,H_k Gk,Hk,然后去精确贪婪一样计算 G a i n Gain Gain

至于推荐划分点的具体流程,我看了论文,也是有些不懂,如果有兴趣的小伙伴可以参考这篇文章


3、稀疏感知划分查找(缺失值的划分)

在现实生活中,我们输入的样本矩阵$X往往是稀疏的,出现这种现象的原因主要为:

  1. 数据中缺失值的普遍存在
  2. 对离散特征进行独热编码处理
  3. 统计中经常零项

因此,XGBoost在每个树结点都建议一个默认的方向,当稀疏矩阵 X X X存在缺失值时,将该样本分类为默认方向,每一个结点有2个默认方向,XGBoost从数据中习得最佳的方向,然后将该样本划入最佳结点中,具体流程算法如下:

缺失值划分算法

解释说明:

  1. 输入的样本集合有俩个分别为 I I I(包含缺失值的样本集合)与 I k I_k Ik(不包含缺失值的样本集合),并在循环之前计算 I I I的总 G 、 H G、H GH,当然也包含缺失值样本。
  2. 内嵌的第一个for循环是将缺失值的样本放入右结点,那么首先按特征值 x k x_k xk升序,然后遍历 I k I_k Ik中的编号,将大于 j j j的样本放入左节点,我们发现缺失值的样本因为始终没有在 I k I_k Ik中,因此每次都将其放在右节点!
  3. 第二个for循环类似!

二、XGBoost实例演练

上面的算法流程有些抽象,所以我们还是以实例来一步一步的实现XGBoost,数据集如下表:

IDx1x2y
11-50
2250
33-21
4121
5201
66-51
7751
86-20
9720
10601

数据集中有10个样本,两个特征 x 1 , x 2 x1,x2 x1,x2,为了简单起见,我们预定义树的深度为1(max_depth=1),树的颗数为2(num_boost_round=2),学校率为0.1(eta=0.1),正则化参数 λ = 1 , γ = 0 \lambda=1,\gamma=0 λ=1,γ=0,损失函数(logloss)。


我们选取的损失函数为:

l ( y i , y i ^ ) = y i ln ⁡ ( 1 + e − y i ^ ) + ( 1 − y i ) ln ⁡ ( 1 + e y i ˉ ) l(y_i,\hat{y_i})=y_i\ln(1+e^{-\hat{y_i}})+(1-y_i)\ln(1+e^{\bar{y_i}}) l(yi,yi^)=yiln(1+eyi^)+(1yi)ln(1+eyiˉ)

注意:这里的 y i ^ \hat{y_i} yi^是没有映射为概率的原始值,即

y i ^ = ω T ∗ x i + b \hat{y_i}=\omega^T*x_i+b yi^=ωTxi+b;

那么映射后,预测为1的概率为:

P 1 i = 1 1 + e − y i ^ {\color{Red}P_{1i}=\frac{1}{1+e^{-\hat{y_i}}} } P1i=1+eyi^1

后面我们需要用到logloss的一阶、二阶导数,有必要先写出其导数:

g i = l ′ ( y i , y i ^ ) = P 1 i − y i g_i={l}'(y_i,\hat{y_i})=P_{1i}-y_i gi=l(yi,yi^)=P1iyi;

h i = l ′ ′ ( y i , y i ^ ) = P 1 i ( 1 − P 1 i ) h_i={l}''(y_i,\hat{y_i})=P_{1i}(1-P_{1i}) hi=l(yi,yi^)=P1i(1P1i)


下面我们利用XGboost拟合数据集

1、生成第一颗树

回顾我们上面的原理分析,对该结点是否划分的准则是计算增益:

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 + λ ] − γ Gain=\frac{1}{2}\left [{\color{Red} \frac{G_{L}^2}{H_L+\lambda}}+{\color{Blue} \frac{G_{R}^2}{H_R+\lambda}}-{\color{Green} \frac{(G_L+G_R)^2}{H_L+H_R+\lambda} } \right ]-{\color{Magenta} \gamma} Gain=21[HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2]γ

那么在求 G L , G R G_L,G_R GL,GR时需要用到上一颗树的预测值,也就是我们在GBDT中一样的初始值,在XGBoost用base_score表示初始值,默认为base_score=0.5

值得一提的是,base_score是一个经过映射后的值,可以理解为预测为1的概率值,因为在建立第二颗树时会用到,所以应该留意此处。

对每一个样本求出其一阶、二阶导数的值:

ID12345678910
g i g_i gi0.50.5-0.5-0.5-0.5-0.5-0.50.50.5-0.5
h i h_i hi0.250.250.250.250.250.250.250.250.250.25

计算步骤如下:
对于ID=1的样本(其他样本计算类似)

g 1 = l ′ ( y 1 , y 1 ^ ) = P 11 − y 1 = 0.5 − 0 = 0.5 g_1={l}'(y_1,\hat{y_1})=P_{11}-y_1=0.5-0=0.5 g1=l(y1,y1^)=P11y1=0.50=0.5;
h 1 = l ′ ′ ( y 1 , y 1 ^ ) = P 11 ( 1 − P 11 ) = 0.5 ( 1 − 0.5 ) = 0.25 h_1={l}''(y_1,\hat{y_1})=P_{11}(1-P_{11})=0.5(1-0.5)=0.25 h1=l(y1,y1^)=P11(1P11)=0.510.5=0.25


接下来我们需要在特征x1、x2中寻找最佳划分点.

以x1为例:我们需要将x1的特征值从小到大排列,一共有 { 1 , 2 , 3 , 6 , 7 } \left \{ 1,2,3,6,7\right \} {1,2,3,6,7} 5中取值。

当以特征值为1作为划分点时(x1<1):
左子树集合为 I l e f t = { } I_{left}=\left \{ \right \} Ileft={}
右子树集合为 I r i g h t = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } I_{right}=\left \{ 1,2,3,4,5,6,7,8,9,10\right \} Iright={12345678910}
计算 G L = Σ i ∈ I l e f t g i = 0 G_L=\Sigma_{i\in I_{left}}g_i=0 GL=ΣiIleftgi=0(因为左子树为空集)
计算 H L = Σ i ∈ I l e f t h i = 0 H_L=\Sigma_{i\in I_{left}}h_i=0 HL=ΣiIlefthi=0
计算 G R = Σ i ∈ I r i g h t g i = − 1 G_R=\Sigma_{i\in I_{right}}g_i=-1 GR=ΣiIrightgi=1
计算 H R = Σ i ∈ I r i g h t h i = 2.5 H_R=\Sigma_{i\in I_{right}}h_i=2.5 HR=ΣiIrighthi=2.5

最后计算增益:

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 + λ ] − γ = 0 Gain=\frac{1}{2}\left [{\color{Red} \frac{G_{L}^2}{H_L+\lambda}}+{\color{Blue} \frac{G_{R}^2}{H_R+\lambda}}-{\color{Green} \frac{(G_L+G_R)^2}{H_L+H_R+\lambda} } \right ]-{\color{Magenta} \gamma}=0 Gain=21[HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2]γ=0

这是显然的,因为左子树是空集,相当于没有对数据集进行划分


当以特征值为2作为划分点时(x1<2):

左子树集合为 I l e f t = { 1 , 4 } I_{left}=\left \{ 1,4\right \} Ileft={14}
右子树集合为 I r i g h t = { 2 , 3 , 5 , 6 , 7 , 8 , 9 , 10 } I_{right}=\left \{ 2,3,5,6,7,8,9,10\right \} Iright={235678910}
计算 G L = Σ i ∈ I l e f t g i = 0 G_L=\Sigma_{i\in I_{left}}g_i=0 GL=ΣiIleftgi=0

计算 H L = Σ i ∈ I l e f t h i = 0.5 H_L=\Sigma_{i\in I_{left}}h_i=0.5 HL=ΣiIlefthi=0.5
计算 G R = Σ i ∈ I r i g h t g i = − 1 G_R=\Sigma_{i\in I_{right}}g_i=-1 GR=ΣiIrightgi=1
计算 H R = Σ i ∈ I r i g h t h i = 2 H_R=\Sigma_{i\in I_{right}}h_i=2 HR=ΣiIrighthi=2

最后计算增益:

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 + λ ] − γ = 0.023809 Gain=\frac{1}{2}\left [{\color{Red} \frac{G_{L}^2}{H_L+\lambda}}+{\color{Blue} \frac{G_{R}^2}{H_R+\lambda}}-{\color{Green} \frac{(G_L+G_R)^2}{H_L+H_R+\lambda} } \right ]-{\color{Magenta} \gamma}=0.023809 Gain=21[HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2]γ=0.023809

依次算出x1的各个特征值的参数,如下表:

Split_point12367
G L G_L GL000-0.5-1.0
H L H_L HL00.51.01.252.5
G R G_R GR-1.0-1.0-1.0-0.50.0
H R H_R HR2.521.51.250.0
G a i n Gain Gain0.00.0238090.057142-0.0317460.0

因此x1的特征下的最佳划分点为x1<3,此时得到的增益最大。


若以x2为例:x2的可能取值排序为 { − 5 , − 2 , 0 , 2 , 5 } \left \{ -5,-2,0,2,5\right \} {52025}

当以特征值为-5作为划分点时(x2<-5):

左子树集合为 I l e f t = { } I_{left}=\left \{ \right \} Ileft={}
右子树集合为 I r i g h t = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } I_{right}=\left \{ 1,2,3,4,5,6,7,8,9,10\right \} Iright={1,234,5678910}
计算 G L = Σ i ∈ I l e f t g i = 0 G_L=\Sigma_{i\in I_{left}}g_i=0 GL=ΣiIleftgi=0
计算 H L = Σ i ∈ I l e f t h i = 0.0 H_L=\Sigma_{i\in I_{left}}h_i=0.0 HL=ΣiIlefthi=0.0
计算 G R = Σ i ∈ I r i g h t g i = − 1.0 G_R=\Sigma_{i\in I_{right}}g_i=-1.0 GR=ΣiIrightgi=1.0
计算 H R = Σ i ∈ I r i g h t h i = 2.5 H_R=\Sigma_{i\in I_{right}}h_i=2.5 HR=ΣiIrighthi=2.5

最后计算增益:

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 + λ ] − γ = 0 Gain=\frac{1}{2}\left [{\color{Red} \frac{G_{L}^2}{H_L+\lambda}}+{\color{Blue} \frac{G_{R}^2}{H_R+\lambda}}-{\color{Green} \frac{(G_L+G_R)^2}{H_L+H_R+\lambda} } \right ]-{\color{Magenta} \gamma}=0 Gain=21[HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2]γ=0


当以特征值为-2作为划分点时(x2<-2):

左子树集合为 I l e f t = { 1 , 6 } I_{left}=\left \{1,6 \right \} Ileft={1,6}
右子树集合为 I r i g h t = { 2 , 3 , 4 , 5 , 7 , 8 , 9 , 10 } I_{right}=\left \{ 2,3,4,5,7,8,9,10\right \} Iright={234,578910}
计算 G L = Σ i ∈ I l e f t g i = 0.0 G_L=\Sigma_{i\in I_{left}}g_i=0.0 GL=ΣiIleftgi=0.0
计算 H L = Σ i ∈ I l e f t h i = 0.5 H_L=\Sigma_{i\in I_{left}}h_i=0.5 HL=ΣiIlefthi=0.5
计算 G R = Σ i ∈ I r i g h t g i = − 1.0 G_R=\Sigma_{i\in I_{right}}g_i=-1.0 GR=ΣiIrightgi=1.0
计算 H R = Σ i ∈ I r i g h t h i = 2.0 H_R=\Sigma_{i\in I_{right}}h_i=2.0 HR=ΣiIrighthi=2.0

最后计算增益:

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 + λ ] − γ = 0.023809 Gain=\frac{1}{2}\left [{\color{Red} \frac{G_{L}^2}{H_L+\lambda}}+{\color{Blue} \frac{G_{R}^2}{H_R+\lambda}}-{\color{Green} \frac{(G_L+G_R)^2}{H_L+H_R+\lambda} } \right ]-{\color{Magenta} \gamma}= 0.023809 Gain=21[HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2]γ=0.023809

然后也是依次计算出特征x2的各个划分点的参数与增益值,列表如下:

Split_point-5-2025
G L G_L GL000-0.5-1.0
H L H_L HL00.51.01.252.5
G R G_R GR-1.0-1.0-1.0-0.50.0
H R H_R HR2.521.51.250.0
G a i n Gain Gain0.00.0238090.057142-0.0317460.0

因此对特征x2而言,最佳划分点位x2<0


因为x1与x2的最佳划分点的增益值相同,所以我们选取x1<3作为最佳划分点即可。

那么划分后左子树的样本集合为: I l e f t = { 1 , 2 , 4 , 5 } , I r i g h t = { 3 , 6 , 7 , 8 , 9 , 10 } I_{left}=\left \{1,2,4,5 \right \},I_{right}=\left \{3,6,7,8,9,10 \right \} Ileft={1,2,4,5},Iright={3,6,7,8,9,10}

故左叶子结点的权值为:

w 1 左 ∗ = − G H + λ η = − 0 1 + 1 ∗ 0.1 = 0 w_{1左}^{*}=-\frac{G}{H+\lambda}{\color{Red}\eta}=-\frac{0}{1+1}{\color{Red}*0.1}=0 w1=H+λGη=1+100.1=0

w 1 右 ∗ = − G H + λ η = − − 1.0 1.5 + 1 ∗ 0.1 = 0.04 w_{1右}^{*}=-\frac{G}{H+\lambda}{\color{Red}\eta}=-\frac{-1.0}{1.5+1}{\color{Red}*0.1}=0.04 w1=H+λGη=1.5+11.00.1=0.04

η {\color{Red}\eta} η是学习率,防止过拟合。

至此第一颗树建立完毕,如果深度为2,那么就需在左节点与右节点分别重复上面的步骤即可。


2、生成第二棵树

回想一下,我们在生成第一颗树的时候用到了 f 0 ( x i ) f_0(x_i) f0(xi),这颗初始的树是我们自己设置的(base_score= P 11 P_{11} P11=0.5)

假设模型只有这一颗树(T=1),那么模型对样本 x i x_i xi进行预测的值是什么呢?

由加法模型知:

y i T = Σ t = 0 T f t ( x i ) y_{i}^T=\Sigma_{t=0}^Tf_{t}(x_i) yiT=Σt=0Tft(xi)

y i 1 = f 0 ( x i ) + f 1 ( x i ) y_{i}^1=f_{0}(x_i)+f_{1}(x_i) yi1=f0(xi)+f1(xi)

f 1 ( x i ) f_{1}(x_i) f1(xi)是我们样本 x i x_i xi落在第一颗树上的某个节点的值,而 f 0 ( x i ) f_{0}(x_i) f0(xi)就是前面提到的base_score经过sigmod映射后的值,因为我们选择的是logloss做损失函数,所以概率为 P = 1 1 + e − x P=\frac{1}{1+e^{-x}} P=1+ex1

所以我们需要将0.5做逆运算 x = ln ⁡ y 1 − y x=\ln\frac{y}{1-y} x=ln1yy后可以得到 f 0 ( x i ) = 0. f_0(x_i)=0. f0(xi)=0.

因此第一颗树预测的结果就是:

y i 1 = f 0 ( x i ) + f 1 ( x i ) = 0 + ω q ( x i ) y_{i}^1=f_{0}(x_i)+f_{1}(x_i)=0+\omega_{q(x_i)} yi1=f0(xi)+f1(xi)=0+ωq(xi)

官方文档有说明,当生成的树较多时(T很大),那么初始值几乎不起什么作用。

y i ^ 2 = y i ^ 1 + f 2 ( x i ) \hat{y_{i}}^2=\hat{y_{i}}^1+f_2(x_i) yi^2=yi^1+f2(xi)

因此我们需要对第一颗树的结果做映射,映射后的值就是我们计算logloss的一阶、二阶导数中的 P 12 P_{12} P12

第二颗logloss的一阶、二阶导数为:

g i = l ′ ( y i , y i ^ ) = P 12 − y i g_i={l}&#x27;(y_i,\hat{y_i})=P_{12}-y_i gi=l(yi,yi^)=P12yi;

h i = l ′ ′ ( y i , y i ^ ) = P 12 ( 1 − P 12 ) h_i={l}&#x27;&#x27;(y_i,\hat{y_i})=P_{12}(1-P_{12}) hi=l(yi,yi^)=P12(1P12)

P 12 P_{12} P12的值如下表:

IDP12
10.5
20.5
30.5099
40.5
50.5
60.5099
70.5099
80.5099
90.5099
100.5099

后面的树的生成与第一颗树一模一样,记得最后需要对预测值做映射。

下一篇介绍下XGBoost的在数据集上跑出来的效果,简单的小入门,与调参的基本步骤!!!


[URL2]:https://arxiv.org/pdf/1603.02754.pdf

  • 0
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升树的机器学习算法。它是由陈天奇在2016年提出的,并且在各种机器学习任务中表现出色。 XGBoost原理基于集成学习中的梯度提升算法。梯度提升是一种迭代的决策树构建方法,通过递归地将弱学习器(即决策树)添加到模型中,并逐步优化模型的预测能力。XGBoost通过优化目标函数来构建决策树,同时利用了梯度提升的思想。 具体而言,XGBoost的目标函数包括两部分:损失函数和正则化项。损失函数度量了模型预测值与真实值之间的差异,而正则化项则控制模型的复杂度,避免过拟合。 XGBoost通过迭代地添加决策树来构建模型。在每一次迭代中,它首先计算当前模型对样本的预测值,并计算预测值与真实值之间的梯度。然后,它使用这些梯度来拟合一个新的决策树,使得损失函数最小化。为了进一步优化模型的性能,XGBoost还引入了正则化项,用于控制决策树的复杂度。 在模型构建完成后,XGBoost使用一种称为“提升”的策略来组合多个决策树的预测结果。提升通过将多个决策树的预测结果进行加权求和,得到最终的预测结果。为了进一步提高模型的泛化能力,XGBoost还使用了一种称为“剪枝”的技术来减小决策树的复杂度。 总结来说,XGBoost通过迭代地优化目标函数来构建决策树,并通过提升和剪枝等技术来组合多个决策树的预测结果。这种方式使得XGBoost在各种机器学习任务中表现出色,并成为了许多数据科学竞赛中的常用算法之一。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值