ExtraTree|GBDT|XGBoost模型原理

1. 总述

ExtraTree、GBDT 和 XGBoost 都是基于决策树的算法。ExtraTree属于Bagging(装袋法)方法,GBDT和XGBoost则属于Boosting(提升树)方法,通过逐步优化残差(GBDT使用一阶导数,XGBoost结合了一阶和二阶导数)来生成树。由于引入了二阶梯度和正则化项,XGBoost 通常在准确性上优于传统的 GBDT。

2. ExtraTree

ExtraTree(Extremely Randomized Trees,极端随机树)主要基于随机选择特征和随机分割点构建决策树。在传统决策树中,一般通过某种准则(基尼系数或信息增益)来选择最优分割点。而ExtraTree 则通过完全随机的方式选择分割点,这样能提高了树的多样性,从而降低模型的方差。
假设当前节点的数据集为 D D D,特征空间为 R R R,ExtraTree 的分割准则为:

  1. 随机选择一个特征 X i ∈ R X_i\in R XiR
  2. 在特征 X i X_i Xi 的取值范围内,随机选取一个分割点 s s s,构建决策树的分裂:
    D left = { ( x , y ) ∈ D , x i ≤ s } , D right = { ( x , y ) ∈ D , x i > s } D_{\text{left}}=\{(x,y)\in D,x_i\leq s\},\quad D_{\text{right}}=\{(x,y)\in D,x_i>s\} Dleft={(x,y)D,xis},Dright={(x,y)D,xi>s}

分裂完成后重复该过程,直到满足停止条件(达到最大深度或节点样本数小于阈值)。对于某棵决策树,由于它的最佳分叉属性是随机选择的,因此用它来预测结果往往是不准确的,但多棵决策树组合在一起,就能达到很好的预测效果。通过多个极端随机树的集成,最终的预测是这些树预测结果的平均或投票。
在随机森林中,分割点(划分数据的阈值)是从随机选取的特征中通过信息增益或基尼值数等准则选取最优的分割点。但在 ExtraTree 中,分割点是随机选取的,而不是最优的。ExtraTree 因为不用计算最佳分割点,相比于随机森林,训练速度快得多。

3. GBDT

在GBDT中,当损失函数选用均方误差损失GBDT(Gradient Boosting Decision Trees,梯度提升决策树)是一种Boosting(提升树)算法,它通过训练一系列的弱学习器(通常是决策树)来逐步改进模型的性能。与随机森林中的**Bagging(装袋法)**不同,GBDT 的核心思想是每棵树都基于前一棵树的错误进行学习。具体来说:

  1. 初始模型是一个简单的预测,比如训练集目标值的均值。
  2. 后续的每棵树学习的是前一个模型的残差,即模型预测值与真实值之间的差异。
  3. 通过逐步修正误差,GBDT 最终构建出一个强大的模型。

注:残差表示的是真实值与模型预测值之间的差异,可以表示为:
r i = y i − y i ^ r_i=y_i−\hat{y_i} ri=yiyi^

在GBDT中,当损失函数选用均方误差损失时,每一次拟合的值就是残差值(真实值-预测值),均方误差损失函数如下:
L ( y , F ( x ) ) = ( y − F ( x ) ) 2 L(y,F(x))=(y−F(x))^2 L(y,F(x))=(yF(x))2

为了求导方便,在损失函数前面乘以 1 2 \frac{1}{2} 21
L ( y , F ( x ) ) = 1 2 ( y − F ( x ) ) 2 L(y,F(x))=\frac{1}{2}(y−F(x))^2 L(y,F(x))=21(yF(x))2

此时梯度:
[ ∂ L ( y , F ( x ) ) ∂ F ( x ) ] = F ( x ) − y [\frac{∂L(y,F(x))}{∂F(x)}]=F(x)-y [F(x)L(y,F(x))]=F(x)y

负梯度:
− [ ∂ L ( y , F ( x ) ) ∂ F ( x ) ] = y − F ( x ) −[\frac{∂L(y,F(x))}{∂F(x)}]=y-F(x) [F(x)L(y,F(x))]=yF(x)

即此时负梯度等于残差,拟合残差也就是拟合负梯度,但是当损失函数不是均方误差时,残差不一定等于负梯度。后续的原理均基于损失函数选用均方误差损失的假设上,即残差等于负梯度


GBDT的每棵树都是通过优化上一步模型的残差来生成。其目标是最小化损失函数 L ( y , F ( x ) ) L(y,F(x)) L(y,F(x)),其中 F ( x ) F(x) F(x) 是模型的预测值, y y y 是真实标签。对于第 m m m 棵树,模型的预测函数(模型更新策略)为:
F m ( x ) = F m − 1 ( x ) + ν ⋅ h m ( x ) F_m(x)=F_{m−1}(x)+ν⋅h_m(x) Fm(x)=Fm1(x)+νhm(x)

