xgboost原理

本文深入解析XGBoost的工作原理,包括模型结构、目标函数、决策树复杂度及梯度提升算法。阐述如何通过泰勒展开优化目标函数,确定最佳决策树结构与叶子节点预测值。

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

在网上看了xgboost的介绍,很多博客一开始并没有看的很明白,于是我按照自己的理解写一下xgboost的原理。


主要参考了:
https://xgboost.readthedocs.io/en/latest/tutorials/model.html (英文详细教程)
https://www.zhihu.com/question/41354392/answer/98658997 (很有用的PPT,出自wepon大神)
https://www.jianshu.com/p/7e0e2d66b3d4 (实战xgboost)


1. Xgboost的模型

xgboost的模型为:
y i ^ = ϕ ( x i ) = ∑ k = 1 K f k ( x i ) , f k ϵ F , \hat{y_{i}}=\phi \left ( x_{i} \right )=\sum_{k=1}^{K}f_{k}\left ( x_{i} \right ),f_{k}\epsilon F, yi^=ϕ(xi)=k=1Kfk(xi),fkϵF,
这是个加法模型,由k个弱分类器一起来决定输入 x i x_{i} xi的输出的结果 y i y_{i} yi,其中每一个弱分类器 f i ( x ) f_{i}\left ( x \right ) fi(x)是一颗决策树。这个决策树 f i ( x ) f_{i}\left ( x \right ) fi(x)的每一个叶子节点都对应一个分数,每个样本 x i x_{i} xi经过这颗决策树 f i ( x ) f_{i}\left ( x \right ) fi(x)的规则分类之后都落在一个叶子节点上 ,得到一个分数,如下图所示:(这里一共5个样本,每个样本最后都会分到叶子节点,获得对应的分数)
在这里插入图片描述
这颗决策树可以由以下模型来表示:
f ( x ) = w q ( x ) ( q : R m → T , w ∈ R T ) f\left ( x \right )=w_{q\left ( x \right )}\left ( q:\mathbb{R}^{m}\rightarrow T,w\in \mathbb{R}^{T} \right ) f(x)=wq(x)(q:RmT,wRT)
其中 q ( x ) q(x) q(x)表示表示将样本 x x x分到了某个叶子节点 i i i上, w w w则是叶子节点 i i i对应的分数 w i w_{i} wi,如上图红色和蓝色的标记所示,所以 w q ( x ) w_{q\left ( x \right )} wq(x) 表示回归树对样本 x x x的预测值。


2. 目标函数

xgboost的目标函数为:
O b j = ∑ i n l ( y ^ i , y i ) + ∑ k K Ω ( f k ) Obj=\sum_{i}^{n} l(\hat{y}_{i},y_{i})+\sum_{k}^{K}\Omega (f_{k}) Obj=inl(y^i,yi)+kKΩ(fk)
一共有n个训练样本,K颗树。并且在目标函数中,加入了正则化,对每棵回归树的复杂度进行了惩罚 ∑ k K Ω ( f k ) \sum_{k}^{K}\Omega (f_{k}) kKΩ(fk),使得学习出来的模型更加不容易过拟合。

因为xgboost的模型是个加法模型,在初始化(第0次迭代)的时候呢,模型是:
y ^ i ( 0 ) = 0 \hat{y}_{i}^{(0)}=0 y^i(0)=0
第1次迭代:
y ^ i ( 1 ) = f 1 ( x i ) = y ^ i ( 0 ) + f 1 ( x i ) \hat{y}_{i}^{(1)}=f_{1}(x_{i})=\hat{y}_{i}^{(0)}+f_{1}(x_{i}) y^i(1)=f1(xi)=y^i(0)+f1(xi)
第2次迭代:
y ^ i ( 2 ) = f 1 ( x i ) + f 2 ( x i ) = y ^ i ( 1 ) + f 2 ( x i ) \hat{y}_{i}^{(2)}=f_{1}(x_{i})+f_{2}(x_{i})=\hat{y}_{i}^{(1)}+f_{2}(x_{i}) y^i(2)=f1(xi)+f2(xi)=y^i(1)+f2(xi)
第t次迭代:
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)
替换掉目标函数中的 y ^ i ( t ) \hat{y}_{i}^{(t)} y^i(t),即在第t次迭代的时候的目标函数,我们通过这个目标函数学习 f t ( x i ) f_{t}(x_{i}) ft(xi)
O b j = ∑ i n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + Ω ( f k ) Obj=\sum_{i}^{n} l(y_{i},\hat{y}_{i}^{(t-1)}+f_{t}(x_{i}))+\Omega (f_{k}) Obj=inl(yi,y^i(t1)+ft(xi))+Ω(fk)
在上式中, y i y_{i} yi是训练数据的标签,已知的; y ^ i ( t − 1 ) \hat{y}_{i}^{(t-1)} y^i(t1)在上一步迭代t-1中也已经求得,只需要学习 f t ( x i ) f_{t}(x_{i}) ft(xi)。因为只需要学习 f t ( x i ) f_{t}(x_{i}) ft(xi),所以 ∑ k K Ω ( f k ) \sum_{k}^{K}\Omega (f_{k}) kKΩ(fk) Ω ( f k ) \Omega (f_{k}) Ω(fk)替换了。

