向前分步算法与梯度提升决策树
向前分布算法
在Adaboost算法中,最终的目的是构建弱分类器的线性组合:
f ( x ) = ∑ t = 1 T α t h t ( x ) f(x)=\sum_{t=1}^{T} \alpha_{t} h_t(x) f(x)=∑t=1Tαtht(x)
得到最终的学习器。
于是我们来看一下加法模型(加法模型就是说强学习器是由一系列弱学习器线性相加而成):
f ( x ) = ∑ i = m M β m b ( x ; γ m ) f(x)=\sum_{i=m}^{M} \beta_{m}b(x;\gamma_m) f(x)=∑i=mMβmb(x;γm)
b ( x ; γ m ) b(x;\gamma_{m}) b(x;γm) 是基函数, β m \beta_{m} βm 是基函数的系数, γ m \gamma_{m} γm为基函数的参数。
显然Adaboost是一个加法模型
在给定训练数据及损失函数
L
(
y
,
f
(
x
)
)
L(y, f(x))
L(y,f(x)) 时,学习加法模型成为经验风险极小化即损失函数最小化问题:
min β m , γ m ∑ i = 1 N L ( y i , ∑ m = 1 M β m b ( x i ; γ m ) ) \min _{\beta_{m}, \gamma_{m}} \sum_{i=1}^{N} L\left(y_{i}, \sum_{m=1}^{M} \beta_{m} b\left(x_{i} ; \gamma_{m}\right)\right) minβm,γm∑i=1NL(yi,∑m=1Mβmb(xi;γm))
这是一个复杂的优化问题。
前向分布算法求解这一优化问题的思想:
因为学习的是加法模型,那如果能够从前向后,每一步只学习一个基函数及其系数,然后逐步逼近优化目标式,就可以简化优化的复杂度。具体每一步只需优化如下损失函数:
min β , γ ∑ i = 1 N L ( y i , β b ( x i ; γ ) ) \min _{\beta, \gamma} \sum_{i=1}^{N} L\left(y_{i}, \beta b\left(x_{i} ; \gamma\right)\right) minβ,γ∑i=1NL(yi,βb(xi;γ))
- 向前分步算法:
我们给定数据集 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 , γ ) } \{b(x,\gamma)\} {b(x,γ)}
输出加法模型 f ( x ) f(x) f(x)
- 初始化 f 0 ( x ) = 0 f_0(x) = 0 f0(x)=0
- 对
m
=
1
,
2
,
3......
M
m = 1,2,3......M
m=1,2,3......M:
考虑加法模型,令 f m ( x ) = ∑ i = 1 m β i b ( x , γ i ) f_m(x) = \sum_{i=1}^m\beta_ib(x,\gamma_i) fm(x)=∑i=1mβib(x,γi)
极小化损失函数: ( β m , γ m ) = arg min β , γ ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x i ; γ ) ) \left(\beta_{m}, \gamma_{m}\right)=\arg \min _{\beta, \gamma} \sum_{i=1}^{N} L\left(y_{i}, f_{m-1}\left(x_{i}\right)+\beta b\left(x_{i} ; \gamma\right)\right) (βm,γm)=argminβ,γ∑i=1NL(yi,fm−1(xi)+βb(xi;γ))
得到参数 β m , γ m \beta_m,\gamma_m βm,γm
更新:
f m ( x ) = f m − 1 ( x ) + β m b ( x ; γ m ) f_{m}(x)=f_{m-1}(x)+\beta_{m}b(x;\gamma_{m}) fm(x)=fm−1(x)+βmb(x;γm) - 得到加法模型
f ( x ) = f M ( x ) = ∑ m = 1 M β m b ( x ; γ m ) f(x)=f_{M}(x)=\sum_{m=1}^{M} \beta_{m} b\left(x ; \gamma_{m}\right) f(x)=fM(x)=∑m=1Mβmb(x;γm)
这样,向前分步算法将同时求解从 m = 1 m = 1 m=1 到 M 的所有参数 β m , γ m \beta_m,\gamma_m βm,γm 的优化问题简化为逐次求解各个 β m , γ m \beta_m,\gamma_m βm,γm的优化问题。Adaboost算法是前向分步算法的特例,Adaboost算法是由基学习器组成的加法模型,损失函数为指数损失函数。
梯度提升决策树(GDBT)
基于残差(样本x的标记值y与预测值的差值)的决策树
之前我们学习的一直是分类问题,在上面我们提出了一种加法模型+向前分步算法的框架,那么我们能够用这个来解决回归问题吗?答案是肯定的。
在用加法模型+向前分步算法的框架来解决回归问题时,我们首先要确定基函数(基学习器)是什么,在这里我们使用决策树,对于回归树算法来说最重要的是寻找最佳的划分点,那么回归树中的可划分点包含了所有特征的所有可取的值。在分类树中最佳划分点的判别标准是信息增益(ID3算法),信息增益比(C4.5算法),基尼系数(CART分类树),都是用纯度来衡量的,但是在回归树中的样本标签是连续数值,所以再使用熵之类的指标不再合适,取而代之的是平方误差,它能很好的评判拟合程度。基函数确定了以后,我们需要确定每次提升的标准是什么。回想Adaboost算法,在Adaboost算法内使用了分类错误率修正样本权重以及计算每个基本分类器的权重,那回归问题没有分类错误率可言,也就没办法在这里的回归问题使用了,因此我们需要另辟蹊径。模仿分类错误率,我们用每个样本的残差表示每次使用基函数预测时没有解决的那部分问题。因此,我们可以得出如下算法:
- 输入数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x N , y N ) } , x i ∈ X ⊆ R n , y i ∈ Y ⊆ R T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\}, x_{i} \in \mathcal{X} \subseteq \mathbf{R}^{n}, y_{i} \in \mathcal{Y} \subseteq \mathbf{R} T={(x1,y1),(x2,y2),⋯,(xN,yN)},xi∈X⊆Rn,yi∈Y⊆R;
- 输出最终的提升树 f M ( x ) f_M(x) fM(x)
- 初始化 f 0 ( x ) = 0 f_0(x) = 0 f0(x)=0
- 对
m
=
1
,
2
,
3......
M
m = 1,2,3......M
m=1,2,3......M:
(a):计算每个样本的残差: r m i = y i − f m − 1 ( x i ) , i = 1 , 2 , ⋯ , N r_{m i}=y_{i}-f_{m-1}\left(x_{i}\right), \quad i=1,2, \cdots, N rmi=yi−fm−1(xi),i=1,2,⋯,N
(b):拟合残差 r m i r_{mi} rmi学习一个回归树,得到 T ( x ; Θ m ) T\left(x ; \Theta_{m}\right) T(x;Θm)
(c):更新 f m ( x ) = f m − 1 ( x ) + T ( x ; Θ m ) f_{m}(x)=f_{m-1}(x)+T\left(x ; \Theta_{m}\right) fm(x)=fm−1(x)+T(x;Θm) - 得到回归问题提升树:
f
M
(
x
)
=
∑
m
=
1
M
T
(
x
;
Θ
m
)
f_{M}(x)=\sum_{m=1}^{M} T\left(x ; \Theta_{m}\right)
fM(x)=∑m=1MT(x;Θm)
M是树的个数, Θ m \Theta_m Θm是决策树的参数, T ( x ; Θ m ) 是 决 策 树 T(x;\Theta_m)是决策树 T(x;Θm)是决策树
那我们的这个算法是否还有可以提升的空间呢?
梯度提升决策树算法
提升树利用加法模型和前向分步算法实现学习的过程,当损失函数为平方误差和指数误差时,每一步的优化是非常简单的,当损失函数为平方误差时也就是上面的提升树算法,当损失函数时指数误差时对应的就是Adaboost算法。那么当我们的损失函数是其他函数时我们怎么优化呢?
针对这一问题,Friedman提出了梯度提升树算法,这是利用最速下降的近似方法,其关键是利用损失函数的负梯度作为提升树算法中的残差的近似值。
为什么要用负梯度呢?
现在来研究一下误差函数
L
L
L 对拟合函数
f
f
f 的梯度。
对拟合函数
F
F
F,设拟合值
y
^
=
f
(
x
)
\hat{y} = f(x)
y^=f(x)
采用平方误差函数
L
(
y
,
f
(
x
)
)
=
(
y
−
f
(
x
)
)
2
2
L(y,f(x))=\frac{(y−f(x))^2}{2}
L(y,f(x))=2(y−f(x))2
对所有样本,总的误差
J
=
∑
i
=
1
n
L
(
y
,
f
(
x
i
)
)
J = \sum_{i=1}^nL(y,f(x_i))
J=∑i=1nL(y,f(xi))
样本的目标值 y i y_i yi是已知的,误差 J J J 最后算出来的结果就是一个数值标量,总共有 n n n个样本,所以 误差 J J J 是 n n n元变量 { y ^ 1 , y ^ 2 , y ^ 3 . . . . . . y ^ n } \{\hat{y}_1,\hat{y}_2,\hat{y}_3......\hat{y}_n\} {y^1,y^2,y^3......y^n}的函数。
计算 函数J 的梯度:
∇ J = ( ∂ J ∂ y ^ 1 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ∂ J ∂ y ^ i ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ∂ J ∂ y ^ n ) \nabla{J} = (\frac{\partial{J}}{\partial{\hat{y}_1}}······\frac{\partial{J}}{\partial{\hat{y}_i}}······\frac{\partial{J}}{\partial{\hat{y}_n}}) ∇J=(∂y^1∂J⋅⋅⋅⋅⋅⋅∂y^i∂J⋅⋅⋅⋅⋅⋅∂y^n∂J)
∂ J ∂ y ^ i = ∂ ∑ i n L ( y i , f ( x i ) ) ∂ y ^ i = ∂ L ( y i , f ( x i ) ) ∂ y ^ i = ∂ ( ( y i − f ( x i ) ) 2 / 2 ) ∂ y ^ i = ∂ ( ( y i − y ^ i ) 2 / 2 ) ∂ y ^ i = − ( y i − y ^ i ) \frac{\partial{J}}{\partial{\hat{y}_i}}=\frac{\partial\sum_i^nL(y_i,f(x_i))}{\partial{\hat{y}_i}}=\frac{\partial{L(y_i,f(x_i))}}{\partial{\hat{y}_i}}=\frac{\partial{((y_i−f(x_i))^2/2)}}{\partial{\hat{y}_i}}=\frac{\partial{((y_i−{\hat{y}}_i)^2/2)}}{\partial{\hat{y}_i}}=-(y_i−{\hat{y}}_i) ∂y^i∂J=∂y^i∂∑inL(yi,f(xi))=∂y^i∂L(yi,f(xi))=∂y^i∂((yi−f(xi))2/2)=∂y^i∂((yi−y^i)2/2)=−(yi−y^i)
( y i − y ^ i ) = − ∂ J ∂ y ^ i (y_i−{\hat{y}}_i)=-\frac{\partial{J}}{\partial{\hat{y}_i}} (yi−y^i)=−∂y^i∂J
y − y ^ = − ∇ J y-\hat{y}=-\nabla{J} y−y^=−∇J
此时我们发现GBDT的负梯度就是残差
以下开始具体介绍梯度提升算法:
输入训练数据集
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
⋯
,
(
x
N
,
y
N
)
}
,
x
i
∈
X
⊆
R
n
,
y
i
∈
Y
⊆
R
T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\}, x_{i} \in \mathcal{X} \subseteq \mathbf{R}^{n}, y_{i} \in \mathcal{Y} \subseteq \mathbf{R}
T={(x1,y1),(x2,y2),⋯,(xN,yN)},xi∈X⊆Rn,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}^{N} L\left(y_{i}, c\right) f0(x)=argminc∑i=1NL(yi,c)
- 对于m=1,2,…,M:
- 对i = 1,2,…,N计算负梯度即残差: r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{m i}=-\left[\frac{\partial L\left(y_{i}, f\left(x_{i}\right)\right)}{\partial f\left(x_{i}\right)}\right]_{f(x)=f_{m-1}(x)} rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
- 将上步得到的残差作为样本新的真实值,并将数据 ( x i , r i m ) , i = 1 , 2 , . . N (x_i,r_{im}) , i = 1 , 2 , . . N (xi,rim),i=1,2,..N作为下棵树的训练数据,得到一颗新的回归树 f m ( x ) f_{m} (x) fm(x)其对应的叶子节点区域为 R j m , j = 1 , 2 , . . . , J R_{jm}, j =1,2,..., J Rjm,j=1,2,...,J。其中 J J J为回归树t的叶子节点的个数。
- 对对叶子区域 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_{m j}=\arg \min _{c} \sum_{x_{i} \in R_{m j}} L\left(y_{i}, f_{m-1}\left(x_{i}\right)+c\right) cmj=argminc∑xi∈RmjL(yi,fm−1(xi)+c)
- 更新 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}^{J} c_{m j} I\left(x \in R_{m j}\right) 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}^{J} c_{m j} I\left(x \in R_{m j}\right) f^(x)=fM(x)=∑m=1M∑j=1JcmjI(x∈Rmj)