GBDT与XGBOOST的联系和区别

本文详细介绍了GBDT(Gradient Boosting Tree)与XGBoost的原理及区别,包括Boosting的概念、GradientBoosting的工作机制,以及XGBoost如何通过使用牛顿法优化和引入正则项等方式改进模型。

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

最近翻阅了一些介绍GBDT与XGBOOST的原理的博客和论文,网上以及有很多介绍它们的文章了,但博主还是想记录一下它们的原理以及自己的理解,即是方便自己翻阅复习也是希望大佬们提提建议。

GBDT

GBDT即是Gradient Boosting Tree(梯度提升树),很容易联想到的是这里的梯度提升与Gradient Descend(梯度下降)之间的关系。不去理解这个“Boosting ”,单通过翻译的“提升”,想到的一定是以为提升树是在Gradient Descend更新系数时将“-”号改为“+”的提升(我就是这么想的),然而并不是。这里就需要引入“boosting”的概念。

Boosting

Boosting 算法是一种加法模型(additive training),在《机器学习实战》书中讲了一种Boosting叫adboosting,就是用了同样的方法。对一个数据集,建立M个模型,而这些模型非常简单,称为“弱分类器”。
Boosting贯彻“知错就改”的思想,每个分类器上每次分类都将上一次分错的数据权重提高一点再进行分类,这样最终得到的分类器在测试数据与训练数据上都可以得到比较好的成绩。于是越往后执行,训练出的模型就越会在意那些容易分错(权重高)的点。
最终得到M个模型,将这些模型按照权重加起来就得到了最终的模型。

Gradient Boosting

Gradient Boosting是一种Boosting的方法,它主要的思想是,每一次建立模型是在之前建立模型损失函数的梯度下降方向(这里不解释梯度下降的问题,主要介绍Gradient Boosting),朝着梯度下降的方法表明模型在越来越好。Gradient Boosting是怎样的,可以用一个简单的例子来描述:
这里写图片描述

这里利用后三列的特征来拟合Age这个目标,这里用LikesGardening特征来建立回归树模型,

这里写图片描述

得到的结果如下图:
这里写图片描述
图中Age是我们要预测的目标,Tree1为我们预测得到的第一组预测值,Tree1 Residual 是Predictions与真实值的差,利用下一棵回归树以PlaysVideoGames 为特征对第一棵树的Tree1 Residual进行拟合,

这里写图片描述

并将Tree2得到的预测结果与Tree1得到的预测结果进行相加,得到结果:
这里写图片描述
也由最后的SEE结果可以看出Combine的结果比Tree1的结果要好,之后再用Tree3对Tree2的残差进行拟合,以此类推。
这样其实就是Gradient Boosting的思想了。梳理下上面的思路,可以得到这样的模型:
这里写图片描述
于是可以得到最终函数:
这里写图片描述
这里写图片描述
这里g(x)为回归树,最终函数等于每次迭代的增量的累加和。

Gradient Boosting Tree

以本人的理解方式用比较长的篇幅介绍了Gradient Boosting,再回到GBDT,GBDT的模型 F 定义为加法模型:
这里写图片描述
其中,x为输入样本,h为分类回归树,w是分类回归树的参数,a是每棵树的权重。这里h也就是Gradient Boosting里的g(x)。
通过最小化损失函数求解最优模型:
这里写图片描述
于是在每次更新Gradient Boosting Tree 模型时,需要重新计算(a,w),下面是Gradient Boosting Tree 算法的原理:
这里写图片描述
看上去貌似很麻烦但仔细观察下,其实万变也不离上面的最小化损失函数和梯度下降,主要是计算w*和p*,如果不理解公式应该再回味下之前的公式。

XGBOOST

在理解XGBOOST时,需要借助GBDT的理解,并对两者进行对比,这样的方法更有效率。

XGBOOST与GBDT第一个区别:牛顿法

