xgboost 学习笔记整理

本文深入探讨了XGBoost算法的目标函数,详细解析了其损失函数与正则化项,并介绍了如何通过泰勒公式展开进行二阶近似。文章进一步阐述了树模型的构建,包括叶子节点的权重和结构,以及正则化项的定义。通过叶子节点的归组,简化了目标函数,并提出了分裂准则,用于决定树的最优分割。最后,讨论了精确贪心算法和近似分裂算法在寻找最佳分割点时的不同策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

xgboost 笔记整理

1.XGBoost 目标函数

O b j = ∑ i = 1 n l ( y i , y ^ i ) + ∑ k = 1 K Ω ( f k ) \mathcal{Obj}=\sum_{i=1}^{n} l\left(y_{i}, \hat{y}_{i}\right)+\sum_{k=1}^{K} \Omega\left(f_{k}\right) Obj=i=1nl(yi,y^i)+k=1KΩ(fk)

训练损失正则化项组成

y ^ i \hat{y}_{i} y^i 是第 i 个样本 x i {x}_{i} xi 的预测值,对应是每棵树打分的累加和

y ^ i = ∑ k = 1 K f k ( x i ) , f k ∈ F \hat{y}_{i}=\sum_{k=1}^{K} f_{k}\left(x_{i}\right), \quad f_{k} \in \mathcal{F} y^i=k=1Kfk(xi),fkF

2. 学习第 k 颗树

假设第 t 次迭代要训练的树模型是 f t ( x ) {f}_{t}(x) ft(x) ,那么

y ^ i ( t ) = ∑ k = 1 t f k ( x i ) = y ^ i ( t − 1 ) + f t ( x i ) \hat{y}_{i}^{(t)}=\sum_{k=1}^{t} f_{k}\left(x_{i}\right)=\hat{y}_{i}^{(t-1)}+f_{t}(x_{i}) y^i(t)=k=1tfk(xi)=y^i(t1)+ft(xi)

(第 t 次训练的结果 = 前 t-1 颗树的结果 + 第 t 颗树的结果)

注意:对于第 t 次迭代来说,当前优化的目标是第 t 颗树,因此前 t - 1 颗数的预测结果可认为是常量

将上式代入目标函数中,可以得到

O b j ( t ) = ∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + Ω ( f t ) + c o n s t \mathcal{Obj}^{(t)}=\sum_{i=1}^{n} l\left(y_{i}, \hat{y}_{i}^{(t-1)}+f_{t}\left(\mathbf{x}_{i}\right)\right)+\Omega\left(f_{t}\right) + const Obj(t)=i=1nl(yi,y^i(t1)+ft(xi))+Ω(ft)+const

此处对正则项进行了拆分,由于前 t - 1 颗树的结构已经确定,因此前 t - 1 颗树的复杂度可以用一个常数表示

∑ k = 1 t Ω ( f k ) = Ω ( f t ) + ∑ k = 1 t − 1 Ω ( f k ) = Ω ( f t ) + c o n s t \sum_{k=1}^{t} \Omega\left(f_{k}\right)=\Omega\left(f_{t}\right)+\sum_{k=1}^{t-1} \Omega\left(f_{k}\right)=\Omega\left(f_{t}\right)+{const} k=1tΩ(fk)=Ω(ft)+k=1t1Ω(fk)=Ω(ft)+const

3. 泰勒公式展开

泰勒公式是将一个在 x = x0 处具有n阶导数的函数 f ( x ) f(x) f(x) 利用关于 ( x − x 0 ) (x-x0) (xx0) 的n次多项式来逼近函数的方法

泰勒二阶展开公式:

f ( x + Δ x ) ≃ f ( x ) + f ′ ( x ) Δ x + 1 2 f ′ ′ ( x ) Δ x 2 f(x+\Delta x) \simeq f(x)+f^{\prime}(x) \Delta x+\frac{1}{2} f^{\prime \prime}(x) \Delta x^{2} f(x+Δx)f(x)+f(x)Δx+21f(x)Δx2

f ( x ) f(x) f(x) 对应于损失函数 → l ( y i , y ^ i ( t − 1 ) ) \to l(y_{i}, \hat{y}_{i}^{(t-1)}) l(yi,y^i(t1))

x x x 对应于前 t-1 颗树 → y ^ i ( t − 1 ) \to \hat{y}_{i}^{(t-1)} y^i(t1)

