梯度提升算法

本文深入讲解了Adaboost算法中的前向分步算法,提升树算法及其在回归问题中的应用,以及梯度提升算法的基本原理和操作流程。通过实例演示了如何通过优化问题求解回归树,展示了提升树算法在拟合复杂数据关系中的高效性。

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

本文主要参照几篇博客,加入很少的自己的理解。

主要参照:https://blog.youkuaiyun.com/xueyingxue001/article/details/51304490

部分参照:https://blog.youkuaiyun.com/a819825294/article/details/51188740

https://blog.youkuaiyun.com/wutao1530663/article/details/71235727

一、前向分步算法

在Adaboost算法中,我们的最终目的是通过构建弱分类器的线性组合:

                  技术分享

         来得到最终分类器。

         而我们在看看加法模型:

                  技术分享

         其中,b(x; rm)为基函数,rm是基函数的参数,βm为基函数的系数。

         显然式8.6是一个加法模型。

         对于加法模型,在给定训练数据及损失函数L(y, f(x))的条件下,学习加法模型f(x)就成为经验风险极小化损失函数极小化问题:

                  技术分享

         但这是一个复杂的优化问题。

         前向分布算法(forward stagewise algorithm)求解这一优化问题的想法是

                   因为学习的是加法模型,那如果能够从前向后,每一步只学习一个基函数及其系数,然后逐步逼近优化目标式8.14,那么就可以简化优化的复杂度。

         具体的,每步只需优化如下损失函数:

                  技术分享

         于是,前向分布算法总结如下

         输入

                   训练数据集T ={(x1,y1), (x2, y2), ..., (xN, yN)};损失函数L(y, f(x));基函数集{b(x; r)};

         输出

                   加法模型f(x)

         解

                   1,初始化f0(x)= 0

                   2,对m = 1, 2,.., M

                            a,极小化损失函数

                                    技术分享

                                     得到参数βm, rm

                                          b,更新

                                    技术分享

                   3,得到加法模型

                           技术分享

         这样,前向分布算法将同时求解从m=1到M的所有参数βm, rm的优化问题简化为逐次求解各个βm, rm的优化问题。

二、提升树算法

提升树采用前向分布算法,那就将前向分布算法的步骤的思想套用到这里吧。

         首先,确定初始提升树f0(x)= 0,于是第m步的模型就是:

                  技术分享

         其中fm-1(x)是当前模型,通过经验风险极小化确定下一棵决策树的参数θm,

                  技术分享

         由于树的线性组合可以很好的拟合训练数据,即使数据中的输入与输出之间的关系很复杂也可以很好的拟合。所以提升树是一个高功能的学习算法。

         下面讨论针对不同问题的提升树学习算法,其主要区别在于使用的损失函数不同。包括用平方误差损失函数的回归问题,用指数损失函数的分类问题,以及用一般损失函数的一般决策问题

         对于二类分类问题,提升树算法只需将Adaboost中的弱分类器限制为二类分类树即可,这里不再细数。下面叙述回归问题的提升树:

         已知一个训练数据集T={(x1,y1), (x2, y2), ..., (xN, yN)},x∈X? Rn,X为输入空间,yi∈Y? R,Y为输出空间。如果将输入空间X划分为J个互不相交的区域R1, R2, ..., RJ,并且在每个区域上确定输出的常亮cj,那么树可以表示为:

                  技术分享

         其中,参数θ={(R1,c1), (R2, c2), ..., (RJ, cJ)}表示树的区域划分和各区域上的常数,J是回归树的复杂度即叶子节点的个数。

         对8.26式举个例子的话就像下面这样:

                  技术分享

         回归问题提升树使用以下前向分布算法

                  技术分享

                  在前向分布算法的第m步,给定当前模型fm-1(x),需求解

                  技术分享

                  即得到第m棵树的参数。

                   当采用平方误差损失函数时,

                            L(y,f(x)) = (y - f(x))2

                   其损失变为:

                            L(y,fm-1(x) + T(x;θm))

                            =[y - fm-1(x) - T(x;θm)]2

                            =[r - T(x;θm)]2

                   这里

                            r= y - fm-1(x)                        (8.27)

                   是当前模型拟合数据的残差。所以对回归问题的提升树算法来说,只需简单的拟合当前模型的残差。这样,算法是相当简单的。

         现将回归问题的提升树算法叙述如下

         输入

                   训练数据T={(x1,y1), (x2, y2), ..., (xN, yN)},xi∈X? Rn,yi∈Y? R

         输出

                   提升树fM(x)

         解

                   1,初始化f0(x)= 0

                   2,对m = 1, 2,..., M

                            a,按式8.27计算残差:rmi= yi - fm-1(xi), i = 1, 2, ..., N

                            b,拟合残差rmi学习一个回归树,得到T(x;θm)

                            c,更新fm(x)= fm-1(x) + T(x;θm)

                   3,得到回归问题提升树

                           技术分享