下面到了xgboost的一个关键步骤,将目标函数在 y ^ i ( t − 1 ) \hat{y}_{i}^{(t-1)} y^i(t1)进行二阶泰勒展开

  • 复习泰勒公式展开: 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

令目标函数 O b j Obj Obj y ^ i ( t ) \hat{y}_{i}^{(t)} y^i(t) x x x f t ( x i ) f_{t}(x_{i}) ft(xi) Δ x \Delta x Δx,则二阶泰勒展开之后目标函数变为:
O b j ≃ ∑ i n [ l ( y i , y ^ i ( t − 1 ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f k ) Obj\simeq \sum_{i}^{n} [l(y_{i},\hat{y}_{i}^{(t-1)})+g_{i}f_{t}(x_{i})+\frac{1}{2}h_{i}f_{t}^{2}(x_{i})]+\Omega (f_{k}) Objin[l(yi,y^i(t1))+gift(xi)+21hift2(xi)]+Ω(fk)

  • g i g_{i} gi l ( y i , y ^ i ( t − 1 ) ) l(y_{i},\hat{y}_{i}^{(t-1)}) l(yi,y^i(t1))的一阶倒数: g i = ∂ y ^ ( t − 1 ) l ( y i , y ^ t − 1 ) g_{i}=\partial _{\hat{y}^{(t-1)}}l(y_{i},\hat{y}^{t-1}) gi=y^(t1)l(yi,y^t1)
  • h i h_{i} hi l ( y i , y ^ i ( t − 1 ) ) l(y_{i},\hat{y}_{i}^{(t-1)}) l(yi,y^i(t1))的二阶倒数: h i = ∂ y ^ ( t − 1 ) 2 l ( y i , y ^ t − 1 ) h_{i}=\partial_{\hat{y}^{(t-1)}}^{2}l(y_{i},\hat{y}^{t-1}) hi=y^(t1)2l(yi,y^t1)

去掉公式中的常数项:
O b j ≃ ∑ i n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f k ) Obj\simeq \sum_{i}^{n} [g_{i}f_{t}(x_{i})+\frac{1}{2}h_{i}f_{t}^{2}(x_{i})]+\Omega (f_{k}) Objin[gift(xi)+21hift2(xi)]+Ω(fk)


3. 决策树的复杂度

在第1节的时候介绍过,决策树的模型是 f ( x ) = w q ( x ) ( q : R m → T , w ∈ R T ) f\left ( x \right )=w_{q\left ( x \right )}\left ( q:\mathbb{R}^{m}\rightarrow T,w\in \mathbb{R}^{T} \right ) f(x)=wq(x)(q:RmT,wRT),xgboost定义决策树的复杂度公式 Ω ( f k ) \Omega (f_{k}) Ω(fk)为:
Ω ( f k ) = γ T + 1 2 λ ∥ w ∥ 2 \Omega (f_{k})=\gamma T+\frac{1}{2}\lambda \left \| w \right \|^{2} Ω(fk)=γT+21λw2
其中:

  • T T T为决策树的叶子节点的个数
  • ∥ w ∥ 2 \left \| w \right \|^{2} w2为叶子节点得分L2正则化项,针对每个叶结点的得分增加L2平滑,目的也是为了避免过拟合
    在这里插入图片描述

4. 再回到目标函数

f ( x ) = w q ( x ) f\left ( x \right )=w_{q\left ( x \right )} f(x)=wq(x) Ω ( f k ) \Omega (f_{k}) Ω(fk)代入目标函数:
O b j ≃ ∑ i 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 Obj\simeq \sum_{i}^{n} [g_{i}w_{q(x_{i})}+\frac{1}{2}h_{i}w_{q(x_{i})}^{2}]+\gamma T+\frac{1}{2}\lambda \sum_{j=1}^{T}w_{j}^{2} Objin[giwq(xi)+21hiwq(xi)2]+γT+21λj=1Twj2
公式中 T T T是指决策树的 T T T个叶子节点。

定义每个叶子节点 j j j上的样本集合为: I j = { i ∣ q ( x i = j ) } I_{j}=\left \{ i|q(x_{i}=j) \right \} Ij={iq(xi=j)}
则目标函数可以写成按叶子节点累加的形式:
O b j = ∑ j = 1 T [ ( ∑ i ϵ I j g j ) 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 Obj=\sum_{j=1}^{T}\left [ (\sum _{i\epsilon I_{j}}g_{j})w_{j}+\frac{1}{2}(\sum _{i\epsilon I_{j}}h_{i}+\lambda )w_{j}^{2} \right ]+\gamma T =\sum_{j=1}^{T}\left [ G_{j}w_{j}+\frac{1}{2}(H_{j}+\lambda )w_{j}^{2} \right ]+\gamma T Obj=j=1T(iϵIjgj)wj+21(iϵIjhi+λ)wj2+γT=j=1T[Gjwj+21(Hj+λ)wj2]+γT

  • G j = ∑ i ϵ I j g j G_{j}=\sum _{i\epsilon I_{j}}g_{j} Gj=iϵIjgj 对于落入决策树第 i i i个叶子节点的样本,计算它们的 g i = ∂ y ^ ( t − 1 ) l ( y i , y ^ t − 1 ) g_{i}=\partial _{\hat{y}^{(t-1)}}l(y_{i},\hat{y}^{t-1}) gi=y^(t1)l(yi,y^t1)并累加
  • H j = ∑ i ϵ I j h i H_{j}=\sum _{i\epsilon I_{j}}h_{i} Hj=iϵIjhi 对于落入决策树第 i i i个叶子节点的样本,计算它们的 h i = ∂ y ^ ( t − 1 ) 2 l ( y i , y ^ t − 1 ) h_{i}=\partial_{\hat{y}^{(t-1)}}^{2}l(y_{i},\hat{y}^{t-1}) hi=y^(t1)2l(yi,y^t1)并累加

5. 求解第t次迭代的决策树 f t ( x i ) f_{t}(x_{i}) ft(xi)

有了上述的目标函数之后,我们是怎么得出第t次迭代的决策树 f t ( x i ) f_{t}(x_{i}) ft(xi)的呢?
我们先来看看 f t ( x i ) f_{t}(x_{i}) ft(xi)都有哪些是需要我们求的:

  1. 树的结构: q ( x ) q(x) q(x)
  2. 叶子节点对于的预测分数: w w w
5.1 叶子节点对于的预测分数: w w w

我们先来看看 w w w是如何确定的。
假设树的的结构 q ( x ) q(x) q(x)确定了,为了使得目标函数最小,可以令目标函数为0,解得每个叶子节点的最优预测分数为:
w j ∗ = − G j H j + λ w_{j}^{*}=-\frac{G_{j}}{H_{j}+\lambda } wj=Hj+λGj
代入目标函数,得到最小的损失为:
L ~ ∗ = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T \tilde{L}^{*}=-\frac{1}{2}\sum_{j=1}^{T}\frac{G_{j}^{2}}{H_{j}+\lambda }+\gamma T L~=21j=1THj+λGj2+γT

5.2 树的结构 q ( x ) q(x) q(x)

5.1是假设树的结构确定了求 w w w,但是现在树的结构怎么求呢?
xgboost使用贪心算,每次分裂一个节点,计算分裂前后的增益,选择增益最大的。
那么这个增益怎么算?我们再来看看上面求出的最小的损失 L ~ ∗ = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T \tilde{L}^{*}=-\frac{1}{2}\sum_{j=1}^{T}\frac{G_{j}^{2}}{H_{j}+\lambda }+\gamma T L~=21j=1THj+λGj2+γT,其中有一项是 G j 2 H j + λ \frac{G_{j}^{2}}{H_{j}+\lambda } Hj+λGj2,这一项的值越大,最小的损失 L ~ ∗ \tilde{L}^{*} L~就越小,因为这一项的符号是负号。
于是,如果在某个叶子节点处进行分裂,将这个叶子节点变成左右子树,样本落到左子树,上述的一项公式的值记为 G L 2 H L + λ \frac{G_{L}^{2}}{H_{L}+\lambda } HL+λGL2,右子树的值记为 G R 2 H R + λ \frac{G_{R}^{2}}{H_{R}+\lambda } HR+λGR2,原未分裂的叶子节点的值记为 ( G L + G R ) 2 H L + H R + λ \frac{(G_{L}+G_{R})^{2}}{H_{L}+H_{R}+\lambda } HL+HR+λ(GL+GR)2,所以分裂前后的增益定义为:
G a i n = G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ − γ Gain=\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 }-\gamma Gain=HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2γ
增益 G a i n Gain Gain越大,说明在这个叶子节点进行分裂,损失函数会越小。所以在一开始的时候循环所有的特征的所有的值,选取 G a i n Gain Gain最大的节点进行分裂,然后再对左子树右子树分别进行分裂。大概的思想是:

Gain=0
for i=1 to 所有的特征
    for j=1 to 第i个特征的所有的值
        计算Gain,保存最大的Gain的值的i和j

具体的精确算法:
在这里插入图片描述
遍历所有特征的所有可能的分割点,计算gain值,选取值最大的(feature,value)去分割。此外,xgboost算法设计对特征进行了排序,分位点划分等细节。
通过此方法生成每一轮迭代新生成的树的结构 q ( x ) q(x) q(x)


以上就是xgboost的预测模型和实现的原理,是我个人的理解,里面还有各种细节还需要去查看xgboost的原文和别的博客的介绍。

<think>好的,用户想了解XGBoost的工作原理,属于机器学习算法方面的内容。我需要结合之前提供的引用资料来组织回答。首先,用户可能对集成学习有一定了解,但需要深入XGBoost的具体机制。 根据引用[2],XGBoost是基于Boosting思想的前向加法模型,将多个弱学习器组合成强学习器。每个弱学习器预测的是之前模型的残差,然后累加结果。这应该是XGBoost的核心机制,需要详细解释。 接下来,需要提到目标函数的构建。XGBoost的目标函数包括损失函数和正则化项,正则化控制模型复杂度,防止过拟合。这里可能需要数学公式,比如目标函数的形式:$Obj(\theta) = L(\theta) + \Omega(\theta)$,其中L是损失函数,Ω是正则项。 然后,关于梯度提升的具体步骤。引用[2]提到,XGBoost在每一步添加使目标函数下降最快的树。这里涉及到泰勒展开近似目标函数,计算一阶和二阶导数。可能需要写出泰勒展开后的表达式,比如$Obj^{(t)} \approx \sum_{i=1}^n [g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i)] + \Omega(f_t)$,其中g和h是梯度和二阶导数。 分裂节点的算法部分,XGBoost使用贪心算法,寻找最优分裂点。这里需要解释增益公式,比如$Gain = \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} - \gamma$,并说明如何通过最大增益选择分裂特征和值。 还要提到工程优化,比如引用[3]中的直方图算法和并行学习,虽然LightGBM更强调这些,但XGBoost也有类似的处理,比如预排序和缓存优化,以加快计算速度。 最后,总结XGBoost的优势,比如高效、灵活、正则化等,并结合引用[1]中的内容,说明其在分类、回归、排序等任务中的应用。 用户可能需要进一步的细节,比如与其他算法(如LightGBM)的区别,或者实际应用案例。但当前问题主要聚焦在原理上,所以需要保持回答的结构清晰,逐步展开各个核心点,并适当使用数学公式和引用支持。</think>### XGBoost工作原理分步解析 XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升框架的高效机器学习算法,其核心原理可分为以下四个关键部分: #### 1. 加法模型与残差学习 采用**前向分步加法模型**,通过迭代生成$K$棵决策树实现预测: $$ \hat{y}_i = \sum_{k=1}^K f_k(x_i) $$ 每棵树的预测目标为前序模型的残差: $$ f_k(x_i) = y_i - \hat{y}_i^{(k-1)} $$ 这种残差学习机制使模型能逐步修正误差[^2]。 #### 2. 正则化目标函数 目标函数包含损失函数$L$和正则化项$\Omega$: $$ Obj(\theta) = \sum_{i=1}^n L(y_i, \hat{y}_i) + \sum_{k=1}^K \Omega(f_k) $$ 其中正则化项控制模型复杂度: $$ \Omega(f) = \gamma T + \frac{1}{2}\lambda||w||^2 $$ $T$为叶子节点数,$w$为叶子权重,$\gamma$和$\lambda$为超参数[^1]。 #### 3. 梯度提升与泰勒展开 通过泰勒二阶展开近似目标函数: $$ Obj^{(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) $$ 其中: - $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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值