GBDT 在函数空间中利用梯度下降法进行优化
XGBoost 在函数空间中用牛顿法进行优化
牛顿法看似比较陌生,在GBDT中梯度下降只是一阶泰勒公式展开,牛顿法就是二阶的泰勒公式展开,在参数空间中:
这里写图片描述
为了简化分析过程,假设参数是标量(即 只有一维),则可将一阶和二阶导数分别记为 g 和 h:
这里写图片描述
博客上写公式还不会,直接截图,牛顿法比较好理解。
牛顿法的优化方法
在函数空间中的牛顿法boosting与梯度boosting思想一样,只是f(x)函数变了:
这里写图片描述
之后还是最终函数等于每次迭代的增量的累加和:
这里写图片描述

XGBOOST的目标函数

样本进行预测:
这里写图片描述
这里k是树的数量,这里写图片描述是全部的回归树集合,而f就是其中一个回归树。
这里写图片描述

接下来看XGBOOST的目标函数,
这里写图片描述
这里写图片描述
误差函数可以是square loss,logloss等,正则项可以是L1正则,L2正则等。
将y的预测值带入:
这里写图片描述
模型要学习的只有第t棵树这里写图片描述
进行二阶泰勒展开,
这里写图片描述
其中:
这里写图片描述
去掉其中的常数项:
这里写图片描述
接下来讲公式的后面那个东西:正则项。

XGBOOST与GBDT的第二个区别:正则项

上面对GBDT中的分析可以知道它是没有正则项的,在XGBOOST中加入了正则项,但是正则项也不是XGBOOST首先加入的,并不是开创了先河。
正则项有什么作用呢?简单来说就是可以是的模型不容易过拟合。正则项对每棵回归树的复杂度进行了惩罚,而复杂度可以用树的深度,内部节点个数,叶子节点个数(T),叶节点分数(w)等来衡量。
首先对f(x)定义为:
这里写图片描述
这个定义也要代入在整个目标函数中。在XGBOOST中,复杂度可以用:
这里写图片描述
来表示,对叶子节点个数进行惩罚,相当于在训练过程中做了剪枝。

简化目标函数

带入正则项和f(x):
这里写图片描述
其中第一个约等于式子里:
这里写图片描述
将它们统一起来,定义每个叶节点j上的样本集合:
这里写图片描述
就成了后面的式子。定义:
这里写图片描述
可以得到:
这里写图片描述
如果确定了树的结构(即q(x)确定),为了使目标函数最小,可以令其导数为0,解得每个叶节点的最优预测分数为:
这里写图片描述
带入目标函数,得到最小损失函数,也就是我们的目标函数为:
这里写图片描述

XGBOOST的打分函数

这里写图片描述
标红部分衡量了每个叶子节点对总体损失的的贡献,我们希望损失越小越好,则标红部分的值越大越好。
Gain函数:
这里写图片描述
这里是摘自其他博客的对这个公式的解释,比较形象:
这里写图片描述
这个公式可以分解为:1)新左叶上的得分2)新右叶上的得分3)原叶上的得分4)附加叶上的正则化
所以当对一个叶节点分割时,计算所有候选(feature,value)对应的gain,选取gain最大的进行分割。
这里写图片描述

XGBOOST与GBDT的其他区别

  1. 对每颗子树增加一个参数,使得每颗子树的权重降低,防止过拟合,增加这个参数叫shrinkage方法。对特征进行降采样,灵感来源于随机森林,除了能降低计算量外,还能防止过拟合。
  2. 增加处理缺失值的方案(通过枚举所有缺失值在当前节点是进入左子树,还是进入右子树更优来决定一个处理缺失值默认的方向)。
  3. 对每个特征进行分块(block)并排序,使得在寻找最佳分裂点的时候能够并行化计算.这个结构加速了split finding的过程,只需要在建树前排序一次,后面节点分裂时直接根据索引得到梯度信息。这是xgboost比一般GBDT更快的一个重要原因。
    这里写图片描述
  4. out-of-core 通过将block压缩(block compressoin)并存储到硬盘上,并且通过将block分区到多个硬盘上(block Sharding)实现了更大的IO 读写速度,因此,因为加入了硬盘存储block读写的部分不仅仅使得xgboost处理大数据量的能力有所提升,并且通过提高IO的吞吐量使得xgboost相比一般实利用这种技术实现大数据计算的框架更快。

