提升树
提升树利用加法模型与前向分布算法实现学习的优化过程。
提升方法实际上是采用前向分布算法求解的加法模型,提升树(boosting tree)是以决策树(分类树或回归树)为基分类器的提升方法。提升树模型可以表示为决策树的加法模型:
f
M
(
x
)
=
∑
m
=
1
M
T
(
x
;
Θ
m
)
f_M(x)=\sum_{m=1}^MT(x;\Theta_m)
fM(x)=m=1∑MT(x;Θm)
其中,
T
(
x
;
Θ
m
)
T(x;\Theta_m)
T(x;Θm)为决策树模型,也是我们的基函数。
对比AdaBoost:AdaBoost中对每个基分类器加权求和,而这里没有各分类器的权重系数,或者说是等权重的。
提升树采用前向分布算法。给定训练数据及损失函数
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x)),首先确定初始提升树
f
0
(
x
)
=
0
f_0(x)=0
f0(x)=0,第
m
m
m步的模型是
f
m
(
x
)
=
f
m
−
1
(
x
)
+
T
(
x
;
Θ
m
)
f_m(x)=f_{m-1}(x)+T(x;\Theta_m)
fm(x)=fm−1(x)+T(x;Θm)
其中,
f
m
−
1
(
x
)
f_{m-1}(x)
fm−1(x)为当前模型,通过经验风险最小化确定下一棵决策树的参数
Θ
m
\Theta_m
Θm,
Θ
^
m
=
arg
min
Θ
m
∑
i
=
1
n
L
(
y
i
,
f
m
−
1
(
x
i
)
+
T
(
x
i
;
Θ
m
)
)
\hat{\Theta}_m=\arg\min_{\Theta_m}\sum_{i=1}^nL(y_i,f_{m-1}(x_i)+T(x_i;\Theta_m))
Θ^m=argΘmmini=1∑nL(yi,fm−1(xi)+T(xi;Θm))
不同的提升树的学习算法不同,其主要区别在于使用的损失函数不同:用指数损失函数的分类问题,用平方误差损失函数的回归问题,以及用一般损失函数的一般决策问题。
分类提升树(指数损失函数)
对于二分类问题,分类提升树是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)},其中输入实例
x
i
∈
X
⊆
R
n
x_i\in\mathcal{X}\subseteq \mathbb{R}^n
xi∈X⊆Rn,输出
y
i
∈
Y
⊆
R
y_i\in\mathcal{Y}\subseteq\mathbb{R}
yi∈Y⊆R。将输入空间
X
\mathcal{X}
X划分为
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;\Theta)=\sum_{j=1}^Jc_jI(x\in R_j)
T(x;Θ)=j=1∑JcjI(x∈Rj)
其中,参数
Θ
=
{
(
R
1
,
c
1
)
,
(
R
2
,
c
2
)
,
.
.
.
,
(
R
J
,
c
J
)
}
\Theta=\{(R_1,c_1),(R_2,c_2),...,(R_J,c_J)\}
Θ={(R1,c1),(R2,c2),...,(RJ,cJ)}表示树的区域划分和各区域上的常数,
J
J
J是回归树的复杂度即叶结点个数。
在前向分布算法的第
m
m
m步,给定当前模型
f
m
−
1
(
x
)
f_{m-1}(x)
fm−1(x),需求解
Θ
^
m
=
arg
min
Θ
m
∑
i
=
1
n
L
(
y
i
,
f
m
−
1
(
x
i
)
+
T
(
x
i
;
Θ
m
)
)
\hat{\Theta}_m=\arg\min_{\Theta_m}\sum_{i=1}^nL(y_i,f_{m-1}(x_i)+T(x_i;\Theta_m))
Θ^m=argΘmmini=1∑nL(yi,fm−1(xi)+T(xi;Θm))
得到
Θ
^
m
\hat{\Theta}_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
)
)
=
[
y
−
f
m
−
1
(
x
)
−
T
(
x
;
Θ
m
)
]
2
=
[
r
−
T
(
x
;
Θ
m
)
]
2
L(y,f_{m-1}(x)+T(x;\Theta_m))=[y-f_{m-1}(x)-T(x;\Theta_m)]^2=[r-T(x;\Theta_m)]^2
L(y,fm−1(x)+T(x;Θm))=[y−fm−1(x)−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)是当前模型拟合数据的残差。因此使平方误差损失函数极小的回归树
T
(
x
;
Θ
m
)
T(x;\Theta_m)
T(x;Θm)应很好的拟合残差
r
r
r(最好是
T
(
x
;
Θ
m
)
=
r
T(x;\Theta_m)=r
T(x;Θm)=r,损失函数值为0)。
整个过程综合来看,相当于把原始数据分成若干个数的加和,每个数用一个回归树拟合。
文章开头就指出,我们假设的基模型是等权重的,下面探讨一下原因。假设每个基模型都有一个权重,这时候损失函数为
L
(
y
,
f
m
−
1
(
x
)
+
α
T
(
x
;
Θ
m
)
)
=
[
r
−
α
T
(
x
;
Θ
m
)
]
2
L(y,f_{m-1}(x)+\alpha T(x;\Theta_m))=[r-\alpha T(x;\Theta_m)]^2
L(y,fm−1(x)+αT(x;Θm))=[r−αT(x;Θm)]2
分别关于
α
\alpha
α、
T
(
x
;
Θ
m
)
T(x;\Theta_m)
T(x;Θm)求导并令导数为0,
{
α
[
r
−
α
T
(
x
;
Θ
m
)
]
=
0
T
(
x
;
Θ
m
)
[
r
−
α
T
(
x
;
Θ
m
)
]
=
0
\begin{cases} \alpha[r-\alpha T(x;\Theta_m)]=0\\ T(x;\Theta_m)[r-\alpha T(x;\Theta_m)]=0 \end{cases}
{α[r−αT(x;Θm)]=0T(x;Θm)[r−αT(x;Θm)]=0
显然取 α = 1 \alpha=1 α=1, T ( x ; Θ m ) T(x;\Theta_m) T(x;Θm)拟合 r r r即是一个最优解,没有必要每次都去寻找一个权重。
算法流程
输入:训练数据集
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)};回归树个数
M
M
M;
输出:提升树
f
M
(
x
)
f_M(x)
fM(x)。
-
初始化 f 0 ( x ) = 0 f_0(x)=0 f0(x)=0
-
对 m = 1 , 2 , . . . , M m=1,2,...,M m=1,2,...,M
a. 计算残差
r m i = y i − f m − 1 ( x ) , i = 1 , 2 , . . . , n r_{mi}=y_i-f_{m-1}(x),\quad i=1,2,...,n rmi=yi−fm−1(x),i=1,2,...,n
b. 以残差 r m i r_{mi} rmi作为输入学习一个回归树(CART回归树生成),得到 T ( x ; Θ m ) T(x;\Theta_m) T(x;Θm)AdaBoost算法中,每个基分类器都是拟合原始数据 y y y,然后将这些基分类器的结果加权平均(权重为模型精度)。这里,每个模型都是拟合当前模型的残差。根本原因在于他们的损失函数不同。
c. 更新 f m ( x ) = f m − 1 ( x ) + T ( x ; Θ m ) f_m(x)=f_{m-1}(x)+T(x;\Theta_m) fm(x)=fm−1(x)+T(x;Θm)
-
得到回归问题提升树
f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) f_{M}(x)=\sum_{m=1}^MT(x;\Theta_m) fM(x)=m=1∑MT(x;Θm)
梯度提升树GBDT(一般损失函数)
梯度提升决策树(GBDT)算法是梯度提升(GB)算法限定基学习器是回归决策树时的模型,尤其是CART回归树。
提升树利用加法模型与前向分布算法实现学习的优化过程。当损失函数是指数损失函数和平方损失函数时,每一步优化是很简单的,但对一般损失函数而言,往往每一步优化并不那么容易,Freidman提出了梯度提升(gradient boosting)算法来解决这一问题。
由损失函数
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x))在
f
(
x
)
=
f
m
−
1
(
x
)
f(x)=f_{m-1}(x)
f(x)=fm−1(x)处的泰勒展开,
L
(
y
,
f
(
x
)
)
≈
L
(
y
,
f
m
−
1
(
x
)
)
+
[
∂
L
(
y
,
f
(
x
)
)
∂
f
(
x
)
]
f
(
x
)
=
f
m
−
1
(
x
)
(
f
(
x
)
−
f
m
−
1
(
x
)
)
L(y,f(x))\approx L(y,f_{m-1}(x))+\left[\frac{\partial L(y,f(x))}{\partial f(x)}\right]_{f(x)=f_{m-1}(x)}(f(x)-f_{m-1}(x))
L(y,f(x))≈L(y,fm−1(x))+[∂f(x)∂L(y,f(x))]f(x)=fm−1(x)(f(x)−fm−1(x))
令
f
(
x
)
=
f
m
(
x
)
f(x)=f_m(x)
f(x)=fm(x),
L
(
y
,
f
m
(
x
)
)
≈
L
(
y
,
f
m
−
1
(
x
)
)
+
[
∂
L
(
y
,
f
(
x
)
)
∂
f
(
x
)
]
f
(
x
)
=
f
m
−
1
(
x
)
(
f
m
(
x
)
−
f
m
−
1
(
x
)
)
L(y,f_m(x))\approx L(y,f_{m-1}(x))+\left[\frac{\partial L(y,f(x))}{\partial f(x)}\right]_{f(x)=f_{m-1}(x)}(f_m(x)-f_{m-1}(x))
L(y,fm(x))≈L(y,fm−1(x))+[∂f(x)∂L(y,f(x))]f(x)=fm−1(x)(fm(x)−fm−1(x))
L
(
y
,
f
m
(
x
)
)
−
L
(
y
,
f
m
−
1
(
x
)
)
≈
[
∂
L
(
y
,
f
(
x
)
)
∂
f
(
x
)
]
f
(
x
)
=
f
m
−
1
(
x
)
(
f
m
(
x
)
−
f
m
−
1
(
x
)
)
L(y,f_m(x))-L(y,f_{m-1}(x)) \approx \left[\frac{\partial L(y,f(x))}{\partial f(x)}\right]_{f(x)=f_{m-1}(x)}(f_m(x)-f_{m-1}(x))
L(y,fm(x))−L(y,fm−1(x))≈[∂f(x)∂L(y,f(x))]f(x)=fm−1(x)(fm(x)−fm−1(x))
我们的目标是极小化
L
(
y
,
f
m
(
x
)
)
L(y,f_m(x))
L(y,fm(x)),经过前面
m
−
1
m-1
m−1次的训练,我们已经得到
f
m
−
1
(
x
)
f_{m-1}(x)
fm−1(x),也就是说
L
(
y
,
f
m
−
1
(
x
)
)
L(y,f_{m-1}(x))
L(y,fm−1(x))是常数,因此在训练第
m
m
m个基模型时,近似地,我们只需要极小化
min
f
m
[
∂
L
(
y
,
f
(
x
)
)
∂
f
(
x
)
]
f
(
x
)
=
f
m
−
1
(
x
)
(
f
m
(
x
)
−
f
m
−
1
(
x
)
)
\min_{f_m}\left[\frac{\partial L(y,f(x))}{\partial f(x)}\right]_{f(x)=f_{m-1}(x)}(f_m(x)-f_{m-1}(x))
fmmin[∂f(x)∂L(y,f(x))]f(x)=fm−1(x)(fm(x)−fm−1(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)},
x
i
∈
X
⊆
R
n
x_i\in\mathcal{X}\subseteq \mathbb{R}^n
xi∈X⊆Rn,
y
i
∈
Y
⊆
R
y_i\in\mathcal{Y}\subseteq\mathbb{R}
yi∈Y⊆R;损失函数
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x));
输出:回归树
f
^
(
x
)
\hat{f}(x)
f^(x)。
- 初始化
f 0 ( x ) = arg min c ∑ i = 1 n L ( y i , c ) f_0(x)=\arg\min_{c}\sum_{i=1}^nL(y_i,c) f0(x)=argcmini=1∑nL(yi,c)
估计使损失函数极小化的常数值,它是只有一个根结点的树。
-
对 m = 1 , 2 , . . , M m=1,2,..,M m=1,2,..,M
a. 对 i = 1 , 2 , . . . , n i=1,2,...,n i=1,2,...,n,计算
r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi}=-\left[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}\right]_{f(x)=f_{m-1}(x)} rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)计算损失函数的负梯度在当前模型的值,将它作为残差的估计。对于平方损失函数,它就是通常所说的残差;对于一般损失函数,它就是残差的近似值。
b. 对 r m i r_{mi} rmi拟合一个回归树,得到第 m m m棵树的叶结点区域 R m j , j = 1 , 2 , . . . , J R_{mj},\quad j=1,2,...,J Rmj,j=1,2,...,J
估计回归树叶结点区域,以拟合残差的近似值。
c. 对 j = 1 , 2 , . . . , J j=1,2,...,J j=1,2,...,J,计算
c m j = arg min c ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c ) c_{mj}=\arg\min_{c}\sum_{x_i\in R_{mj}}L(y_i,f_{m-1}(x_i)+c) cmj=argcminxi∈Rmj∑L(yi,fm−1(xi)+c)利用线性搜索( c i + 1 = c i + α d c_{i+1}=c_i+\alpha d ci+1=ci+αd)估计叶结点区域的值,使损失函数极小化,
类似于平方损失函数情形,每个基分类器都是估计的前一估计器的残差,所以等权重是合理的。
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)+\sum_{j=1}^Jc_{mj}I\{x\in R_{mj}\} fm(x)=fm−1(x)+∑j=1JcmjI{x∈Rmj}
-
得到回归树
f ^ ( x ) = f M ( x ) = ∑ m = 1 M ∑ j = 1 J c m j I { x ∈ R m j } \hat{f}(x)=f_M(x)=\sum_{m=1}^M\sum_{j=1}^Jc_{mj}I\{x\in R_{mj}\} f^(x)=fM(x)=m=1∑Mj=1∑JcmjI{x∈Rmj}
一般的梯度提升算法GB
对于加法模型
f
(
x
)
=
∑
m
=
1
M
β
m
b
(
x
;
γ
m
)
f(x)=\sum_{m=1}^M\beta_mb(x;\gamma_m)
f(x)=m=1∑Mβmb(x;γm)
给出如下梯度提升算法。
输入:训练数据集
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)},
x
i
∈
X
⊆
R
n
x_i\in\mathcal{X}\subseteq \mathbb{R}^n
xi∈X⊆Rn,
y
i
∈
Y
⊆
R
y_i\in\mathcal{Y}\subseteq\mathbb{R}
yi∈Y⊆R;损失函数
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x));
输出:梯度提升模型
f
(
x
)
f(x)
f(x)。
- 初始化
f 0 ( x ) = arg min c ∑ i = 1 n L ( y i , c ) f_0(x)=\arg\min_{c}\sum_{i=1}^nL(y_i,c) f0(x)=argcmini=1∑nL(yi,c) - 对
m
=
1
,
2
,
.
.
,
M
m=1,2,..,M
m=1,2,..,M(极小化损失函数、更新)
a. 对 i = 1 , 2 , . . . , n i=1,2,...,n i=1,2,...,n,计算
r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi}=-\left[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}\right]_{f(x)=f_{m-1}(x)} rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
b. 利用 { r m i } \{r_{mi}\} {rmi}学习第 m m m个基分类器 b m ( x ) b_m(x) bm(x)
d. 更新 f m ( x ) = f m − 1 ( x ) + b m ( x ) f_m(x)=f_{m-1}(x)+b_m(x) fm(x)=fm−1(x)+bm(x) - 得到最终的梯度提升模型
f ( x ) = f M ( x ) = ∑ m = 1 M b m ( x ) f(x)=f_M(x)=\sum_{m=1}^Mb_m(x) f(x)=fM(x)=m=1∑Mbm(x)
参考:
统计学习方法—李航