其中 v v v 是学习率(步长), h m ( x ) h_m(x) hm(x) 是通过拟合负梯度(梯度是损失函数相对于预测值的变化率)生成的回归树,负梯度的计算公式为:
g m ( x ) = − [ ∂ L ( y , F ( x ) ) ∂ F ( x ) ] F ( x ) = F m − 1 ( x ) g_m(x)=−[\frac{∂L(y,F(x))}{∂F(x)}]_{F(x)=F_{m−1}(x)} gm(x)=[F(x)L(y,F(x))]F(x)=Fm1(x)

其中, F ( x ) = F m − 1 ( x ) F(x)=F_{m−1}(x) F(x)=Fm1(x) 表示在计算梯度时,使用的是前 m − 1 m-1 m1 棵树的预测值。第 m m m 棵树的任务是拟和残差值(将每个样本的残差作为其目标变量,原始样本的特征变量不变),即新树 h m ( x ) h_m(x) hm(x) 的目标是尽量逼近残差 g m ( x ) g_m(x) gm(x),使得:
h m ( x ) ≈ g m ( x ) h_m(x)\approx g_{m}(x) hm(x)gm(x)

以便缩小预测值和真实值之间的差距。GBDT模型图示如下:
在这里插入图片描述

举个简单例子
假设某人的真实身高是180 cm,初始模型的预测值为170 cm,残差为180−170=10 cm。此时,新树会尝试拟合这个 10 cm 的残差,假设新树拟合出一个 8 cm 的输出,此时假设学习率 ν = 1 ν=1 ν=1,那么新的预测值为: 170   c m + 8   c m = 178   c m 170 cm+8 cm=178 cm 170 cm+8 cm=178 cm。此时,模型的预测已经从 170 cm 提升到了 178 cm,比之前更加接近真实的 180 cm。然后模型会继续拟合剩下的残差(180−178=2 cm),通过再加入一棵树继续调整预测值,直到模型预测的结果非常接近真实值。

4. XGBoost

XGBoost(Extreme Gradient Boosting,极端梯度提升)通过构建多个弱学习器来逐步提升模型的性能。每一棵新加入的树都用于拟合当前模型的残差,从而逐步减少误差并提高模型的预测能力,XGBoost模型图示如上图(GBDT模型图示)。XGBoost 核心思想与 GBDT 类似,但增加了正则化项,用于控制模型的复杂度,防止过拟合,并通过二阶导数进行优化。在 GBDT 和 XGBoost 中,使用增益(Gain,区别于ID3算法中的信息增益)作为衡量标准来选择特征(用作分裂特征或者构建有价值的特征子集),增益定义为分裂前后损失函数的减少量,增益越大,说明该特征及其分裂点在该节点上的分裂效果越好。具体步骤是:

  1. 对于每个特征,计算所有可能的分裂点。
  2. 对每个分裂点,计算分裂前后的损失,并找到能最大化增益的特征和分裂点。

XGBoost 中的增益公式为:
G a i n = 1 2 ( G l e f t 2 H l e f t + λ + G r i g h t 2 H r i g h t + λ − ( G l e f t + G r i g h t ) 2 H l e f t + H r i g h t + λ ) − γ \mathrm{Gain}=\frac{1}{2}\left(\frac{G_{\mathrm{left}}^2}{H_{\mathrm{left}}+\lambda}+\frac{G_{\mathrm{right}}^2}{H_{\mathrm{right}}+\lambda}-\frac{(G_{\mathrm{left}}+G_{\mathrm{right}})^2}{H_{\mathrm{left}}+H_{\mathrm{right}}+\lambda}\right)-\gamma Gain=21(Hleft+λGleft2+Hright+λGright2Hleft+Hright+λ(Gleft+Gright)2)γ

其中:
G l e f t G_{left} Gleft G r i g h t G_{right} Gright 是左右子节点的一阶导数和;
H l e f t H_{left} Hleft H r i g h t H_{right} Hright 是左右子节点的二阶导数和;
λ \lambda λ 是正则化项,用于限制模型的复杂度;
γ \gamma γ 控制分裂时的惩罚项,防止生成过多的叶节点。

在构建每棵树的过程中,XGBoost 会遍历所有特征及其所有可能的分裂点,计算每个分裂后的增益值,并选择增益最大的特征和分裂点。


XGBoost 的目标是最小化正则化的损失函数:
L ( θ ) = ∑ i = 1 n l ( y i , y ^ i ) + Ω ( f t ) L(\theta)=\sum_{i=1}^nl(y_i,\hat{y}_i)+\Omega(f_t) L(θ)=i=1nl(yi,y^i)+Ω(ft)

