GBDT 以及 xgboost 总结一

本文深入解析GBDT和XGBoost的工作原理,强调XGBoost在特征选择、数值优化及模型复杂度控制方面的优势。介绍XGBoost如何利用二阶导数信息优化损失函数,加入正则项防止过拟合,以及通过缩减、列抽样等策略提高模型效率。

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

GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量

同时GBDT是以决策树(CART)为基学习器的GB算法,是迭代树,而不是分类树。

https://blog.youkuaiyun.com/nathan1025/article/details/81174311

http://djjowfy.com/2017/08/01/XGBoost%E7%9A%84%E5%8E%9F%E7%90%86/

xgboost:常用来做特征选择

Xgboost相比于GBDT来说,更加有效应用了数值优化,最重要是对损失函数(预测值和真实值的误差)变得更复杂。目标函数依然是所有树的预测值相加等于预测值。

or   

直观上看,目标要求预测误差尽量小,叶子节点尽量少,节点数值尽量不极端(这个怎么看,如果某个样本label数值为4,那么第一个回归树预测3,第二个预测为1;另外一组回归树,一个预测2,一个预测2,那么倾向后一种,为什么呢?前一种情况,第一棵树学的太多,太接近4,也就意味着有较大的过拟合的风险)

https://zhuanlan.zhihu.com/p/34534004

那么如何得到优秀的组合树呢?

一种办法是贪心算法,遍历一个节点内的所有特征,按照公式计算出按照每一个特征分割的信息增益,找到信息增益最大的点进行树的分割。增加的新叶子惩罚项对应了树的剪枝,当gain小于某个阈值的时候,我们可以剪掉这个分割。但是这种办法不适用于数据量大的时候,因此,我们需要运用近似算法。

另一种方法:XGBoost在寻找splitpoint的时候,不会枚举所有的特征值,而会对特征值进行聚合统计,按照特征值的密度分布,构造直方图计算特征值分布的面积,然后划分分布形成若干个bucket(桶),每个bucket的面积相同,将bucket边界上的特征值作为splitpoint的候选,遍历所有的候选分裂点来找到最佳分裂点。

上图近似算法公式的解释:将特征k的特征值进行排序,计算特征值分布,rk(z)表示的是对于特征k而言,其特征值小于z的权重之和占总权重的比例,代表了这些特征值的重要程度,我们按照这个比例计算公式,将特征值分成若干个bucket,每个bucket的比例相同,选取这几类特征值的边界作为划分候选点,构成候选集;选择候选集的条件是要使得相邻的两个候选分裂节点差值小于某个阈值。

  • 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
  • xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
  • Shrinkage(缩减),相当于学习速率(xgboost中的eta)。每次迭代,增加新的模型,在前面成上一个小于1的系数,降低优化的速度,每次走一小步逐步逼近最优模型比每次走一大步逼近更加容易避免过拟合现象;
  • 列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样(即每次的输入特征不是全部特征),不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
  • 忽略缺失值:在寻找splitpoint的时候,不会对该特征为missing的样本进行遍历统计,只对该列特征值为non-missing的样本上对应的特征值进行遍历,通过这个工程技巧来减少了为稀疏离散特征寻找splitpoint的时间开销
  • 指定缺失值的分隔方向:可以为缺失值或者指定的值指定分支的默认方向,为了保证完备性,会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,分到那个子节点带来的增益大,默认的方向就是哪个子节点,这能大大提升算法的效率。
  • 并行化处理:在训练之前,预先对每个特征内部进行了排序找出候选切割点,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行,即在不同的特征属性上采用多线程并行方式寻找最佳分割点https://blog.youkuaiyun.com/anshuai_aw1/article/details/83025168
### 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]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值