提升树模型
提升树是以分类数或回归树为基本分类器的提升方法。提升方法实际采用加法模型(即基函数的线性组合)与前向分布算法,以决策树为基函数的提升方法为提升树(boosting tree)。基本分类器x<vx<vx<v或x>vx>vx>v,可以看作是一个根结点直接连接两个叶结点的简单决策树,也就是单层决策树,称为决策树桩(decision stump)。提升树模型可以表达为决策树的加法模型:Fm(x)=∑t=1mf(x;θt)F_{m}(\mathbf{x})=\sum_{t=1}^{m}f(\mathbf x;\theta_{t})Fm(x)=t=1∑mf(x;θt)
其中f(x;θj)f(\mathbf x;\theta_{j})f(x;θj)为第jjj棵决策树,θj\theta_{j}θj为参数。
提升树采用前向分布算法,确定初始提升树f0(x)=0f_{0}(\mathbf{x})=0f0(x)=0,第mmm次提升的模型为:Fm(x)=Fm−1(x)+f(x;θm)F_{m}(\mathbf{x})=F_{m-1}(\mathbf{x})+f(\mathbf{x};\theta_{m})Fm(x)=Fm−1(x)+f(x;θm)
其中,Fm−1(x)F_{m-1}(\mathbf x)Fm−1(x)为前m−1m-1m−1个决策树组成的集成分类器,通过最小化经验风险来确定第mmm棵树的参数:
θm=argminθ∑i=1NL(yi,Fm−1(xi)+f(xi;θ))\theta_{m}=\arg\min_{\theta}\sum_{i=1}^{N}L(y_{i},F_{m-1}(\mathbf{x}_{i})+f(\mathbf{x}_{i};\theta))θm=argθmini=1∑NL(yi,Fm−1(xi)+f(xi;θ))
不同问题的提升树算法,主要区别是使用的损失函数不同。对于二分类问题,提升树算法是AdaBoost算法的特殊情况。这里叙述回归问题的提升树。
已知训练集{(xi,yi)}1N\{(\mathbf{x}_{i},y_{i})\}_{1}^{N}{(xi,yi)}1N,如果将输入空间划分为JJJ个不相交的区域R1,R2,...,RJR_{1},R_{2},...,R_{J}R1,R2,...,RJ,并且每个区域确定输出的常量cjc_{j}cj,树可表示为:f(x;θ)=∑j=1JcjI(x∈Rj)f(\mathbf{x};\theta)=\sum_{j=1}^{J}c_{j}I(\mathbf{x}\in R_{j})f(x;θ)=j=1∑JcjI(x∈Rj)
其中,参数θ={(Rj,cj)}1N\theta=\{(R_{j},c_{j})\}_{1}^{N}θ={(Rj,cj)}1N表示树的区域划分和区域的常数值。JJJ是回归树的复杂度,即叶节点的个数。
当误差函数为平方损失误差为:L(y,f(x))=(y−f(x))2L(y,f(x))=(y-f(x))^{2}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;θ)]2L(y,F_{m-1}(\mathbf{x})+f(\mathbf{x};\theta))=L[y-F_{m-1}(\mathbf{x})-f(\mathbf{x};\theta)]^{2}=[r-f(\mathbf{x};\theta)]^{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)r=y-F_{m-1}(\mathbf{x})r=y−Fm−1(x)是当前模型拟合数据的残差(residual)。所以,回归问题的提升树算法只需要拟合当前模型的残差。
回归问题的提升树算法:
输入:训练数据集{(xi,yi)}1N\{(\mathbf{x}_{i},y_{i})\}_{1}^{N}{(xi,yi)}1N
输出:提升树FM(x)F_{M}(\mathbf{x})FM(x)
初始化f0(x)=0f_{0}(\mathbf{x})=0f0(x)=0
对m=1,2,...,Mm=1,2,...,Mm=1,2,...,M:
---------计算残差rmi=yi−Fm−1(xi),i=1,2,...,Nr_{mi}=y_{i}-F_{m-1}(\mathbf x_{i}),i=1,2,...,Nrmi=yi−Fm−1(xi),i=1,2,...,N
---------拟合残差学习一个回归树,得到回归树f(x;θm)f(\mathbf{x;\theta_{m}})f(x;θm)
---------更新Fm(x)=Fm−1(x)+f(x;θm)F_{m}(\mathbf{x})=F_{m-1}(\mathbf{x})+f(\mathbf{x;\theta_{m}})Fm(x)=Fm−1(x)+f(x;θm)
最终得到的回归提升树:FM(x)=∑m=1Mf(x;θm)F_{M}(\mathbf{x})=\sum_{m=1}^{M}f(\mathbf{x};\theta_{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)f_{1}(x)f1(x),通过以下优化问题:
m(s)=minc1∑xi∈R1(yi−c1)2+minc2∑xi∈R2(yi−c2)2m(s)=\min_{c_{1}}\sum_{x_{i}\in R_{1}}(y_{i}-c_{1})^{2}+\min_{c_{2}}\sum_{x_{i}\in R_{2}}(y_{i}-c_{2})^{2}m(s)=c1minxi∈R1∑(yi−c1)2+c2minxi∈R2∑(yi−c2)2
求解训练数据的切分点sss:R1={x∣x≤s},R2={x∣x>s}R_{1}=\{x|x\leq s\}, R_{2}=\{x|x>s\}R1={x∣x≤s},R2={x∣x>s}。容易求得在R1,R2R_{1},R_{2}R1,R2内部使平方误差达到最小值的c1,c2c_{1},c_{2}c1,c2为:
c1=1N1∑xi∈R1yi,c2=1N2∑xi∈R2yic_{1}=\frac{1}{N_{1}}\sum_{x_{i}\in R_{1}}y_{i},c_{2}=\frac{1}{N_{2}}\sum_{x_{i}\in R_{2}}y_{i}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.51.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.51.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.72s=1.5时,R_{1}=\{1\},R_{2}=\{2,3,...,10\},c_{1}=5.56,c_{2}=7.50,m(s)=15.72s=1.5时,R1={1},R2={2,3,...,10},c1=5.56,c2=7.50,m(s)=15.72
现将sss及m(s)m(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.5s=6.5s=6.5时,m(s)m(s)m(s)达到最小值,此时R1={1,2,...,6},R2={7,8,9,10},c1=6.24,c2=8.91R_{1}=\{1,2,...,6\},R_{2}=\{7,8,9,10\},c_{1}=6.24,c_{2}=8.91R1={1,2,...,6},R2={7,8,9,10},c1=6.24,c2=8.91,所以回归树f1(x)={6.24,x<6.58.91,x≥6.5f_{1}(x)=\left\{\begin{matrix}
6.24,x<6.5\\
8.91,x\geq 6.5
\end{matrix}\right.f1(x)={6.24,x<6.58.91,x≥6.5
用f1(x)f_{1}(x)f1(x)拟合训练数据的残差如下表所示:r2i=yi−f1(xi)r_{2i}=y_{i}-f_{1}(x_{i})r2i=yi−f1(xi)
xxx | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
r2ir_{2i}r2i | -0.68 | -0.54 | -0.33 | 0.16 | 0.56 | 0.81 | -0.01 | -0.21 | 0.09 | 0.14 |
用F1(x)F_{1}(x)F1(x)拟合训练数据的平方损失误差:L(y,F1(x))=∑i=110(yi−F1(xi))2=1.93L(y,F_{1}(x))=\sum_{i=1}^{10}(y_{i}-F_{1}(x_{i}))^{2}=1.93L(y,F1(x))=i=1∑10(yi−F1(xi))2=1.93
采用与上面相同的方法拟合残差数据:f2(x)={−0.52,x<3.50.22,x≥3.5f_{2}(x)=\left\{\begin{matrix}
-0.52, x<3.5\\
0.22, x \geq 3.5
\end{matrix}\right.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.5f_{3}(x)=\left\{\begin{matrix}
0.15, x<6.5\\
-0.22, x \geq 6.5
\end{matrix}\right.,f_{4}(x)=\left\{\begin{matrix}
-0.16, x<4.5\\
0.11, x \geq 4.5
\end{matrix}\right.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.5f_{5}(x)=\left\{\begin{matrix}
0.07, x<6.5\\
-0.11, x \geq 6.5
\end{matrix}\right.,f_{6}(x)=\left\{\begin{matrix}
-0.15, x<2.5\\
0.04, x \geq 2.5
\end{matrix}\right.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.5F_{6}(x)=F_{5}(x)+f_{6}(x)=f_{1}(x)+f_{2}(x)+...+f_{6}(x)=\left\{\begin{matrix}
5.63,x<2.5\\
5.82,2.5\leq x <3.5\\
6.56,3.5\leq x <4.5\\
6.83,4.5\leq x <6.5\\
8.95,x \geq 6.5
\end{matrix}\right.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)F_{6}(x)F6(x)拟合训练数据的平方损失函数误差是:L(y,F6(x))=∑i=110L(yi,F6(xi))=0.17L(y,F_{6}(x))=\sum_{i=1}^{10}L(y_{i},F_{6}(x_{i}))=0.17L(y,F6(x))=i=1∑10L(yi,F6(xi))=0.17
假设此时已满足误差要求,那么F6(x)F_{6}(x)F6(x)就是所求的提升树。
梯度提升
提升树利用加法模型和前向分步算法实现学习的优化过程。当损失函数为平方损失函数和指数损失函数时,每一步的优化很容易实现,但对一般的损失函数而言,优化困难。Freidman提出了梯度提升方法(gradient boosting),利用损失函数的负梯度在当前模型的值:
−[∂L(yi,F(xi))∂F(xi)]F(x)=Fm−1(x)-[\frac{\partial{L(y_{i},F(\mathbf{x}_{i}))}}{\partial{F({\mathbf{x}_{i}})}}]_{F({\mathbf{x}})=F_{m-1}(\mathbf x)}−[∂F(xi)∂L(yi,F(xi))]F(x)=Fm−1(x)
作为回归问题提升树中残差的近似值来优化。
梯度提升的一般框架
对于第mmm步,(βm,am)=argminβ,a∑i=1NL(yi,Fm−1(xi)+βh(xi;a))(\beta_{m},a_{m})=\arg \min_{\beta,a}\sum_{i=1}^{N}L(y_{i},F_{m-1}(\mathbf{x}_{i})+\beta h(\mathbf{x}_{i};a))(βm,am)=argβ,amini=1∑NL(yi,Fm−1(xi)+βh(xi;a))
上述的误差可能很难去直接优化,不妨先通用的求解梯度:
−gm(xi)=−[∂L(yi,F(xi))∂F(xi)]F(x)=Fm−1(x)-g_{m}(\mathbf{x}_{i})=-[\frac{\partial{L(y_{i},F(\mathbf{x}_{i}))}}{\partial{F({\mathbf{x}_{i}})}}]_{F({\mathbf{x}})=F_{m-1}(\mathbf x)}−gm(xi)=−[∂F(xi)∂L(yi,F(xi))]F(x)=Fm−1(x)
我们先把Fm−1(xi)F_{m-1}({\mathbf{x}_{i}})Fm−1(xi)看做一个整体,也就是一个参数。求解梯度后,我们通常会这样更新:Fm(xi)=Fm−1(xi)−gm(xi)F_{m}({\mathbf{x}_{i}})=F_{m-1}({\mathbf{x}_{i}})-g_{m}(\mathbf{x}_{i})Fm(xi)=Fm−1(xi)−gm(xi)
此时,Fm(xi)F_{m}({\mathbf{x}_{i}})Fm(xi)就要比Fm−1(xi)F_{m-1}({\mathbf{x}_{i}})Fm−1(xi)更优。但是我们的目的是要得到如下而不是更新F(xi)F({\mathbf{x}_{i}})F(xi):Fm(xi)=Fm−1(xi)+βh(xi;a)F_{m}({\mathbf{x}_{i}})=F_{m-1}({\mathbf{x}_{i}})+\beta h(\mathbf{x}_{i};a)Fm(xi)=Fm−1(xi)+βh(xi;a)
所以新组合得到的分类器就要去拟合负梯度:
am=argmina,β∑i=1N[−gm(xi)−βh(xi;a)]2a_{m}=\arg \min_{a,\beta}\sum_{i=1}^{N}[-g_{m}(\mathbf{x}_{i})-\beta h(\mathbf{x}_{i};a)]^{2}am=arga,βmini=1∑N[−gm(xi)−βh(xi;a)]2
βm\beta_{m}βm无需求解的原因是下面求解的ρm\rho_{m}ρm可能会比其更优:
ρm=argminρ∑i=1NL(yi,Fm−1(xi)+ρh(xi;am))\rho_{m}=\arg\min_{\rho}\sum_{i=1}^{N}L(y_{i},F_{m-1}(\mathbf{x}_{i})+\rho h(\mathbf{x}_{i};a_{m}))ρm=argρmini=1∑NL(yi,Fm−1(xi)+ρh(xi;am))
更新组合分类器:
Fm(xi)=Fm−1(xi)+ρmh(xi;am))F_{m}(\mathbf{x}_{i})=F_{m-1}(\mathbf{x}_{i})+\rho_{m} h(\mathbf{x}_{i};a_{m}))Fm(xi)=Fm−1(xi)+ρmh(xi;am))
框架伪代码: