机器学习:梯度提升树(GBDT)——基于决策树的树形模型

梯度提升树(Gradient Boosting Decision Trees,GBDT)是一种强大的机器学习方法,广泛用于回归和分类任务。它通过构建一系列决策树来优化模型的预测能力,基于梯度提升框架,使得每一棵树都试图纠正前一棵树的错误。

**注:**文章中的 x = (f1,f2,...,fn)是一个特征向量,fn 为 x 的一个特征。

GBDT基本原理

GBDT 的基本思想是:GBDT通过一棵棵新增的树来修正前面模型的误差。在每一轮迭代中,GBDT会构建一棵新树,这棵树的作用是拟合当前模型在训练数据上的残差(即预测值和真实值之间的误差),逐步改进模型的预测能力。它是一个集成学习方法,采用了"加法模型 "和"梯度下降"思想。

1、加法模型

GBDT 是一种加法模型,即每一轮迭代都会新增一棵决策树,通过将新的树加到现有模型 F(x)中来改善预测。假设我们要构建的模型为 F(x),每一轮迭代的目标是通过拟合残差来更新模型。

2、构建初始模型

  • 对于分类问题(以二分类问题为例),初始模型为对数几率:

其中p为样本中类别1的概率。

  • 对于回归问题,初始模型一般为训练集目标值的均值:

3、GBDT迭代过程

3.1 假设模型的预测值(即所求模型,待优化)为:

上述说的步长γM​是一个学习率,控制树的贡献大小,通常通过交叉验证等方法选择合适的值。

3.3 目标损失函数L

  • 对于回归任务,常用的损失函数是均方误差(MSE):
  • 对于二分类任务,常用的损失函数是对数损失函数:
  • 对于多分类任务,常用的损失函数是交叉熵损失函数:

3.4 计算梯度

  • 计算负梯度:在第 M 轮迭代时,计算损失函数L相对于预测值的负梯度(即求损失函数在xi处的一阶导数值,再取负)。

(以MSE损失函数为例)对于样本i,负梯度计算公式为:

3.5 训练新树拟合误差(负梯度)

每一轮迭代的目标是训练一棵决策树 ,使这棵决策树的预测值尽可能接近模型的误差(或者叫残差)。加上这一近似误差,就修正了部分预测的误差,得到了预测误差更小的模型(对照3.1的公式)。这是一个重复M次迭代的过程。

  • 上面的论述中,为什么要 加上这一近似误差,而不是减呢?我们往下看。

  • 讲一下梯度下降思想:沿负梯度方向修正误差

GBDT优化的核心思想之一是梯度下降。在每一轮迭代中,我们希望模型能沿着损失函数的负梯度方向进行优化。梯度等同于模型的误差或残差 。这么理解,损失函数的损失方向是正方向,那么其反方向就是修正损失的方向,再俗一点讲,修正误差就是误差(梯度)的相反数,修正误差就是损失函数的负梯度。因此, 加上的误差,实际上应该是加上误差的相反数(即负梯度或修正误差),要用加号。

  • 那怎么训练这颗决策树呢?

1、首先,通过计算负梯度,我们得到了每个样本 i 的修正误差

2、接着,修正误差与特征向量x结合,我们得到一个新数据集(x1,g1),... ,(xn,gn),

其中,每个数据集的xi是特征向量,修正误差gi为目标变量

3、根据这个新数据集训练决策树 ,使得对于一个未知的x,我们能预测出修正误差

(决策树的具体训练过程参考另一篇文章:A)

  1. 5 更新模型预测值

训练一棵决策树 后,我们再结合学习率,更新模型

3.6 迭代M次,不断优化模型(M是一个超参数,通常由交叉验证等方法来选择合适的值)

4、最终模型

经过 M 次迭代,最终模型的预测结果是所有决策树的加权和,即:

步骤总结

  • 初始模型:建立一个初始预测模型。

  • 残差计算:在每一轮迭代中,计算上一个模型的预测误差(纠正误差/残差)。

  • 拟合残差:通过训练一个新的决策树(弱学习器)来拟合这些残差。新模型的目的是减少之前模型在数据上的误差。

  • 更新模型:将新训练的决策树加入到当前模型中,通常通过一个学习率参数来调节新模型的贡献。这一步就是提升的过程,即逐步优化模型以减小误差。

  • 重复迭代:通过多个迭代,不断引入新的决策树,每次迭代都尽量减少当前模型的损失,逐步逼近最优解。