Δ x \Delta {x} Δx对应于当前训练的第t颗树 → f t ( x ) \to f_{t}(x) ft(x)

那么对 x 求偏导,即对前t-1颗树求偏导

定义损失函数 l l l 关于 y ^ i ( t − 1 ) \hat{y}_{i}^{(t-1)} y^i(t1) 的一阶偏导 g i g_{i} gi, 二阶偏导 h i h_{i} hi

g i = ∂ y ^ ( t − 1 ) l ( y i , y ^ ( t − 1 ) ) , h i = ∂ y ^ ( t − 1 ) 2 l ( y i , y ^ ( t − 1 ) ) g_{i}=\partial_{\hat{y}^{(t-1)}} l\left(y_{i}, \hat{y}^{(t-1)}\right), h_{i}=\partial_{\hat{y}^{(t-1)}}^{2} l\left(y_{i}, \hat{y}^{(t-1)}\right) gi=y^(t1)l(yi,y^(t1))hi=y^(t1)2l(yi,y^(t1))

将损失函数 l l l 进行泰勒二阶展开

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 ) l\left(y_{i}, \hat{y}_{i}^{(t-1)}+f_{t}\left(x_{i}\right)\right)=l\left(y_{i}, \hat{y}_{i}^{(t-1)}\right)+g_{i} f_{t}\left(x_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(x_{i}\right) l(yi,y^i(t1)+ft(xi))=l(yi,y^i(t1))+gift(xi)+21hift2(xi)

将展开的损失函数,代入第 t 次迭代的目标函数

O b j ( 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 ) +  constant  O b j^{(t)} \simeq \sum_{i=1}^{n}\left[l\left(y_{i}, \hat{y}_{i}^{(t-1)}\right)+g_{i} f_{t}\left(x_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(x_{i}\right)\right]+\Omega\left(f_{t}\right)+\text { constant } Obj(t)i=1n[l(yi,y^i(t1))+gift(xi)+21hift2(xi)]+Ω(ft)+ constant 

去除第 t 次迭代的常数项 (前 t-1 次损失函数、前 t-1 次正则项,常数项对优化不起作用)

O b j ( t ) ≃ ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) O b j^{(t)} \simeq \sum_{i=1}^{n}\left[g_{i} f_{t}\left(x_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(x_{i}\right)\right]+\Omega\left(f_{t}\right) Obj(t)i=1n[gift(xi)+21hift2(xi)]+Ω(ft)

接下来分别对未知变量 f t ( x ) f_{t}(x) ft(x) Ω ( f t ) \Omega\left(f_{t}\right) Ω(ft) 进行定义

4. 定义一颗树 f t ( x ) f_{t}(x) ft(x)

f t ( x ) = w q ( x ) , w ∈ R T , q : R d → { 1 , 2 , ⋯   , T } f_{t}(x)=w_{q(x)}, \quad w \in \mathbf{R}^{T}, q: \mathbf{R}^{d} \rightarrow\{1,2, \cdots, T\} ft(x)=wq(x),wRT,q:Rd{1,2,,T}

  • w: 从节点到权重的映射,长度为T的一维向量,T表示该树有 T个叶子节点,向量中每个数代表着对应叶子节点的权重

    例: w1 = 3 (表示第1个叶子节点权重为3)

  • q(x): q代表着一颗树的结构(分段函数的区间),输出为[1,T],q(x) 表示将输入样本 x i ∈ R d x_{i} \in \mathbf{R}^{d} xiRd 被树 q 预测后,落入的节点

    例:q(x2) = 1 (表示输入样本 x2 在当前树的预测叶子节点为 1, 结合上述w的例子, f t ( x 2 ) = w q ( x 2 ) = w 1 = 3 f_{t}(x_{2})=w_{q(x_{2})}=w_{1}=3 ft(x2)=wq(x2)=w1=3)

5. 定义树的复杂度 Ω ( f t ) \Omega\left(f_{t}\right) Ω(ft)

Ω ( f t ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega\left(f_{t}\right)=\gamma T+\frac{1}{2} \lambda \sum_{j=1}^{T} w_{j}^{2} Ω(ft)=γT+21λj=1Twj2

  • γ \gamma γ : 叶子节点正则项,作用于叶子节点的个数

  • λ \lambda λ : 权值正则项,作用于叶子节点对应的权值

  • T: 叶子节点的数量

  • w j w_{j} wj: 第 t 颗树的第 j 个叶子节点权值

6. 叶子节点归组

将所有训练样本,按照叶子节点进行归组 I j = { i ∣ q ( x i ) = j } I_{j}=\left\{i \mid q\left(x_{i}\right)=j\right\} Ij={iq(xi)=j}

例:共有5个样本,3个叶子节点,其中落入第 1 个叶子节点的是 x1, 落入第 2 个叶子节点的是 x2, 落入第 3 个叶子节点的是 x3、x4、x5,那么 I 1 ∈ x 1 , I 2 ∈ x 2 , I 3 ∈ x 3 , x 4 , x 5 I_{1} \in x_{1}, I_{2} \in x_{2}, I_{3} \in x_{3},x_{4},x_{5} I1x1,I2x2,I3x3,x4,x5

利用归组后的样本,对目标函数进行改写:

O b j ( 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 + λ 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 \begin{aligned} Obj^{(t)} &\simeq \sum_{i=1}^{n}\left[g_{i} f_{t}\left(x_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(x_{i}\right)\right]+\Omega\left(f_{t}\right)\\ &=\sum_{i=1}^{n}\left[g_{i} w_{q\left(x_{i}\right)}+\frac{1}{2} h_{i} w_{q\left(x_{i}\right)}^{2}\right]+\gamma T+\lambda \frac{1}{2} \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}\right) w_{j}^{2}\right]+\gamma T+\lambda \frac{1}{2} \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 \end{aligned} Obj(t)i=1n[gift(xi)+21hift2(xi)]+Ω(ft)=i=1n[giwq(xi)+21hiwq(xi)2]+γT+λ21j=1Twj2=j=1TiIjgiwj+21iIjhiwj2+γT+λ21j=1Twj2=j=1TiIjgiwj+21iIjhi+λwj2+γT

到这一步,已将所有落到同一个叶子节点的样本进行归组,目标函数化简成对所有叶子节点进行求累加和。

即从样本上的遍历,转换成在叶子节点上的遍历。

继续对导数进行定义:

G j = ∑ i ∈ I j g i H j = ∑ i ∈ I j h i \begin{aligned} G_{j}=\sum_{i \in I_{j}} g_{i} \\ H_{j}=\sum_{i \in I_{j}} h_{i} \end{aligned} Gj=iIjgiHj=iIjhi

  • G j G_{j} Gj: 叶子节点 j 所包含的样本的一阶偏导累加和,常量

  • H j H_{j} Hj: 叶子节点 j 所包含的样本的二阶偏导累加和,常量

继续将 G j , H j G_{j}, H_{j} Gj,Hj 代入 O b j ( t ) Obj^{(t)} Obj(t) 进行化简

O b j ( t ) = ∑ j = 1 T [ ( ∑ i ∈ I j g i ) w j + 1 2 ( ∑ i ∈ I j h i + λ ) w j 2 ] + γ T = ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T \begin{aligned} Obj^{(t)} &=\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\\ &=\sum_{j=1}^{T}\left[G_{j} w_{j}+\frac{1}{2}\left(H_{j}+\lambda\right) w_{j}^{2}\right]+\gamma T \end{aligned} Obj(t)=j=1TiIjgiwj+21iIjhi+λwj2+γT=j=1T[Gjwj+21(Hj+λ)wj2]+γT

7. 求解最优值

根据高中知识,对于二次函数

y = a x 2 + b x + c y=a x^{2}+b x+c y=ax2+bx+c

其顶点坐标为

( − b 2 a , 4 a c − b 2 4 a ) (-\frac{b}{2a} ,\frac{4ac-b^{2}}{4a} ) (2ab,4a4acb2)

那么,对于目标函数

O b j ( t ) = ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T Obj^{(t)} = \sum_{j=1}^{T}\left[G_{j} w_{j}+\frac{1}{2}\left(H_{j}+\lambda\right) w_{j}^{2}\right]+\gamma T Obj(t)=j=1T[Gjwj+21(Hj+λ)wj2]+γT

其每个叶子节点 j 都是相对独立的一个部分,将其从中抽取出来,

G j w j + 1 2 ( H j + λ ) w j 2 G_{j} w_{j}+\frac{1}{2}\left(H_{j}+\lambda\right) w_{j}^{2} Gjwj+21(Hj+λ)wj2

套入一元二次函数最值求解的公式

可以得到

w j ∗ = − b 2 a = − G j H j + λ w_{j}^{*}= -\frac{b}{2a} =-\frac{G_{j}}{H_{j}+\lambda} wj=2ab=Hj+λGj

第 t 颗树的最小损失

O b j ( t ) = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T O b j^{(t)}=-\frac{1}{2} \sum_{j=1}^{T} \frac{G_{j}^{2}}{H_{j}+\lambda}+\gamma T Obj(t)=21j=1THj+λGj2+γT

上式可用作一个评分函数来衡量树结构的质量。分数越小,代表整个树的结构越好,这个评分类似于评价决策树的杂质评分,只是它是为更广泛的目标函数而推导的。

8. 分裂准则

一个节点到底该不该分裂,要看分裂后对比于分裂前的目标函数到底有没有减小

用分裂前的目标函数值减去分裂后的目标函数值,(注意目标函数的符号,为负号,不要将式子看成分裂后-分裂前)

I L I_L IL为每次分裂时分到左子树上的样本, I R I_R IR为每次分裂时分到右子树上的样本,有 I = I L ∪ I R I = I_L \cup I_R I=ILIR 。则在该次分裂后损失的减小量为:

G a i n = 1 2 [ ( ∑ i ∈ I L g i ) 2 ∑ i ∈ I L h i + λ + ( ∑ i ∈ I R g i ) 2 ∑ i ∈ I R h i + λ − ( ∑ i ∈ I g i ) 2 ∑ i ∈ I h i + λ ] − γ Gain=\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 Gain=21[iILhi+λ(iILgi)2+iIRhi+λ(iIRgi)2iIhi+λ(iIgi)2]γ

此处 γ \gamma γ 的作用相当于是一个阈值,即限定 Gain 只有大于 γ \gamma γ 时,才进行分裂,起到预剪枝的作用。

  • Gain > 0: 分裂后比分裂前的损失要小,因此可以进行分裂;

  • Gain < 0: 分裂后比分裂前的损失要大,因此不推荐分裂。

9. 最优点查找策略

  • 精确贪心算法:对所有特征的所有可能的点全部进行遍历,贪心的每一步选择当前最优的划分节点

I n p u t : I , 当 前 节 点 的 实 例 集 I n p u t : d , 特 征 维 度 g a i n ← 0 G ← ∑ i ∈ I g i , H ← ∑ i ∈ I h i f o r   k = 1   t o   m   d o G L ← 0 , H L ← 0 f o r   j   i n   s o t r e d ( I , b y   x j k )   d o G L ← G L + g i , H L ← H L + h i G R ← G − G L , H R ← H − H L s c o r e ← m a x ( s c o r e , G L 2 H L + λ + G R 2 H R + λ − G 2 H + λ ) e n d e n d \begin{aligned} &Input: I,当前节点的实例集\\ &Input: d,特征维度\\ &gain \gets 0\\ &G \gets \sum_{i\in I}g_{i} , H \gets \sum_{i\in I}h_{i}\\ &for \ k = 1 \ to \ m \ do\\ &\qquad G_{L} \gets 0, H_{L} \gets 0\\ &\qquad for \ j \ in \ sotred(I,by \ x_{jk}) \ do\\ &\qquad \qquad G_L \gets G_L+g_i,H_L \gets H_L+h_i\\ &\qquad \qquad G_R \gets G-G_L,H_R \gets H-H_L\\ &\qquad \qquad score \gets max(score, \frac{G_L^2}{H_L+\lambda} + \frac{G_R^2}{H_R+\lambda} - \frac{G^2}{H+\lambda})\\ &\qquad end\\ &end \end{aligned} Input:IInput:dgain0GiIgi,HiIhifor k=1 to m doGL0,HL0for j in sotred(I,by xjk) doGLGL+gi,HLHL+hiGRGGL,HRHHLscoremax(score,HL+λGL2+HR+λGR2H+λG2)endend

  • 近似分裂算法贪心算法:对每个特征,只考察分位点,减少计算复杂度

    有2中模式:

    • Global:学习每棵树前,提出候选切分点,在学习每棵树前,提前计算分位数,后续直接用即可

    • Local:每次分裂前,重新提出候选切分点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值