ExtraTree|GBDT|XGBoost模型原理
ExtraTree、GBDT 和 XGBoost 都是基于决策树的算法。ExtraTree属于Bagging(装袋法)方法,GBDT和XGBoost则属于Boosting(提升树)方法,通过逐步优化残差(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 的分割准则为:
- 随机选择一个特征 X i ∈ R X_i\in R Xi∈R
- 在特征 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,xi≤s},Dright={(x,y)∈D,xi>s}
分裂完成后重复该过程,直到满足停止条件(达到最大深度或节点样本数小于阈值)。对于某棵决策树,由于它的最佳分叉属性是随机选择的,因此用它来预测结果往往是不准确的,但多棵决策树组合在一起,就能达到很好的预测效果。通过多个极端随机树的集成,最终的预测是这些树预测结果的平均或投票。
在随机森林中,分割点(划分数据的阈值)是从随机选取的特征中通过信息增益或基尼值数等准则选取最优的分割点。但在 ExtraTree 中,分割点是随机选取的,而不是最优的。ExtraTree 因为不用计算最佳分割点,相比于随机森林,训练速度快得多。
3. GBDT
在GBDT中,当损失函数选用均方误差损失GBDT(Gradient Boosting Decision Trees,梯度提升决策树)是一种Boosting(提升树)算法,它通过训练一系列的弱学习器(通常是决策树)来逐步改进模型的性能。与随机森林中的 Bagging(装袋法)不同,GBDT 的核心思想是每棵树都基于前一棵树的错误进行学习。具体来说:
- 初始模型是一个简单的预测,比如训练集目标值的均值。
- 后续的每棵树学习的是前一个模型的残差,即模型预测值与真实值之间的差异。
- 通过逐步修正误差,GBDT 最终构建出一个强大的模型。
注:残差表示的是真实值与模型预测值之间的差异,可以表示为:
r i = y i − y i ^ r_i=y_i−\hat{y_i} ri=yi−yi^
在GBDT中,当损失函数选用均方误差损失时,每一次拟合的值就是残差值(真实值-预测值),均方误差损失函数如下:
L ( y , F ( x ) ) = ( y − F ( x ) ) 2 L(y,F(x))=(y−F(x))^2 L(y,F(x))=(y−F(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(y−F(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))]=y−F(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)=Fm−1(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)=Fm−1(x)
其中, F ( x ) = F m − 1 ( x ) F(x)=F_{m−1}(x) F(x)=Fm−1(x) 表示在计算梯度时,使用的是前 m − 1 m-1 m−1 棵树的预测值。第 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算法中的信息增益)作为衡量标准来选择特征(用作分裂特征或者构建有价值的特征子集),增益定义为分裂前后损失函数的减少量,增益越大,说明该特征及其分裂点在该节点上的分裂效果越好。具体步骤是:
- 对于每个特征,计算所有可能的分裂点。
- 对每个分裂点,计算分裂前后的损失,并找到能最大化增益的特征和分裂点。
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+λGright2−Hleft+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=1∑nl(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=1∑Twj2
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=1∑n[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))2∂2l(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=1∑Tη⋅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 棵树输出的值是对之前预测值的修正。
更多推荐
所有评论(0)