声明:
1. 转自《统计学习方法》
gradient boosting
提升树利用加法模型与前向分步算法实现学习的优化过程。当损失函数是平方损失和指数损失函数时,每一步的优化都很简单。但对于一般损失函数而言,往往每一步的优化并不那么容易。针对这一问题,Freidman提出了gradient boosting算法。这是利用最速下降法,其关键是利用损失函数的负梯度在当前模型的值:
作为回归问题提升树算法中的残差的近似值,训练一个回归树。
平方损失和指数损失下的提升树
针对不同问题的提升树学习算法,其主要区别在于使用的损失函数不同。包括平方误差损失函数的回归问题,用指数损失函数的分类问题,以及用一般损失函数的一般决策问题。
损失函数 | 算法 |
---|---|
平方误差损失 | boosting tree |
指数损失函数 | Adaboost |
一般损失函数 | gradient boosting desicion tree |
Adaboost
前向分步算法是AdaBoost的另一种解释。
定理
AdaBoost算法是前向分步加法算法的特例。这时,模型是有基本分类器组成的加法模型,损失函数是指数函数。
证明
前向分步算法是加法模型,当基函数为基本分类器时,该加法模型等价于AdaBoost的最终分类器:
前向分步算法
考虑加法模型(additive model)
在给定训练数据及损失函数 L(y,f(x)) L ( y , f ( x ) ) 的条件下,学习加法模型 f(x) f ( x ) 成为经验风险极小化即损失函数极小化问题:
通常这是一个复杂的优化问题。前向分步算法(forward stagewise algorithm)求解这一优化问题的想法是:因为学习的是加法模型,如果能从前往后,每一步只学习一个基函数及其系数,逐步逼近优化目标,那么就能简化优化的复杂度。具体地,每步只需要优化如下损失函数:
算法流程:
- 初始化决策函数 f0(x)=0 f 0 ( x ) = 0
- 对所有的基函数,
m=1,2,3,...
m
=
1
,
2
,
3
,
.
.
.
- 极小化损失函数
βm,γm=argminβm,γm∑i=1NL(yi,fm−1−βmb(x;γm)) β m , γ m = a r g m i n β m , γ m ∑ i = 1 N L ( y i , f m − 1 − β m b ( x ; γ m ) )即,每一步都要计算下一步的参数值,或者说每一个m-1基函数的参数计算完成,都要基于所有 1,2,...,m−1 1 , 2 , . . . , m − 1 基函数计算m基函数。
- 更新决策函数 fm(x)=fm−1(x)+βmb(x;γm) f m ( x ) = f m − 1 ( x ) + β m b ( x ; γ m )
- 极小化损失函数
- 最后得到加法模型:
f(x)=fM(x)=∑m=1Mβmb(x;γm) f ( x ) = f M ( x ) = ∑ m = 1 M β m b ( x ; γ m )
这样,前向分步算法将同时求解 从 m=1 m = 1 到 M M 所有参数 的优化问题简化为逐次求解各个 βm,γm β m , γ m 的优化问题。
AdaBoost的损失函数是指数函数
前向分步算法逐一学习基函数,这一过程与AdaBoost算法注意学习基本分类器的过程一致。下面证明前向分步算法的损失函数是指数损失函数(exponential loss function): L(x,f(x))=exp[−yf(x)] L ( x , f ( x ) ) = e x p [ − y f ( x ) ] 时,其学习的具体操作等价于AdaBoost算法学习的具体算法。
假设经过
m−1
m
−
1
轮迭代,前向分步算法已经到
fm−1(x)
f
m
−
1
(
x
)
:
在第
m
m
轮迭代得到:
下面是前向分步算法极小化损失函数的步骤:
其中, w¯mi=exp[−yi(fm−1(xi)] w ¯ m i = e x p [ − y i ( f m − 1 ( x i ) ] ,既不依赖于 αm α m 也不依赖于 Gm G m ,所以与最小化无关。但是在最小化完成之后,需要更对它进行更新。
如果证得上式计算的
α∗m,G∗m,
α
m
∗
,
G
m
∗
,
就是Adaboost算法中的
αm,Gm
α
m
,
G
m
,则说明AdaBoost的损失函数就是指数函数。
此处省略证明过程,最终得到:
再由 w¯mi=exp[−yi(fm−1(xi)] w ¯ m i = e x p [ − y i ( f m − 1 ( x i ) ] 得 w¯m+1,i=w¯mi⋅exp[−yiαmGm(x)] w ¯ m + 1 , i = w ¯ m i ⋅ e x p [ − y i α m G m ( x ) ] .这与AdaBoost的样本权值更新相似,只差一个规范化因子。
Boosting Tree
提升树模型可以表示为决策树的加法模型:
与Adaboost的加法模型不同的是,没有加权系数。
boosting Tree采用前向分步算法。首先确定初始提升树
f0(x)=0
f
0
(
x
)
=
0
,第m步的模型是
每一步的损失函数是:
针对不同问题的提升树学习算法,其主要区别在于使用的损失函数不同:
- 回归问题——平方误差损失函数
- 分类问题——指数损失函数
- 一般决策问题——一般损失函数
对于二分类问题,提升树算法是Adaboost的特例,此时的Adaboost的基本分类器是二分类树。对于回归问题,采用平方误差损失函数,学习算法是拟合残差项(类比前向分步算法)。
- 初始化决策函数 f0(x)=0 f 0 ( x ) = 0
- 对所有的基函数,
m=1,2,3,...
m
=
1
,
2
,
3
,
.
.
.
- 计算残差
rmi=yi−fm−1(xi),i=1,2,...,N r m i = y i − f m − 1 ( x i ) , i = 1 , 2 , . . . , N
- 极小化残差项,学习一个回归树,得到 T(x;θm) T ( x ; θ m )
- 更新决策函数 fm(x)=fm−1(x)+T(x;θm) f m ( x ) = f m − 1 ( x ) + T ( x ; θ m )
- 计算残差
- 最后得到加法模型:
f(x)=fM(x)=∑m=1MT(x;θm) f ( x ) = f M ( x ) = ∑ m = 1 M T ( x ; θ m )
GBDT的算法流程
- 初始化决策函数 f0(x)=argminc∑Ni=1L(yi,c) f 0 ( x ) = a r g m i n c ∑ i = 1 N L ( y i , c )
- 对所有的基函数,
m=1,2,3,...
m
=
1
,
2
,
3
,
.
.
.
- 计算梯度,用梯度近似残差项
rmi=−[∂L(yi,f(xi))∂f(xi)]f(x)=fm−1(x) r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x )
- 对 rmi r m i 拟合一个回归树,得到第m棵树的叶节点区域 Rmj R m j
- 对所有的叶节点区域,极小化损失函数:
cmj=argminc∑xi∈RmjL(yi,fm−1(xi)+c) c m j = a r g m i n c ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c )
- 更新决策函数 fm(x)=fm−1(x)+∑Jj=1cmjI(x∈Rmj) f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J c m j I ( x ∈ R m j )
- 计算梯度,用梯度近似残差项
- 最后得到加法模型:
f(x)=fM(x)=∑m=1M∑j=1JcmjI(x∈Rmj) f ( x ) = f M ( x ) = ∑ m = 1 M ∑ j = 1 J c m j I ( x ∈ R m j )
算法第一步初始化,估计使算是函数极小化的常数值,它是只有一个根节点的树。第2.1步计算损失函数的负梯度在当前模型的值,将它作为残差项的估计。第2.2步估计回归树叶结点区域,以拟合残差项的近似值。第2.3步利用线性搜索估计叶结点区域的值,使损失函数极小化。第2.4步更新回归树。第3步得到输出的最终模型 f^(x) f ^ ( x )
Note: 真正的GBDT中,还有一个超参数是学习率lr
,lr使得GBDT中每个子分类器在优化求解的过程中,只拟合部分误差。这种方法可以减少GBDT过拟合的风险。关于GBDT的细节暂不做展开。