GBDT——梯度提升树算法详解

集成学习是机器学习的一种重要方法,集成学习中常用的思想主要是Bagging、Boosting、Stacking等,其中bagging思想最主要的代表就是随机森林算法,而boosting方法中最常见的代表是AdaBoost、GBDT、XGboost等,Boosting思想是通过串行多个弱学习器来构建强学习器模型,核心思想是通过不断迭代,将多个弱学习器的预测结果进行加权组合,从而产生一个更准去且泛化能力更强的模型,同时在这里提一下Bagging方法是并行将多个弱学习器组合来构建模型。在讲解GBDT提升树算法之前,我们先讲一下Gradient Boosting(梯度提升)思想,Gradient Boosting是将真实值与预测值之间的差异(也就是残差)作为弱学习器优化的目标。损失函数代表了模型对数据的拟合程度,如果说损失函数越小,代表模型对数据的拟合越小,通过多个弱学习对残差的优化,使损失函数不断下降,从而提高模型的性能。                

梯度提升算法流程如下: 

 梯度提升算法是梯度提升树基础,所以在讲解梯度提升树算法之前,我们先对梯度提升算法做一个了解,这样当后面子模型变换成树模型之后,大家才不会陌生,在讲解梯度提升算法之前,我们先做一下基础理论知识的铺垫,第一、梯度的知识,多元函数对每个参数求偏导,然后讲各个参数的偏导数组合成一个向量,这个向量就是偏导,几何意义是函数值增加最快的方向,例如\left ( \frac{\partial f}{\partial x},\frac{\partial f}{\partial x} \right );第二、梯度下降,优化模型的目标是最小化损失函数,梯度提升算法就是通过梯度下降的方式解决最小化损失函数的问题,即沿着负梯度方向一步一步接近最小值。以上就是我们做的一些基础知识储备,接下来我们将来讲解梯度提升算法。

我们首先初始化了一个算法模型,模型的公式如图中所示,代表我们使用了一个常数来使得真实值和常数之间的误差平方和最小,大家如果对之前的决策树内容有过学习应该知道,这个常数的取值是所有真实值的均值,也就是说我们在初始的预测中预测所有的样本观测值为真实值的均值。这样的结果只是说明预测值在总体上和真实值误差最小,但是从单个样本的角度来说,某些样本的统一均值的预测其实是与真实值差距较大的,因此我们需要一步一步向着梯度最小的方向去不断接近真实值。

接下来,我们进行了M轮的训练,分别对n个特征求偏导,得到一组梯度向量,在得到梯度向量之后,我们还需要一个沿着梯度向量走的步长,这个步长怎么计算呢?就是通过第二步中的三式,该式子的含义是选择一个使得真实值与(上一个模型预测值加上沿着梯度方向变化值的和)也就是这一轮沿着梯度方向下降之后的结果与真实值的平方误差最小的步长,后面会给大家一个事例展示,同时大家如果对损失函数求偏导可以得到,负的损失函数的偏导就是真实值与预测值的“残差”,因此,大家可以理解,后续子模型h(x)是对真实值和预测值之间“残差”不断优化调整,使得预测值和真实值不断逼近。

 对于梯度下降逼近我们可以使用一个简单案例进行展示

大家可以从这张图中看到,我们假设损失函数L=f^{2}+2f+1,损失函数最小的点是在(-1,0),但是我们目前是在(1,4)的位置,因此我们需要沿着梯度下降的方向不断逼近最小值,首先,我们对损失函数进行了求导,这代表了梯度,紧接着我们进行了下降之后的值更新,在原来值的基础上加上轮一个负的梯度方向4*\rho,这里\rho代表步长,我们怎么求得这个步长呢?选择的是使得所有真实值和我们新一轮真实值损失函数最小的步长\rho,大家看完这一段之后载回头看梯度提升算法应该会比较容易理解。

为了使得模型能够更精确地逼近最优结果,同时为了防止模型出现过拟合的倾向,提升模型的泛化能力,我们通常不会让模型下降太快,因此通常会在步长前面乘以一个学习率,减少模型在每轮梯度下降的步长:

F_{m} = F_{m-1}+v*\gamma _{m}h_{m}(x) 0<v<=1

在讲解完梯度提升算法之后,接下来给大家讲解我们经常使用的梯度提升树算法GBDT,GBDT算法是在前面梯度提升算法的基础上将优化残差的子模型采用Cart模型来进行优化,GBDT算法的流程如下:

和梯度提升模型一样,我们首先初始化一个模型,该模型的预测值是所有真实值的均值,然后,我们开始M轮模型的迭代更新,在每一轮子模型构建中,我们采用决策树模型来进行构建,通过决策树模型来不断拟合上一轮中真实值和预测值之间的“残差”,通过决策树子模型,我们可以利用数据的特征将数据划分到不同的叶子结点,再分别计算不同叶子结点中使得损失函数最小化的步长,计算完之后,新的模型就变成了原模型基础上加上一个使得残差不断减小的决策树子模型的结合,我们接下来将会使用实际案例进行展示。

案例数据
Holiday_FlagTemperatureFuel_PriceCPIUnemploymentWeekly_Sales
042.312.572211.09635828.1061643690.9
138.512.548211.24216988.1061641957.44
039.932.514211.28914298.1061611968.17

