版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/winycg/article/details/83475579
提升树模型
提升树是以分类数或回归树为基本分类器的提升方法。提升方法实际采用加法模型(即基函数的线性组合)与前向分布算法,以决策树为基函数的提升方法为提升树(boosting tree)。基本分类器
x<v或
x>v,可以看作是一个根结点直接连接两个叶结点的简单决策树,也就是单层决策树,称为决策树桩(decision stump)。提升树模型可以表达为决策树的加法模型:
Fm(x)=t=1∑mf(x;θt)
其中
f(x;θj)为第
j棵决策树,
θj为参数。
提升树采用前向分布算法,确定初始提升树
f0(x)=0,第
m次提升的模型为:
Fm(x)=Fm−1(x)+f(x;θm)
其中,
Fm−1(x)为前
m−1个决策树组成的集成分类器,通过最小化经验风险来确定第
m棵树的参数:
θm=argθmini=1∑NL(yi,Fm−1(xi)+f(xi;θ))
不同问题的提升树算法,主要区别是使用的损失函数不同。对于二分类问题,提升树算法是AdaBoost算法的特殊情况。这里叙述回归问题的提升树。
已知训练集
{(xi,yi)}1N,如果将输入空间划分为
J个不相交的区域
R1,R2,...,RJ,并且每个区域确定输出的常量
cj,树可表示为:
f(x;θ)=j=1∑JcjI(x∈Rj)
其中,参数
θ={(Rj,cj)}1N表示树的区域划分和区域的常数值。
J是回归树的复杂度,即叶节点的个数。
当误差函数为平方损失误差为:
L(y,f(x))=(y−f(x))2
L(y,Fm−1(x)+f(x;θ))=L[y−Fm−1(x)−f(x;θ)]2=[r−f(x;θ)]2
r=y−Fm−1(x)是当前模型拟合数据的残差(residual)。所以,回归问题的提升树算法只需要拟合当前模型的残差。
回归问题的提升树算法:
输入:训练数据集
{(xi,yi)}1N
输出:提升树
FM(x)
初始化
f0(x)=0
对
m=1,2,...,M:
---------计算残差
rmi=yi−Fm−1(xi),i=1,2,...,N
---------拟合残差学习一个回归树,得到回归树
f(x;θm)
---------更新
Fm(x)=Fm−1(x)+f(x;θm)
最终得到的回归提升树:
FM(x)=m=1∑Mf(x;θm)
例子: 学习这个回归问题的提升树模型,考虑只用树桩做为基函数。
x |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
y |
5.56 |
5.70 |
5.91 |
6.40 |
6.80 |
7.05 |
8.90 |
8.70 |
9.00 |
9.05 |
第一步求回归树
f1(x),通过以下优化问题:
m(s)=c1minxi∈R1∑(yi−c1)2+c2minxi∈R2∑(yi−c2)2
求解训练数据的切分点
s:
R1={x∣x≤s},R2={x∣x>s}。容易求得在
R1,R2内部使平方误差达到最小值的
c1,c2为:
c1=N11xi∈R1∑yi,c2=N21xi∈R2∑yi
根据所给的数据,考虑如下的切分点:
1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5
例如:当
s=1.5时,R1={1},R2={2,3,...,10},c1=5.56,c2=7.50,m(s)=15.72
现将
s及
m(s)的计算结果列表如下:
s |
1.5 |
2.5 |
3.5 |
4.5 |
5.5 |
6.5 |
7.5 |
8.5 |
9.5 |
m(s) |
15.72 |
12.07 |
8.36 |
5.78 |
3.91 |
1.93 |
8.01 |
11.73 |
15.74 |
由上表可知,当
s=6.5时,
m(s)达到最小值,此时
R1={1,2,...,6},R2={7,8,9,10},c1=6.24,c2=8.91,所以回归树
f1(x)={6.24,x<6.58.91,x≥6.5
用
f1(x)拟合训练数据的残差如下表所示:
r2i=yi−f1(xi)
x |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
r2i |
-0.68 |
-0.54 |
-0.33 |
0.16 |
0.56 |
0.81 |
-0.01 |
-0.21 |
0.09 |
0.14 |
用
F1(x)拟合训练数据的平方损失误差:
L(y,F1(x))=i=1∑10(yi−F1(xi))2=1.93
采用与上面相同的方法拟合残差数据:
f2(x)={−0.52,x<3.50.22,x≥3.5
依次类推可得:
f3(x)={0.15,x<6.5−0.22,x≥6.5,f4(x)={−0.16,x<4.50.11,x≥4.5
f5(x)={0.07,x<6.5−0.11,x≥6.5,f6(x)={−0.15,x<2.50.04,x≥2.5
F6(x)=F5(x)+f6(x)=f1(x)+f2(x)+...+f6(x)=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧5.63,x<2.55.82,2.5≤x<3.56.56,3.5≤x<4.56.83,4.5≤x<6.58.95,x≥6.5
用
F6(x)拟合训练数据的平方损失函数误差是:
L(y,F6(x))=i=1∑10L(yi,F6(xi))=0.17
假设此时已满足误差要求,那么
F6(x)就是所求的提升树。
梯度提升
提升树利用加法模型和前向分步算法实现学习的优化过程。当损失函数为平方损失函数和指数损失函数时,每一步的优化很容易实现,但对一般的损失函数而言,优化困难。Freidman提出了梯度提升方法(gradient boosting),利用损失函数的负梯度在当前模型的值:
−[∂F(xi)∂L(yi,F(xi))]F(x)=Fm−1(x)
作为回归问题提升树中残差的近似值来优化。
梯度提升的一般框架
对于第
m步,
(βm,am)=argβ,amini=1∑NL(yi,Fm−1(xi)+βh(xi;a))
上述的误差可能很难去直接优化,不妨先通用的求解梯度:
−gm(xi)=−[∂F(xi)∂L(yi,F(xi))]F(x)=Fm−1(x)
我们先把
Fm−1(xi)看做一个整体,也就是一个参数。求解梯度后,我们通常会这样更新:
Fm(xi)=Fm−1(xi)−gm(xi)
此时,
Fm(xi)就要比
Fm−1(xi)更优。但是我们的目的是要得到如下而不是更新
F(xi):
Fm(xi)=Fm−1(xi)+βh(xi;a)
所以新组合得到的分类器就要去拟合负梯度:
am=arga,βmini=1∑N[−gm(xi)−βh(xi;a)]2
βm无需求解的原因是下面求解的
ρm可能会比其更优:
ρm=argρmini=1∑NL(yi,Fm−1(xi)+ρh(xi;am))
更新组合分类器:
Fm(xi)=Fm−1(xi)+ρmh(xi;am))
框架伪代码: