gradient boosting梯度提升决策树

声明:
1. 转自《统计学习方法》

gradient boosting

提升树利用加法模型与前向分步算法实现学习的优化过程。当损失函数是平方损失和指数损失函数时,每一步的优化都很简单。但对于一般损失函数而言,往往每一步的优化并不那么容易。针对这一问题,Freidman提出了gradient boosting算法。这是利用最速下降法,其关键是利用损失函数的负梯度在当前模型的值:

[L(yi,f(xi))f(xi)]f(x)=fm1(x) − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x )

作为回归问题提升树算法中的残差的近似值,训练一个回归树。

平方损失和指数损失下的提升树

针对不同问题的提升树学习算法,其主要区别在于使用的损失函数不同。包括平方误差损失函数的回归问题,用指数损失函数的分类问题,以及用一般损失函数的一般决策问题。

损失函数算法
平方误差损失boosting tree
指数损失函数Adaboost
一般损失函数gradient boosting desicion tree

Adaboost

前向分步算法是AdaBoost的另一种解释。
定理
AdaBoost算法是前向分步加法算法的特例。这时,模型是有基本分类器组成的加法模型,损失函数是指数函数。
证明
前向分步算法是加法模型,当基函数为基本分类器时,该加法模型等价于AdaBoost的最终分类器:

f(x)=m=1MαmGm(x) f ( x ) = ∑ m = 1 M α m G m ( x )

了解前向分步算法的可以跳过下面两小节

前向分步算法

考虑加法模型(additive model)

f(x)=m=1Mβmb(x;γm) f ( x ) = ∑ m = 1 M β m b ( x ; γ m )
其中, b(x;γm) b ( x ; γ m ) 是基函数。

在给定训练数据及损失函数 L(y,f(x)) L ( y , f ( x ) ) 的条件下,学习加法模型 f(x) f ( x ) 成为经验风险极小化即损失函数极小化问题:

minβm,γmi=1NL(yi,m=1Mβmb(x;γm)) m i n β m , γ m ∑ i = 1 N L ( y i , ∑ m = 1 M β m b ( x ; γ m ) )

通常这是一个复杂的优化问题。前向分步算法(forward stagewise algorithm)求解这一优化问题的想法是:因为学习的是加法模型,如果能从前往后,每一步只学习一个基函数及其系数,逐步逼近优化目标,那么就能简化优化的复杂度。具体地,每步只需要优化如下损失函数:

minβm,γmi=1NL(yi,βmb(x;γm)) m i n β m , γ m ∑ i = 1 N L ( y i , β m b ( x ; γ m ) )

