本文主要参照几篇博客,加入很少的自己的理解。
主要参照: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。
对于只是二分类的基函数算法如下: