- 1. 背景
- 1.1 Gradient Boosting
- 1.2 提升树-boosting tree
- 2 Gradient Boosting Decision Tree
- 2.1 函数空间的数值优化
- 2.2 算法
- Shrinkage
- 总结
- 附录
1. 背景
决策树是一种基本的分类与回归方法。决策树模型具有分类速度快,模型容易可视化的解释,但是同时是也有容易发生过拟合,虽然有剪枝,但也是差强人意。
提升方法(boosting)在分类问题中,它通过改变训练样本的权重(增加分错样本的权重,减小分队样本的的权重),学习多个分类器,并将这些分类器线性组合,提高分类器性能。boosting数学表示为:
f(x)=w0+∑m=1Mwmϕm(x) f ( x ) = w 0 + ∑ m = 1 M w m ϕ m ( x )
其中w是权重, ϕ ϕ 是弱分类器的集合,可以看出最终就是基函数的线性组合。
于是决策树与boosting结合产生许多算法,主要有提升树、GBDT等。本文主要是GBDT学习笔记。
1.1 Gradient Boosting
Gradient Boosting是一种Boosting的方法,它主要的思想是,每一次建立模型是在之前建立模型损失函数的梯度下降方向。损失函数是评价模型性能(一般为拟合程度+正则项),认为损失函数越小,性能越好。而让损失函数持续下降,就能使得模型不断改性提升性能,其最好的方法就是使损失函数沿着梯度方向下降(讲道理梯度方向上下降最快)。
Gradient Boost是一个框架,里面可以套入很多不同的算法。
1.2 提升树-boosting tree
以决策树为基函数的提升方法称为提升树,其决策树可以是分类树OR回归树。提升树模型可以表示为决策树的加法模型。
fM(x)=∑m=1MT(x;Θm) f M ( x ) = ∑ m = 1 M T ( x ; Θ m )
其中,
T(x;Θm)表示决策树, T ( x ; Θ m ) 表 示 决 策 树 ,
Θm Θ m 表示树的参数,M为树的个数。
回归问题提升树算法
输入:训练数据集 T={(x1,y1),(x2,y2),⋅⋅⋅,(xN,yN)},xi∈χ=Rn,yi∈γ, i=1,2,⋅⋅⋅,N T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , · · · , ( x N , y N ) } , x i ∈ χ = R n , y i ∈ γ , i = 1 , 2 , · · · , N ; γ γ 为输出空间。
输出:提升树 fM(x) f M ( x )
初始化 f0(x)=0 f 0 ( x ) = 0
对于 m=1,2,...M m = 1 , 2 , . . . M :
计算残差(后一棵树拟合前一颗树残差):
rmi=yi−fm−1(xi) r m i = y i − f m − 1 ( x i )
拟合残差学习一个回归树,得到 T(x;Θm) T ( x ; Θ m )
更新 fm(x)=fm−1(x)+T(x;Θm) f m ( x ) = f m − 1 ( x ) + T ( x ; Θ m )
M次迭代之后得到提升树:
fM(x)=∑m=1MT(x;Θm) f M ( x ) = ∑ m = 1 M T ( x ; Θ m )
2 Gradient Boosting Decision Tree
提升树的学习优化过程中,损失函数平方损失和指数损失时候,每一步优化相对简单,但对于一般损失函数优化的问题,Freidman提出了Gradient Boosting算法,其利用了损失函数的负梯度在当前模型的值
−[∂L(y,f(xi))∂f(xi)]f(x)=fm−1(x) − [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x )
作为回归问题提升树算法的残差近似值,去拟合一个回归树。
2.1 函数空间的数值优化
优化目标是使得损失函数最小,(N是样本集合大小):
F∗(x)=argminρ∑i=1NL(yi,ρ) F ∗ ( x ) = arg min ρ ∑ i = 1 N L ( y i , ρ )
GBDT是一个加法模型:
fm(x) f m ( x ) 是每一次迭代学习的到树模型。
F^(x)=FM(x)=∑m=1Mfm(x) F ^ ( x ) = F M ( x ) = ∑ m = 1 M f m ( x )
对于其每一步迭代:
fm(x)=−ρmgm(x) f m ( x ) = − ρ m g m ( x )
其中
gm(x)=[∂ϕ(F(x))∂F(x)]F(x)=Fm−1(x)ϕ(F(x))=Ey[L(y,F(x))|x],Fm−1(x)=∑i=0m−1fi(x) g m ( x ) = [ ∂ ϕ ( F ( x ) ) ∂ F ( x ) ] F ( x ) = F m − 1 ( x ) ϕ ( F ( x ) ) = E y [ L ( y , F ( x ) ) | x ] , F m − 1 ( x ) = ∑ i = 0 m − 1 f i ( x )
其实
L(y,F(x)) L ( y , F ( x ) ) 就是损失函数,
ϕ(F(x)) ϕ ( F ( x ) ) 是当前x下的损失期望,
gm(x) g m ( x ) 是当前x下的函数梯度。最终
fm(x) f m ( x ) 学习的是损失函数在函数空间上的负梯度。
对于权重 ρm ρ m 通过线性搜索求解(这也是后面算法改进的点):
ρm=argminρEy,xL(y,Fm−1(x)−ρ∗gm(x)) ρ m = arg min ρ E y , x L ( y , F m − 1 ( x ) − ρ ∗ g m ( x ) )
理解:每一次迭代可以看做是采用梯度下降法对最优分类器
F∗(x) F ∗ ( x ) 的逐渐比较,每一次学习的模型
fm(x) f m ( x ) 是梯度,进过M步迭代之后,最后加出来的模型就是最优分类器的一个逼近模型,所以
fm(xi) f m ( x i ) 使用单步修正方向
−gm(xi) − g m ( x i ) :
−gm(xi)=gm(x)=[∂L(F(x))∂F(x)]F(x)=Fm−1(x) − g m ( x i ) = g m ( x ) = [ ∂ L ( F ( x ) ) ∂ F ( x ) ] F ( x ) = F m − 1 ( x )
这里的
梯度变量是函数,是在函数空间上求解(这也是后面XGBoost改进的点),注意以往算法梯度下降是在N维的参数空间的负梯度方向,变量是参数。这里的变量是函数,更新函数通过当前函数的负梯度方向来修正模型,是它更优,最后累加的模型近似最优函数。
2.2 算法
输入:训练数据集 T={(x1,y1),(x2,y2),⋅⋅⋅,(xN,yN)} T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , · · · , ( x N , y N ) } , xi∈χ=Rn x i ∈ χ = R n , yi∈γ={−1,+1}, i=1,2,⋅⋅⋅,N y i ∈ γ = { − 1 , + 1 } , i = 1 , 2 , · · · , N ;
输出:回归树 fM(x) f M ( x )
初始化
f0(x)=argminc∑i=1NL(yi,c) f 0 ( x ) = a r g min c ∑ i = 1 N L ( y i , c )
对m=1,2,..M
对i=1,2,…,N,计算
rmi=−[∂L(y,f(xi))∂f(xi)]f(x)=fm−1(x) r m i = − [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x )
对 rmi r m i 拟合一颗回归树,得到第m棵树的叶结点区域 Rmj, j=1,2,...J R m j , j = 1 , 2 , . . . J ,即一棵由J个叶子节点组成的树。
对 j=1,2,...J j = 1 , 2 , . . . J ,计算
cmj=argminc∑xi∈RmjL(yi,fm−1(xi)+c) c m j = a r g min c ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c )
2.2,2.3这一步相当于回归树递归在遍历所有切分变量j和切分点s找到最优j,s,然后在每个节点区域求最优的c。参考回归树生成算法
更新 fm(x)=fm−1(x)+∑j=1JcmjI(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=1Mfm(x)=∑m=1M∑j=1JcmjI(x∈Rmj) f ^ ( x ) = f M ( x ) = ∑ m = 1 M f m ( x ) = ∑ m = 1 M ∑ j = 1 J c m j I ( x ∈ R m j )
算法1步获得使得损失函数最小的常数估计值,是一个只有根节点的树。在2.1步计算损失函数的负梯度在当前模型的值,将它作为残差估计。在2.2步估计回归树的叶结点区域,来拟合残差的近似值。在2.3步利用线性搜索估计回归树叶结点区域的值,使损失函数最小化。2.4更新回归树。第3步获得输出的最终模型。
Shrinkage
Shrinkage的思想认为,每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足。
数学方程对比:
- 之前: fm(x)=fm−1(x)+∑j=1JcmjI(x∈Rmj) f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J c m j I ( x ∈ R m j )
- Shrinkage: fm(x)=fm−1(x)+step∗∑j=1JcmjI(x∈Rmj) f m ( x ) = f m − 1 ( x ) + s t e p ∗ ∑ j = 1 J c m j I ( x ∈ R m j )
Shrinkage仍然以残差作为学习目标,但对于残差学习的结果,只累加一小部分,step一般取值0.001-0.01(非gradient的step),使得各个树的残差是渐变而不是陡变的,即将大步切成了小步。Shrinkage能减少过拟合发生也是经验证明的,目前还没有看到从理论的证明。
总结
原始的boosting算法开始时,为每一个样本赋上一个权重值。在每一步训练中得到的模型,会使得数据点的估计有对有错,在每一步结束后,增加分错的点的权重,减少分对的点的权重,这样使得某些点如果老是被分错,那么就会被“严重关注”,也就被赋上一个很高的权重。然后等进行了N次迭代(由用户指定),将会得到N个简单的分类器(basic learner),然后我们将它们组合起来(比如说可以对它们进行加权、或者让它们进行投票等),得到一个最终的模型。
那么GBDT算法中并未有权重的改变,哪里有boosting思想 ?
Gradient Boosting与Boosting区别在于,每一计算的是为了减少上一次的残差,下一个模型主要在残差减少的梯度方上建立模型,使得残差往梯度方向上减少。
虽然不同,但是GBDT算法会更关注那些梯度比较大的样本,和Boosting思想类似。
附录
CSDN原文:http://blog.csdn.net/shine19930820/article/details/65633436
参考资料
- 《统计学习方法》
- 《The Elements of Statistical Learning 》
- 《Machine Learning A Probabilistic Perspective》
- http://www.lai18.com/content/1406280.html
相似算法:
- LightGBM原理: A Highly Efficient Gradient Boosting Decision Tree
- XGBoost原理- A Scalable Tree Boosting System
- 数据挖掘十大算法 』笔记二:SVM-支持向量机
- 《Top 10 algorithms in data mining》