AdaBoost算法的解释——前向分步法与提升树(GBDT)
可以认为AdaBoost算法是模型为加法模型,损失函数为指数函数、学习算法为前向分步算法时的二类分类学习方法。
前向分步算法:
考虑加法模型
f
(
x
)
=
∑
m
=
1
M
β
m
b
(
x
;
γ
m
)
f(x)=\displaystyle\sum_{m=1}^{M}β_mb(x;γ_m)
f(x)=m=1∑Mβmb(x;γm) —— (式1)
其中
b
(
x
;
γ
m
)
为
基
函
数
,
γ
m
为
基
函
数
的
参
数
,
β
m
为
基
函
数
的
系
数
。
b(x;γ_m)为基函数,γ_m为基函数的参数,β_m为基函数的系数。
b(x;γm)为基函数,γm为基函数的参数,βm为基函数的系数。显然式1 是个加法模型。
在给定训练数据和损失函数
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x))的条件下,学习加法模型
f
(
x
)
f(x)
f(x)称为经验风险极小化即损失函数极小化问题:
通常这是一个复杂的优化问题。前向分步算法求解这一优化问题的想法是:因为学习的是加法模型,如果能够从前往后求解,每一步只学习一个基函数及其系数,逐步逼近优化目标函数,那么就可以简化优化的复杂度。
具体的,每一步只需优化如下损失函数:
给定训练数据集
T
=
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
…
…
(
x
N
,
y
N
)
T={(x_1,y_1),(x_2,y_2)……(x_N,y_N)}
T=(x1,y1),(x2,y2)……(xN,yN)损失函数
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x))和基函数的集合{
b
(
x
;
γ
m
)
b(x;γ_m)
b(x;γm)},学习加法模型
f
(
x
)
f(x)
f(x)的前向分步算法如下:
输入:训练数据集
T
=
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
…
…
(
x
N
,
y
N
)
T={(x_1,y_1),(x_2,y_2)……(x_N,y_N)}
T=(x1,y1),(x2,y2)……(xN,yN);损失函数
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x))和基函数的集合{
b
(
x
;
γ
m
)
b(x;γ_m)
b(x;γm)}
输出:加法模型
f
(
x
)
f(x)
f(x)
- :初始化
f
0
(
x
)
=
0
f_0(x)=0
f0(x)=0
2):对m=1,2……M:
(a):极小化损失函数
( β m , γ m ) = a r g m i n ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x i ; γ ) ) (β_m,γ_m)=argmin\displaystyle\sum_{i=1}^{N}L(y_i,f_{m-1}(x_i)+βb(x_i;γ)) (βm,γm)=argmini=1∑NL(yi,fm−1(xi)+βb(xi;γ))
得到参数 β m , γ m β_m,γ_m βm,γm
(b)更新, f m ( x ) = f m − 1 ( x ) + β m b ( x ; γ m ) f_m(x)=f_{m-1}(x)+β_mb(x;γ_m) fm(x)=fm−1(x)+βmb(x;γm)
3)得到加法模型 f ( x ) = f M ( x ) = ∑ m = 1 M β m b ( x ; γ m ) f(x)=f_M(x)=\displaystyle\sum_{m=1}^{M}β_mb(x;γ_m) f(x)=fM(x)=m=1∑Mβmb(x;γm)
这样,前向分步算法将同时求解从m=1到M的所有参数 β m , γ m β_m,γ_m βm,γm的优化问题简化为逐次求解各个 β m , γ m β_m,γ_m βm,γm的优化问题。
提升树
提升树是以分类树与回归树为基本分类器的提升方法。提升树被认为是统计学习中性能最好的方法之一。
提升树模型
提升方法实际是采用加法模型(即基函数的线性组合)与前向分步算法。**以决策树为基函数的提升方法称为提升树。**对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。
提升树模型可以表示成决策树的加法模型:
f
M
(
x
)
=
∑
m
=
1
M
T
(
x
;
⊙
m
)
f_M(x)=\displaystyle\sum_{m=1}^{M}T(x;⊙_m)
fM(x)=m=1∑MT(x;⊙m),其中
T
(
x
;
⊙
m
)
表
示
决
策
树
;
⊙
m
表
示
决
策
树
的
参
数
;
M
为
树
的
个
数
T(x;⊙_m)表示决策树;⊙_m表示决策树的参数;M为树的个数
T(x;⊙m)表示决策树;⊙m表示决策树的参数;M为树的个数
提升树算法:
提升树采用前向分步算法,首先确定初始提升树
f
0
(
x
)
=
0
f_0(x)=0
f0(x)=0,第m步的模型是
f
m
(
x
)
=
f
m
−
1
+
T
(
x
;
⊙
m
)
f_m(x)=f_{m-1}+T(x;⊙_m)
fm(x)=fm−1+T(x;⊙m)
其中,
f
m
−
1
f_{m-1}
fm−1是当前模型,通过经验风险最小化确定下一颗决策树的参数
⊙
m
⊙_m
⊙m
⊙
m
=
a
r
g
m
i
n
∑
i
=
1
N
L
(
y
i
,
f
m
−
1
(
x
i
)
+
T
(
x
;
⊙
m
)
)
⊙_m=argmin\displaystyle\sum_{i=1}^{N}L(y_i,f_{m-1}(x_i)+T(x;⊙_m))
⊙m=argmini=1∑NL(yi,fm−1(xi)+T(x;⊙m))
由于树的线性组合可以很好的拟合数据,即使数据中的输入与输出之间的关系很复杂也是如此,所以提升树是一个高功能的学习算法。
下面讨论针对不同问题的提升树学习算法,其主要区别在于使用的损失函数不同
包括用平方误差损失函数的回归问题,用指数损失函数的分类问题呢,以及用一般损失函数的一般决策问题。
对于二类分类问题,提升树算法只需将AdaBoost算法中的基本分类器限制为二类分类器即可,可以说这时的提升树算法是AdaBoost算法的特殊情况。
下面介绍回归问题的提升树。
已知一个训练数据集
T
=
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
…
…
(
x
N
,
y
N
)
T={(x_1,y_1),(x_2,y_2),……(x_N,y_N)}
T=(x1,y1),(x2,y2),……(xN,yN),前面已经讨论了回归树的问题
如果将输入空间划分为
J
J
J个互不相交的区域
R
1
,
R
2
…
…
R
J
R_1,R_2……R_J
R1,R2……RJ,并且在每个区域上确定输出的场景
c
j
c_j
cj,那么树可以表示为:
T
(
x
;
⊙
)
=
∑
j
=
1
J
c
j
I
(
x
∈
R
j
)
T(x;⊙)=\displaystyle\sum_{j=1}^{J}c_jI(x∈R_j)
T(x;⊙)=j=1∑JcjI(x∈Rj)
其中 ,参数
⊙
=
(
R
1
,
c
1
)
,
(
R
2
,
c
2
)
…
(
R
J
,
c
J
)
⊙={(R_1,c_1),(R_2,c_2)…(R_J,c_J)}
⊙=(R1,c1),(R2,c2)…(RJ,cJ)表示树的区域划分和各区域上的常数。J是回归树的复杂度即叶子结点个数。
回归问题的提升树使用以下前向分步算法:
f
0
(
x
)
=
0
f_0(x)=0
f0(x)=0
f
m
(
x
)
=
f
m
−
1
(
x
)
+
T
(
x
;
⊙
m
)
,
m
=
1
,
2
…
…
M
f_m(x)=f_{m-1}(x)+T(x;⊙_m), m=1,2……M
fm(x)=fm−1(x)+T(x;⊙m),m=1,2……M
f
M
(
x
)
=
∑
m
=
1
M
T
(
x
;
⊙
m
)
f_M(x)=\displaystyle\sum_{m=1}^{M}T(x;⊙_m)
fM(x)=m=1∑MT(x;⊙m)
在前向分步算法的第m步,给定当前模型
f
m
−
1
(
x
)
f_{m-1}(x)
fm−1(x),需要求解
⊙
m
=
a
r
g
m
i
n
∑
i
=
1
N
L
(
y
i
,
f
m
−
1
(
x
i
)
+
T
(
x
;
⊙
m
)
)
⊙_m=argmin\displaystyle\sum_{i=1}^{N}L(y_i,f_{m-1}(x_i)+T(x;⊙_m))
⊙m=argmini=1∑NL(yi,fm−1(xi)+T(x;⊙m))得到
⊙
m
⊙_m
⊙m,即第m颗树的参数。
当采用平方误差损失函数时,
L
(
y
,
f
(
x
)
)
=
(
y
−
f
(
x
)
)
2
L(y,f(x))=(y-f(x))^2
L(y,f(x))=(y−f(x))2其损失变为:
L
(
y
,
f
m
−
1
(
x
)
+
T
(
x
;
⊙
m
)
)
L(y,f_{m-1}(x)+T(x;⊙_m))
L(y,fm−1(x)+T(x;⊙m))
=
[
y
−
f
m
−
1
(
x
)
−
T
(
x
;
⊙
m
)
]
2
=[y-f_{m-1}(x)-T(x;⊙_m)]^2
=[y−fm−1(x)−T(x;⊙m)]2
=
[
r
−
T
(
x
;
⊙
m
)
]
2
=[r-T(x;⊙_m)]^2
=[r−T(x;⊙m)]2
这里
r
=
y
−
f
m
−
1
(
x
)
r=y-f_{m-1}(x)
r=y−fm−1(x) 是当前模型拟合数据的残差。所以对回归问题的提升树算法来说,只需要简单的拟合当前模型的残差。
【回归问题的提升树算法】:
输入:训练数据集
输出:提升树
f
M
(
x
)
f_M(x)
fM(x)
1)初始化
f
0
(
x
)
=
0
f_0(x)=0
f0(x)=0
2)对m=1,2,……M
a)按照
r
=
y
−
f
m
−
1
(
x
)
r=y-f_{m-1}(x)
r=y−fm−1(x)计算残差:
r
m
i
=
y
i
−
f
m
−
1
(
x
i
)
r_{mi}=y_i-f_{m-1}(x_i)
rmi=yi−fm−1(xi)是个向量
b)拟合残差
r
m
i
r_{mi}
rmi学习一个回归树,得到
T
(
x
;
⊙
m
)
T(x;⊙_m)
T(x;⊙m)
c)更新
f
m
(
x
)
=
f
m
−
1
+
T
(
x
;
⊙
m
)
f_m(x)=f_{m-1}+T(x;⊙_m)
fm(x)=fm−1+T(x;⊙m)
3)得到回归问题提升树
f
M
(
x
)
=
∑
m
=
1
M
T
(
x
;
⊙
m
)
f_M(x)=\displaystyle\sum_{m=1}^{M}T(x;⊙_m)
fM(x)=m=1∑MT(x;⊙m)
(每棵回归树的获得都和前面提到的回归树构建算法一样)
梯度提升:
提升树利用加法模型与前向分步算法实现学习的优化过程,当损失函数时平方损失和指数损失时,每一步优化很简单。但对一般的损失函数而言,往往每一步优化不那么容易。
针对这一问题,提出了梯度提升算法(gradient boosting).这是利用最速下降法的近似方法,其关键是利用损失函数的负梯度在当前模型的值
−
[
φ
L
(
y
,
f
(
x
i
)
)
φ
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
-[\frac{φL(y,f(x_i))}{φf(x_i)}]_{f(x)=f_{m-1}(x)}
−[φf(xi)φL(y,f(xi))]f(x)=fm−1(x)
作为回归问题提升树算法中残差的近似值,拟合一个回归树
(损失函数的负梯度在当前模型的值)(残差)
【梯度提升算法】:
输入:训练数据集
T
T
T,损失函数
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x))
输出:回归树
f
(
x
)
f(x)
f(x)
(1)初始化
f
0
(
x
)
=
a
r
g
m
i
n
∑
i
=
1
N
L
(
y
i
,
c
)
f_0(x)=argmin\displaystyle\sum_{i=1}^{N}L(y_i,c)
f0(x)=argmini=1∑NL(yi,c)
(2) 对于m=1,2,……M
(a)对i=1,2,……N,计算
r
m
i
=
−
φ
L
(
y
,
f
(
x
i
)
)
φ
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
r_{mi}=-\frac{φL(y,f(x_i))}{φf(x_i)}]_{f(x)=f_{m-1}(x)}
rmi=−φf(xi)φL(y,f(xi))]f(x)=fm−1(x)
(b)对
r
m
i
r_{mi}
rmi拟合一个回归树,得到第m颗树的叶子结点区域
R
m
j
,
j
=
1
,
2
…
…
J
R_{mj},j=1,2……J
Rmj,j=1,2……J
©对j=1,2……J,
计算
c
m
j
=
a
r
g
m
i
n
∑
x
i
∈
R
m
j
L
(
y
i
,
f
m
−
1
(
x
i
)
+
c
)
c_{mj}=argmin\displaystyle\sum_{x_i∈R_{mj}}L(y_i,f_{m-1}(x_i)+c)
cmj=argminxi∈Rmj∑L(yi,fm−1(xi)+c)
(d)更新
f
m
(
x
)
=
f
m
−
1
(
x
)
+
∑
j
=
1
J
c
m
j
I
(
x
∈
R
m
j
)
f_m(x)=f_{m-1}(x)+\displaystyle\sum_{j=1}^{J}c_{mj}I(x∈R_{mj})
fm(x)=fm−1(x)+j=1∑JcmjI(x∈Rmj)
(3)得到回归树
f
(
x
)
=
f
M
(
x
)
=
∑
m
=
1
M
∑
j
=
1
J
c
m
j
I
(
x
∈
R
m
j
)
f(x)=f_M(x)=\displaystyle\sum_{m=1}^{M}\displaystyle\sum_{j=1}^{J}c_{mj}I(x∈R_{mj})
f(x)=fM(x)=m=1∑Mj=1∑JcmjI(x∈Rmj)
算法第1步初始化:估计使损失函数极小化的常数值,它是只有一个根节点的树。
第2步a)计算损失函数的负梯度在当前模型的值,将它作为残差的估计,
第2步b)估计回归树叶子结点区域,以拟合残差近似值。
第2步c)利用线性搜索估计叶子结点区域的值,使得损失函数极小化。
第2步d)更新回归树
第3步得到输出最终模型f(x)