关于GBDT算法、XGBoost算法的基本原理概述

GBDT

梯度提升决策树GBDT是一种利用残差拟合弱学习器的集成算法,该算法是由Boosting中最具代表性的Adaboost算法演变而来,其中各个基学习器之间并不独立,是一种串行关系。

GBDT的基本思想就是每次学一点点,然后逐步逼近最终的预测值,即GBDT将当前预测结果的残差作为下一棵树的输入,不断迭代生成下一棵树,最终模型的结果为所有决策树的结果之和(GBDT 的目标就是要找到一颗使得残差最小的决策树)。

具体的,GBDT的各基分类器加法形式如下:
f k ( x ) = f ( k − 1 ) ( x ) + T ( x ; θ k ) f_k\left( x \right) =f_{\left( k-1 \right)}\left( x \right) +T\left( x;\theta _k \right) fk(x)=f(k1)(x)+T(x;θk)

其中, f k − 1 ( x ) f_{k-1}\left(x\right) fk1(x) 为第 k-1 阶段的基学习器, f k ( x ) f_k\left(x\right) fk(x) 为第k阶段的基学习器(即下一轮模型),通过损失函数最小化确定下一棵决策树的参数 θ k \theta_k θk

由此可以得到GBDT的平方损失函数及其导数如下:
l ( y , f k ( x ) ) = 1 2 ( y − f k ( x ) ) 2 l\left( y,f_k\left( x \right) \right) =\frac{1}{2}\left( y-f_k\left( x \right) \right) ^2 l(y,fk(x))=21(yfk(x))2
− ∂ l ∂ f k ( x ) = y − f k ( x ) = 残差 -\frac{\partial l}{\partial f_k\left( x \right)}=y-f_k\left( x \right) =\text{残差} fk(x)l=yfk(x)=残差

事实上,GBDT模型的核心就是采用梯度下降法让损失函数尽可能快的不断减小,并且由于GBDT需要拟合的残差(负梯度)是连续数值,预测结果是通过累加所有树结果得到的,因此对于GBDT模型来说,在处理分类或者回归问题时,其弱学习器均为CART回归树。

总的来说,GBDT模型算法的优点非常明显,如GBDT模型有相对较多的损失函数,模型预测效果好,能够处理非线性数据,在存在异常数据时也有较强的鲁棒性。而GBDT缺点也比较突出,即每个基学习器的构建都需要等上一个学习器预测结束后才能开始,所以难以并行训练数据,效率上会比较慢;另外,GBDT的每一次选代都需要遍历所有特征来寻找最佳切分点,当特征个数非常多时,GBDT的训练复杂度会显著增大。

在这里插入图片描述

XGBoost

XGBoost算法(Extreme Gradient Boosting)本质还是GBDT算法,是传统GBDT算法的改进,主要包括三方面:

①传统的GBDT算法只利用了一阶的导数计算损失函数,而XGBoost对损失函数进行了二阶的泰勒展开,使得损失函数近似优化更接近真实值,求得模型最优解的效率变得更高;

②在损失函数中加上叶子节点权重和树的深度等正则项来控制模型的复杂度和稳定性,对决策树的生长加以合理的限制;

③对列进行采样,减少模型计算量。

由于XGBoost是GBDT的改进算法,同样也属于Boosting方法,因此每个基分类器之间为存在依赖关系的串行结构,对于每个基分类器的学习结果的残差都会作为下一个基学习器的输入,最后将所有基学习器的结果加起来得到最终结果。具体的,设通过训练好的前t-1棵树求得第t棵树为:

y ^ i ( t ) = y ^ i ( t − 1 ) + f t ( x i ) = Σ k = 1 t f k ( x i ) \hat{y}_{i}^{\left( t \right)}=\hat{y}_{i}^{\left( t-1 \right)}+f_t\left( x_i \right) =\Sigma _{k=1}^{t}f_k\left( x_i \right) y^i(t)=y^i(t1)+ft(xi)=Σk=1tfk(xi)

则XGBoost的目标函数如下:
O b j ( t ) = Σ i = 1 n l ( y i , y ^ i ( t ) ) + Ω ( f t ) + c o n s t a n t Obj^{\left( t \right)}=\Sigma _{i=1}^{n}l\left( y_i,\hat{y}_{i}^{\left( t \right)} \right) +\Omega \left( f_t \right) +constant Obj(t)=Σi=1nl(yi,y^i(t))+Ω(ft)+constant
Ω ( f k ) = γ T + 1 2 λ Σ j = 1 T ω j 2 \Omega \left( f_k \right) =\gamma T+\frac{1}{2}\lambda \Sigma _{j=1}^{T}\omega _{j}^{2} Ω(fk)=γT+21λΣj=1Tωj2

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 ) + c o n s t a n t Obj^{\left( t \right)}\approx \Sigma _{i=1}^{n}\left[ l\left( y_i,\hat{y}_{i}^{\left( t-1 \right)} \right) +g_if_t\left( x_i \right) +\frac{1}{2}h_if_{t}^{2}\left( x_i \right) \right] +\Omega \left( f_t \right) +constant Obj(t)Σi=1n[l(yi,y^i(t1))+gift(xi)+21hift2(xi)]+Ω(ft)+constant

其中,l部分为损失函数(如平方损失函数 l ( y i , y ^ i ( t ) ) = ( y i , y ^ i ( t ) ) 2 l\left( y_i,\hat{y}_{i}^{\left( t \right)} \right) =\left( y_i,\hat{y}_{i}^{\left( t \right)} \right) ^2 l(yi,y^i(t))=(yi,y^i(t))2)表示第t棵树模型; Ω ( f t ) \Omega \left( f_t \right) Ω(ft)为正则项, ω j \omega_j ωj 为第j个叶子节点的权重; γ \gamma γ λ \lambda λ 分别为正则项L1范数和L2范数的系数;constant部分为常数项。现对目标函数进行二阶泰勒展开,定义如下:

g i = ∂ y ^ ( t − 1 ) l ( y i , y ^ ( t − 1 ) ) g_i=\partial _{\hat{y}^{\left( t-1 \right)}}l\left( y_i,\hat{y}^{\left( t-1 \right)} \right) gi=y^(t1)l(yi,y^(t1))

h i = ∂ y ^ ( t − 1 ) 2 l ( y i , y ^ ( t − 1 ) ) h_i=\partial _{\hat{y}^{\left( t-1 \right)}}^{2}l\left( y_i,\hat{y}^{\left( t-1 \right)} \right) hi=y^(t1)2l(yi,y^(t1))

从公式中可以看出,XGBoost模型的目标函数只和各个数据项在损失函数的一阶、二阶导数有关,这使得XGBoost模型在运算效率上得到明显提升。

总的来说,XGBoost算法有很多优点,如支持多种类型的弱学习器、能够自动学习出缺失值的处理策略等。不过XGBoost模型也存在一定的不足,如模型时间复杂度高、内存占用高、参数调优比较繁琐等。

猜你喜欢

转载自blog.csdn.net/qq_42374697/article/details/127344876