算法流程:

  1. 初始化决策函数 f0(x)=0 f 0 ( x ) = 0
  2. 对所有的基函数, m=1,2,3,... m = 1 , 2 , 3 , . . .
    1. 极小化损失函数
      βm,γm=argminβm,γmi=1NL(yi,fm1β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,...,m1 1 , 2 , . . . , m − 1 基函数计算m基函数。
    2. 更新决策函数 fm(x)=fm1(x)+βmb(x;γm) f m ( x ) = f m − 1 ( x ) + β m b ( x ; γ m )
  3. 最后得到加法模型:
    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 β m , γ m 的优化问题。

在前向分步算法中损失函数表示为 L(y,f(x)) L ( y , f ( x ) ) , 首 先 可 以 想 到 如 何 得 到 损 失 函 数 到 底 是 什 么 。

AdaBoost的损失函数是指数函数

前向分步算法逐一学习基函数,这一过程与AdaBoost算法注意学习基本分类器的过程一致。下面证明前向分步算法的损失函数是指数损失函数(exponential loss function): L(x,f(x))=exp[yf(x)] L ( x , f ( x ) ) = e x p [ − y f ( x ) ] 时,其学习的具体操作等价于AdaBoost算法学习的具体算法。

假设经过 m1 m − 1 轮迭代,前向分步算法已经到 fm1(x) f m − 1 ( x )

fm1(x)=fm2(x)+αm1Gm1(x)=α1G1(x)+α2G2(x)+...+αm1Gm1(x) f m − 1 ( x ) = f m − 2 ( x ) + α m − 1 G m − 1 ( x ) = α 1 G 1 ( x ) + α 2 G 2 ( x ) + . . . + α m − 1 G m − 1 ( x )

在第 m m 轮迭代得到αm,Gm(x),fm(x)

fm(x)=fm1(x)+αmGm(x) f m ( x ) = f m − 1 ( x ) + α m G m ( x )

下面是前向分步算法极小化损失函数的步骤:

(αm,Gm(x))=argminαm,Gmi=1Nexp[yi(fm1(xi)+αmGm(xi)]=argminαm,Gmi=1Nexp[yi(fm1(xi)]exp[αmGm(xi)]=argminαm,Gmi=1Nw¯miexp[αmGm(xi)] ( α m , G m ( x ) ) = a r g m i n α m , G m ∑ i = 1 N e x p [ − y i ( f m − 1 ( x i ) + α m G m ( x i ) ] = a r g m i n α m , G m ∑ i = 1 N e x p [ − y i ( f m − 1 ( x i ) ] ⋅ e x p [ α m G m ( x i ) ] = a r g m i n α m , G m ∑ i = 1 N w ¯ m i ⋅ e x p [ α m G m ( x i ) ]

其中, w¯mi=exp[yi(fm1(xi)] w ¯ m i = e x p [ − y i ( f m − 1 ( x i ) ] ,既不依赖于 αm α m 也不依赖于 Gm G m ,所以与最小化无关。但是在最小化完成之后,需要更对它进行更新。

如果证得上式计算的 αm,Gm, α m ∗ , G m ∗ , 就是Adaboost算法中的 αm,Gm α m , G m ,则说明AdaBoost的损失函数就是指数函数。
此处省略证明过程,最终得到:

αm=12log1emem=αm α m ∗ = 1 2 l o g 1 − e m e m = α m

再由 w¯mi=exp[yi(fm1(xi)] w ¯ m i = e x p [ − y i ( f m − 1 ( x i ) ] w¯m+1i=w¯miexp[yiαmGm(x)] w ¯ m + 1 , i = w ¯ m i ⋅ e x p [ − y i α m G m ( x ) ] .这与AdaBoost的样本权值更新相似,只差一个规范化因子。

Boosting Tree

提升树模型可以表示为决策树的加法模型:

fM(x)=m=1MT(x;θm) f M ( x ) = ∑ m = 1 M T ( x ; θ m )

与Adaboost的加法模型不同的是,没有加权系数。

boosting Tree采用前向分步算法。首先确定初始提升树 f0(x)=0 f 0 ( x ) = 0 ,第m步的模型是

fm(x)=fm1(x)+T(x;θm) f m ( x ) = f m − 1 ( x ) + T ( x ; θ m )

每一步的损失函数是:
θ^m=argminθi=1NL(yi,fm1(x)+T(x;θm)) θ ^ m = a r g m i n θ ∑ i = 1 N L ( y i , f m − 1 ( x ) + T ( x ; θ m ) )

针对不同问题的提升树学习算法,其主要区别在于使用的损失函数不同:

  1. 回归问题——平方误差损失函数
  2. 分类问题——指数损失函数
  3. 一般决策问题——一般损失函数

对于二分类问题,提升树算法是Adaboost的特例,此时的Adaboost的基本分类器是二分类树。对于回归问题,采用平方误差损失函数,学习算法是拟合残差项(类比前向分步算法)。

  1. 初始化决策函数 f0(x)=0 f 0 ( x ) = 0
  2. 对所有的基函数, m=1,2,3,... m = 1 , 2 , 3 , . . .
    1. 计算残差
      rmi=yifm1(xi),i=1,2,...,N r m i = y i − f m − 1 ( x i ) , i = 1 , 2 , . . . , N
    2. 极小化残差项,学习一个回归树,得到 T(x;θm) T ( x ; θ m )
    3. 更新决策函数 fm(x)=fm1(x)+T(x;θm) f m ( x ) = f m − 1 ( x ) + T ( x ; θ m )
  3. 最后得到加法模型:
    f(x)=fM(x)=m=1MT(x;θm) f ( x ) = f M ( x ) = ∑ m = 1 M T ( x ; θ m )

GBDT的算法流程

  1. 初始化决策函数 f0(x)=argmincNi=1L(yi,c) f 0 ( x ) = a r g m i n c ∑ i = 1 N L ( y i , c )
  2. 对所有的基函数, m=1,2,3,... m = 1 , 2 , 3 , . . .
    1. 计算梯度,用梯度近似残差项
      rmi=[L(yi,f(xi))f(xi)]f(x)=fm1(x) r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x )
    2. rmi r m i 拟合一个回归树,得到第m棵树的叶节点区域 Rmj R m j
    3. 对所有的叶节点区域,极小化损失函数:
      cmj=argmincxiRmjL(yi,fm1(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 )
    4. 更新决策函数 fm(x)=fm1(x)+Jj=1cmjI(xRmj) f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J c m j I ( x ∈ R m j )
  3. 最后得到加法模型:
    f(x)=fM(x)=m=1Mj=1JcmjI(xRmj) 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的细节暂不做展开。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值