GBDT的优点

  • 适合处理非线性数据:GBDT 通过构建多棵决策树的方式,能够灵活地拟合数据中的非线性特征。

  • 对数据预处理要求较低:GBDT 不需要对数据进行严格的标准化或正则化处理,能够自动处理不同的特征尺度。此外,它对缺失值也比较鲁棒。

  • 处理多种数据类型 :GBDT 适合处理类别特征和数值特征,且对类别特征不需要特别的编码(如独热编码),直接输入即可。(特征编码可以参考文章:B)

  • 鲁棒性高,抗过拟合能力强:GBDT在处理异常值和噪声数据时表现较好。由于它采用集成学习的方式,并通过提升(boosting)算法逐步修正错误,模型对数据中的噪声不敏感,具有较好的鲁棒性。。

  • **灵活性和扩展性:**GBDT不仅适用于回归和分类任务,还可以扩展到排序、异常检测等任务。GBDT可以根据任务的不同,选择不同的损失函数,比如平方损失、对数损失等,从而适应多种不同类型的问题。

  • **高准确性和强泛化能力:**GBDT结合了多个弱学习器的预测结果,能够有效地降低误差,具有较强的泛化能力。它在许多实际应用中表现出色,尤其是在复杂的非线性问题中能够获得高准确度。

  • **强大的特征选择能力:**由于GBDT也基于决策树,构建过程中会不断选择分裂特征来最大化信息增益,因此它天然具备特征选择的功能。GBDT可以对特征的重要性进行排序,从而帮助我们识别哪些特征对预测结果最为重要。

GBDT的缺点

  • **计算效率较低,训练速度慢:**GBDT模型的训练过程是串行的,每棵树都依赖于前一棵树的结果,因此无法并行化。随着树的数量增加,训练时间会显著增长,特别是在大数据集上的表现不够理想。此外,由于每棵树的构建都需要多次计算分裂点,所以计算成本较高。

  • **容易过拟合:**由于GBDT会逐步叠加新的树来减少训练误差,在数据量较小或特征过多的情况下,模型可能会学习到噪声数据,从而导致过拟合。尽管可以通过设置学习率、树的最大深度、树的数量等参数来进行控制,但仍然难以完全避免过拟合。

  • **对参数敏感,调参复杂:**GBDT有多个超参数需要调节,比如学习率、树的数量、最大深度、叶子节点数等。不同数据集可能需要不同的参数组合,参数调优过程较为复杂且耗时,特别是在大数据集上,调参成本会进一步增加。

  • **对缺失值敏感:**传统GBDT无法直接处理缺失值。与XGBoost等改进版本不同,GBDT通常要求在数据预处理阶段处理缺失值,比如填补或删除缺失值,否则可能会影响模型的性能。

  • **内存占用较大:**随着树的数量增加,GBDT的内存占用会迅速增大。尤其在大规模数据上,GBDT可能占用大量的内存资源,对于计算资源要求较高。

  • **不适合高维稀疏数据:**GBDT在处理高维稀疏数据(如文本数据或其他表示方式稀疏的特征)时表现较差。由于决策树的分裂过程依赖于特征的具体数值,GBDT在这类数据上效率较低。相比之下,线性模型或者神经网络在稀疏数据上的表现可能更好。

随机森林 vs GBDT

**#**文章内容来源于各渠道整理。若对大噶有帮助的话,希望点个赞支持一下叭!

**#**文章如有错误,欢迎大噶指正!

相关推荐
海棠AI实验室15 分钟前
AI的进阶之路:从机器学习到深度学习的演变(三)
人工智能·深度学习·机器学习
Lenyiin16 分钟前
01.02、判定是否互为字符重排
算法·leetcode
鸽鸽程序猿32 分钟前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd32 分钟前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo61736 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v41 分钟前
leetCode43.字符串相乘
java·数据结构·算法
A懿轩A2 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
古希腊掌管学习的神2 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
云边有个稻草人2 小时前
【优选算法】—复写零(双指针算法)
笔记·算法·双指针算法
半盏茶香2 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法