例子

技术分享

         已知训练数据如上表所示,x的取值范围为区间[0.5,10.5],y的取值范围为区间[5.0, 10.0],学习这个回归问题的的提升树模型,考虑只用树桩作为基函数。

        

         既然是学习出一个提升树:

                  技术分享

         那么第一步我们就要求f1(x),即回归树T1(x)。

         首先,通过以下优化问题

                  技术分享

         求解训练数据的切分点s:

                   R1= {x | x <= s},R2 = {x | x > s}

         容易求得在R1,R2内部使平方损失误差达到最小值的c1, c2为

                  技术分享

         这里N1,N2是R1,R2的样本个数。

         将上面的想法应用到数据上就是

                   根据所给数据,考虑如下切分点:1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5

                   对各切分点,不难求出相应的R1,R2, c1, c2及

                           技术分享

         如:当s=1.5时,R1={1},R2={2, 3, 4,5, 6, 7, 8, 9, 10},c1 = 5.56,c2=7.50,

                            m(s)= 0 + 15.72 = 15.72

         现将s及m(s)的计算结果列表如下

技术分享

         由上表可知,当s=6.5时m(s)达到最小值,此时R1={1,2, ..., 6},R2={7, 8, 9, 10},c1=6.24,c2=8.91,所以回归树T1(x)为

                  技术分享

         用f1(x)拟合训练数据的残差见下表,表中r2i = yi - f1(xi),i=1, 2, ...,10.

技术分享

         用f1(x)拟合训练数据的平方损失误差:

                  技术分享

         第二步求T2(x)。方法与求T1(x)一样,只是拟合的数据是表8.4的残差。可以得到:

                  技术分享

         用f2(x)拟合训练数据的平方损失误差是

                  技术分享

         就这样继续求得

                  技术分享

         用f6(x)拟合训练数据的平方损失误差是:

                  技术分享

         假设此时已满足误差要求,那么f(x) = f6(x)即为所求提升树。

三、梯度提升算法

      在梯度提升的1≤m≤M步中,假设已经有一些不完美的模型Fm(最初可以使用非常弱的模型,它只是预测输出训练集的平均值)。梯度提升算法不改变Fm(x),而是通过增加估计器h构建新的模型Fm+1(x)=Fm(x)+h(x)来提高整体模型的效果。那么问题来了,如何寻找h函数呢?梯度提升方法的解决办法是认为最好的h(x)

应该使得:

Fm+1(x)=Fm(x)+h(x)=y

或者等价于:

h(x)=y−Fm(x)

因此,梯度提升算法将h与残差y−Fm(x)拟合。与其他boosting算法的变体一样,Fm+1修正它的前身Fm。我们观察到残差y−Fm(x)是损失函数(1/2)(y−F(x))2的负梯度方向,因此可以将其推广到其他不是平方误差(分类或是排序问题)的损失函数。也就是说,梯度提升算法是一种梯度下降算法,只需要更改损失函数和梯度就能将其推广。

当采用平方误差损失函数时,

                            L(y,f(x)) = (y - f(x))2

                   其损失变为:

                            L(y,fm-1(x) + T(x;θm))

                            =[y - fm-1(x) - T(x;θm)]2

                            =[r - T(x;θm)]2

                   这里

                            r= y - fm-1(x)

我们会发现在提升算法中我们的残差是y-fm-1(x)。

在使用一般的损失函数时我们使用

这个对应于平方误差损失函数中应该是y-fm-1(x)-T(x;θm)

这也是我们为什么说对于平方损失函数,拟合的就是残差;对于一般损失函数,拟合的就是残差的近似值。

  梯度提升算法描述

         输入

                   训练数据T={(x1,y1), (x2, y2), ..., (xN, yN)},xi∈X? Rn,yi∈Y? R;损失函数L(y, f(x))

         输出

                   回归树。

         解

                  技术分享

      本算法对应的基函数是回归树较为复杂的情况,也就是会有多个叶节点的情况,就会出现对于每个叶节点都要寻找一个较小的c。

对于只是二分类的基函数算法如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值