假设我们现在有三条关于销售额的数据,前五列代表会影响销售额的诸多因素,即数据特征,最后一列代表实际的销售额,接下来,我们将会使用这部分数据来模型提升树算法的流程,算法的第一步是初始化模型,模型的初始化是采用与所有真实值残差平方和最小的常数,易知该常数是所有真实值的均值,即(1643690.9+1641957.44+1611968.17) /3 = 1632538.837,这是第一次预测的结果。

第一次预测
Holiday_FlagTemperatureFuel_PriceCPIUnemploymentWeekly_Salesfirst_prediction
042.312.572211.09635828.1061643690.91632538.837
138.512.548211.24216988.1061641957.441632538.837
039.932.514211.28914298.1061611968.171632538.837

 那么,根据第一次的预测值与真实值之间的残差是多少呢?结果如下:

第一次预测比较
HolidayTemFuelCPIUnemployWeekly_Salesfirst_predictionfirst_residual
042.312.572211.09635828.1061643690.91632538.83711152.06333
138.512.548211.24216988.1061641957.441632538.8379418.603333
039.932.514211.28914298.1061611968.171632538.837-20570.66667

大家可以看见预测值与真实值之间还是有比较大的差距,因此我们接下来将使用决策树对残差进行优化,使得预测值更加逼近真实值,我们假设从Fuel_Price特征开始构建决策树,也就是从Fuel_Price特征将数据进行划分,假设决策时以Fuel_Price特征对2.53为划分标准,将不同数据按照该标准划分到不同的叶子结点,分别计算不同叶子结点预测的残差,决策树子模型对不同叶子结点的残差预测如下,展示如下:

 

以上是经过 Fuel_Price特征对数据经过划分之后,所得出的使得不同叶子结点损失最小的残差,大家可能会比较好奇是怎么来的,计算公式如下,该公式表示经过决策树划分之后,使得决策树各个叶子结点真实值与(上一轮预测值+决策树对残差预测值)的残差平方和最小的残差预测值。

例如,在第一轮预测中为,我们预测所有的数据都是均值,按照特征 Fuel_Price进行划分之后,第三条数据被划分到了左边,前两条数据被划分到了右边,对于左边叶子结点决策树的预测值为:\gamma _{1,1} = argmin{(1611968.17-(1632538.837+\gamma ))_{}}^{2}

右边叶子结点决策树的预测值为:

\gamma _{2,1} = argmin\frac{1}{2}\left \lfloor (211.0963582-(1632538.837+\gamma ))^{2} +(211.2421698-(1632538.837+\gamma ))^{2}\right \rfloor,其中\gamma字母第一个下标代表第几个叶子结点,后一个下标代表第几个决策树子模型,非常容易得到左边叶子结点的预测值为-20570.66667 ,右边叶子结点的预测值为10285.33333,该值是通过不同叶子结点数据残差的均值求得,对于子模型决策树构建之后的预测结构如下:通常我们为了保证模型的鲁棒性、准确率、泛化能力等,我们会设置一个学习率,防止模型出现过拟合,假设我们设置学习率为0.1,第一条数据的预测结果为1632538.837+(0.1*10285.3333)=1633567.37,第二条数据预测结果为1632538.837+(0.1*10285.3333)=1633567.37,第三条数据预测结果为1632538.837+(0.1*-20570.66667)=1630481.77那么第二次的预测结果如下:

第二次预测
Salesfirst_predfirst_ressecond_pred
1643690.91632538.83711152.063331633567.37
1641957.441632538.8379418.6033331633567.37
1611968.171632538.837-20570.666671630481.77

大家可以看出,对于第二次的预测与真实值结果更加接近,后面树的构建依次类推,最终梯度提升树的结构类似于以下结构:

  • 25
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
梯度提升(Gradient Boosting Decision Tree,简称GBDT)是一种流行的机器学习算法,常用于回归和分类任务。下面以回归为例,详细介绍GBDT的工作原理。 在回归任务中,我们的目标是预测一个连续变量的值。GBDT通过多次迭代的方式,逐步拟合训练数据的残差,最终得到一个强大的回归模型。 首先,GBDT使用一个单独的决策作为基模型。该是通过最小化损失函数(例如均方误差)建立的,将输入特征映射到预测值上。 接下来,GBDT通过计算真实值与当前模型的预测值之间的残差,得到一个新的训练数据集。这些残差成为下一棵决策的目标。 然后,通过训练一棵新的决策来拟合残差数据。这个过程是一个迭代的过程,每迭代一次,都会拟合一棵新的决策,并更新模型的预测值。 最后,将每棵的预测结果累加,得到最终的回归模型。这个模型能够准确地预测目标变量的值。 举例来说,假设我们有一组数据,包含一些自变量(如房屋面积、房间数量等)和一个连续的因变量(如房屋价格)。我们想建立一个回归模型来预测房屋价格。 首先,我们使用一棵决策来拟合这些数据,但是预测结果可能与真实值存在差距。 然后,我们计算真实值和当前模型的预测值之间的残差。使用这些残差作为新的目标,我们训练一棵新的决策。 接着,我们将第一棵决策和第二棵决策的预测结果相加,得到一个更新后的预测值。 我们可以反复迭代这个过程,每次都拟合一棵新的决策,并更新预测值。最终,我们将所有决策的预测结果相加,得到最终的回归模型。 通过这种方式,GBDT能够逐步提升模型的性能,对于复杂的非线性关系,也能够进行有效的拟合。 总而言之,GBDT是一种基于决策的机器学习算法,通过迭代拟合残差来构建一个强大的回归模型。它在回归任务中具有广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不一样的邓先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值