参考文献

  1. wepon.me/files/gbdt.pdf
  2. http://www.52cs.org/?p=429
  3. http://xgboost.readthedocs.io/en/latest/model.html
  4. https://www.cnblogs.com/LeftNotEasy/archive/2011/01/02/machine-learning-boosting-and-gradient-boosting.html
  5. http://blog.kaggle.com/2017/01/23/a-kaggle-master-explains-gradient-boosting/
  6. https://www.zhihu.com/question/41354392
### GBDTXGBoost的主要区别及对比分析 #### 1. 基本定义 GBDT(Gradient Boosting Decision Tree)是一种基于决策树的集成学习方法,其核心思想是通过迭代的方式逐步构建弱分类器并将其组合成强分类器。每次迭代都会根据前一次预测的结果计算残差,并尝试拟合这些残差来减少整体误差[^5]。 XGBoost则是GBDT的一种高效实现版本,由陈天奇博士开发,不仅继承了GBDT的核心思想,还在此基础上进行了多项优化,显著提高了模型的训练速度预测精度[^2]。 --- #### 2. 泰勒展开的应用 XGBoost在目标函数的设计中引入了二阶导数的信息,通过对损失函数进行泰勒展开近似处理,使得优化过程更加精确。这种做法能够更全面地捕捉数据中的非线性特性,从而提高模型的表现能力[^1]。 相比之下,传统的GBDT仅依赖于一阶导数(即梯度信息),忽略了更高阶的信息,在某些复杂场景下可能无法达到最优效果。 --- #### 3. 正则化项的加入 为了防止过拟合,XGBoost在其目标函数中加入了正则化项,包括L1正则化(Lasso)L2正则化(Ridge)。这有助于控制模型复杂度,使最终得到的模型更具泛化能力。 而标准的GBDT通常不显式包含这样的正则化机制,因此在面对噪声较多的数据集时可能会表现出较差的鲁棒性。 --- #### 4. 特征分裂策略 在节点划分过程中,XGBoost采用了更为精细的特征选择方式——它会综合考虑增益得分以及对应的代价因子,确保每一次分割都能带来最大的收益。此外,XGBoost支持稀疏感知分裂技术,对于含有缺失值的情况也能自动找到最佳切分点。 GBDT虽然也具备一定的特征重要性权重评估功能,但在实际操作层面往往显得较为简单粗暴,缺乏像XGBoost那样灵活高效的解决方案。 --- #### 5. 并行计算的支持 得益于底层C++框架的强大支撑,XGBoost充分利用多核CPU资源实现了列块级别的并行加速,大幅缩短了整个训练周期的时间消耗。此同时,该工具包还兼容GPU硬件环境下的高性能运算模式,进一步拓宽了适用范围。 传统意义上的GBDT由于序列化的本质属性限制,难以直接利用现代计算机体系结构的优势来进行快速部署应用。 --- #### 6. 缺失值处理 当遇到样本存在部分字段为空的情形时,XGBoost内置了一套专门设计好的默认方向填充逻辑,默认情况下会选择让实例沿着左子树或者右子树前进,以此最大程度保留原始分布规律不变形。 而在常规版GBDT里,则一般采用简单的均值填补法或者其他固定数值替代手段应对这种情况,显然不如前者那么智能化且适应性强。 --- ```python import xgboost as xgb from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split # 构造模拟数据集 X, y = make_classification(n_samples=1000, n_features=20, random_state=42) # 划分训练集测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 定义DMatrix对象供后续调用 dtrain = xgb.DMatrix(X_train, label=y_train) dtest = xgb.DMatrix(X_test, label=y_test) # 设置参数配置字典 params = { 'objective': 'binary:logistic', 'eval_metric': 'error', 'max_depth': 6, 'eta': 0.3, } # 开始训练流程 bst = xgb.train(params=params, dtrain=dtrain, num_boost_round=100, evals=[(dtest,'eval')], early_stopping_rounds=10) ``` 上述代码片段展示了如何借助`xgboost`库完成基本建模任务的过程演示。 --- ### 总结 综上所述,尽管GBDT作为一种经典的机器学习算法已经取得了广泛的成功,但随着需求日益增长技术不断进步,人们迫切需要一种更快更强的新一代替代品。正是在这种背景下诞生出来的XGBoost凭借诸多技术创新成功脱颖而出成为当前最流行的开源项目之一[^3]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值