其中, l ( y i , y ^ i ) l(y_i,\hat{y}_i) l(yi,y^i) 是预测误差, Ω ( f t ) \Omega(f_t) Ω(ft)表示构建的第 t t t 棵决策树 f k f_k fk的正则化项,用来控制树的复杂度,通常定义为:
Ω ( f k ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega(f_k)=\gamma T+\frac{1}{2}\lambda\sum_{j=1}^Tw_j^2 Ω(fk)=γT+21λj=1Twj2

T T T 是树的叶节点数, w j w_j wj 是叶节点权重, γ \gamma γ λ \lambda λ 是超参数,分别控制树的复杂度和正则化强度。

XGBoost 通过一阶和二阶导数(即梯度和 Hessian 矩阵)来近似损失函数的变化,假设当前的预测为 y ^ i ( t ) \hat{y}_i^{(t)} y^i(t),对损失函数 L ( θ ) L(\theta) L(θ)进行二阶泰勒展开,可以得到如下公式:
L ( t ) ≈ ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t ( x i ) 2 ] + Ω ( f t ) L^{(t)}\approx\sum\limits_{i=1}^n\left[g_if_t(x_i)+\frac{1}{2}h_if_t(x_i)^2\right]+\Omega(f_t) L(t)i=1n[gift(xi)+21hift(xi)2]+Ω(ft)

其中
g i = ∂ l ( y i , y ^ i ( t ) ) ∂ y ^ i ( t ) g_i=\frac{∂l(y_i,\hat{y}_i^{(t)})}{∂\hat{y}_i^{(t)}} gi=y^i(t)l(yi,y^i(t))

是一阶导数,
h i = ∂ 2 l ( y i , y ^ i ( t ) ) ∂ ( y ^ i ( t ) ) 2 h_i=\frac{\partial^2l(y_i,\hat{y}_i^{(t)})}{\partial(\hat{y}_i^{(t)})^2} hi=(y^i(t))22l(yi,y^i(t))

是二阶导数,通过拟合一阶导数和二阶导数,XGBoost 能够快速找到最优分裂点并更新模型。 f t ( x i ) f_t(x_i) ft(xi) 表示在第 t t t 棵树 f t f_t ft 对输入特征 x i x_i xi 的预测值, y ^ i ( t ) \hat{y}_i^{(t)} y^i(t) 表示模型对样本 x i x_i xi 的最终预测值:
y ^ i ( t ) = y ^ 0 + ∑ t = 1 T η ⋅ f t ( x i ) \hat{y}_i^{(t)}=\hat{y}_0+\sum_{t=1}^T\eta\cdot f_t(x_i) y^i(t)=y^0+t=1Tηft(xi)

其中, y ^ 0 \hat{y}_0 y^0是模型的初始预测值,通常为训练数据的均值。XGBoost 引入了Shrinkage(收缩)技术,用于降低模型的复杂度并防止过拟合。Shrinkage 主要通过学习率来控制每棵树对模型的贡献量。每棵树的输出会乘以一个学习率 η \eta η,使得模型更新过程更加平滑,防止过拟合。每棵树的输出 f t ( x i ) f_t(x_i) ft(xi)并不是直接给出预测值,而是给出对之前预测值的调整量,即第 t t t 棵树输出的值是对之前预测值的修正。

### XGBoost 工作原理概述 XGBoost 是一种基于梯度提升决策树 (GBDT) 的高效实现方法,通过多项优化提升了性能和准确性[^1]。该算法的主要特点在于其能够处理大规模数据集,并提供高效的并行计算能力。 #### 主要改进方面 1. **正则化项** 正则化被引入到目标函数中以防止过拟合现象的发生。具体而言,在损失函数基础上增加了L1 和 L2 范数惩罚项来约束模型复杂度,从而提高泛化能力[^3]。 2. **加权分位素描(Weighted Quantile Sketch)** 提出了带权重的分布式分位素描技术用于近似直方图构建过程中的分裂点查找操作。这项创新使得即使面对高维稀疏特征也能快速有效地找到最佳分割位置。 3. **列采样(Column Subsampling)** 类似于随机森林的做法,每次迭代时仅考虑部分选定属性参与节点划分判断;这不仅有助于减少内存占用量还进一步增强了抗噪性和鲁棒性[^4]。 #### 图解说明 为了更直观地理解上述机制如何协同作用,请参阅下述简化版流程示意: ![XGBoost工作原理](https://www.machinelearningplus.com/wp-content/uploads/2018/09/xgboost-algorithm-flowchart.png) 此图表展示了单棵树生长过程中所经历的关键步骤,包括但不限于样本选取、特征选择以及最终叶结点预测值更新等环节。值得注意的是,实际应用中会重复执行这些阶段直至满足预设条件为止(如达到最大深度限制或误差收敛标准),进而形成完整的弱分类器集合[^2]。 ```python from xgboost import plot_tree import matplotlib.pyplot as plt # 假定已训练好一个名为'xgb_model'的对象 plot_tree(xgb_model, num_trees=0) plt.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值