当前位置: 代码迷 >> 综合 >> 机器学习笔记-Gradient Boosted Decision Tree
  详细解决方案

机器学习笔记-Gradient Boosted Decision Tree

热度:48   发布时间:2023-12-15 06:44:29.0

集成学习系列:

  • Blending and Bagging
  • Adaptive Boosting
  • Decision Tree
  • Random Forest
  • Gradient Boosted Decision Tree

Gradient Boosted Decision Tree(梯度提升决策树)

上一篇介绍了 Random Forest R a n d o m F o r e s t ,该算法利用 Bagging Bagging 中的 bootstrap bootstrap 机制得到不同的 Decision Tree Decision Tree , 然后将这些 Decision Tree Decision Tree 融合起来。除了基本的 Bagging Bagging Decision Tree Decision Tree 之外, Random Forest Random Forest 还在 decision tree decision tree 中加入了更多的随机性。有了这些机制之后,我们发现这个算法可以利用 OOB OOB 数据做 self validation self validation , 进一步结合 self validation self validation 的机制和 permutation test permutation test 的做法我们利用 random forest random forest 来做 feature selection feature selection

提升方法 (boosting) ( b o o s t i n g ) 的代表性算法是 AdaBoost AdaBoost 。提升树是以分类或者回归树为基本学习器的提升方法。由于树的线性组合可以很好的拟合训练数据,即使数据中的输入和输出之间的关系很复杂也没关系,所以提升树是一个高功能的学习算法。本篇讨论针对不同问题的提升树学习算法。其主要的区别在于使用的损失函数不同,首先介绍使用指数损失的分类问题,此时的提升树算法只需要将 Adaboost Adaboost 算法的弱分类器设置为加了限制的二分类树即可,可以说提升树算法用于分类是 Adaboost Adaboost 的特殊情况。接下来介绍提升树算法损失函数为平方损失时候的回归问题,之后我们会发现对回归问题的提升树算法来说,只需要在每一轮使得弱学习器来简单的拟合当前模型的残差就好了。提升树利用加法模型和前向分步算法实现优化过程,当损失函数为平方损失或者是指数损失时分别为我们上述讨论的回归问题和分类问题。但是对于一般的损失函数而言,每一步的优化并不简单。这样便有了梯度提升算法。其关键是利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值来进行回归树的拟合。

1 - 提升树模型

1.1 - 提升树用于分类-Adaboost的特殊情况

先再回顾下 random forest random forest 的算法的形式:外层是一个 bagging bagging , 可以使用 bootstrap bootstrap 的方式来得到不同的 gt g t ,内层是一个加了更多 randomness randomness randomized-decision tree randomized-decision tree
再回忆下 adaboost adaboost 算法的步骤:在这个算法中,每一轮每一个样本被赋予一个权重 u(t)n u n ( t ) ,算法通过最小化被 u(t)n u n ( t ) 加权的 Ein E i n 来得到 gt g t ,再计算 gt g t 的权重 αt α t 来融合得到最终的 G G

我们之前将 decision tree 搭配 bagging bagging 得到了 random forest random forest ,同样地,我们可以将 decision tree decision tree 搭配 adaboost adaboost 得到 boosting tree boosting tree 提升树算法。但是现在我们需要面对的一个新的问题是,在算法 boosting tree boosting tree 中, 决策树作为弱学习器是处理不了加权的数据的, 而在 adaboost adaboost 中每一轮的数据都是带有权重的数据, 也就是 adaboost adaboost 中的 base algorithm base algorithm 要能够解决如下的最小化问题:

minimize Euin=1Nn=1Nun?err(yn,h(xn)) m i n i m i z e E i n u = 1 N ∑ n = 1 N u n ? e r r ( y n , h ( x n ) )

因为 decision tree decision tree 有很多种实现,有很多技巧在里面。所以我们决定将 decision tree decision tree 当做是一个黑盒子,我们不再要求这个黑盒子可以处理加权的数据,而是对加权的数据本身做处理,使之变为不加权的数据然后喂给 decision tree decision tree

其实这一点是很容易做到, 权重是从 bagging bagging 中的 bootstrap bootstrap 中得到的,在做 bootstrap bootstrap 的时候,得到了几份 (xn,yn) ( x n , y n ) , 那么 (xn,yn) ( x n , y n ) 的权重就是几: (xn,yn) ( x n , y n ) 的权重是3代表抽取到了3份 (xn,yn) ( x n , y n ) ,权重是4代表抽取到了4份 (xn,yn) ( x n , y n ) ,所以权重就代表了在资料中有几份 (xn,yn) ( x n , y n ) 的复制。所以我们就可以根据 bootstrap bootstrap 的计算机制得到的权重 u(t)n u n ( t ) 先对资料进行抽样,这样就得到了一笔新的大小为 N N ′ 资料 D~t D ~ t , 在这笔资料中就隐含了权重的信息。现在看来,在 bagging bagging 中我们是先 bootstrap bootstrap ,通过得到的样本数量获得权重;现在在 boosting tree boosting tree 中,我们利用了这个过程的逆过程,根据权重来得到样本的数量,这样做的目的是为了不改变底层的 decision tree decision tree 算法。

所以在 boosting tree boosting tree 中,我们没有更改 decision tree decision tree 的部分, 没有更改 adaptive boosting adaptive boosting 的部分, 而是在中间的环节按照样本的权重做了一个抽样的过程得到新的资料 D~t D ~ t 然后喂给 decision tree decision tree


boosting tree boosting tree
AdaBoost+samplingu(t)+DecisionTree(D~t) A d a B o o s t + s a m p l i n g ∝ u ( t ) + D e c i s i o n T r e e ( D ~ t )

1.2 - 提升树的一些改进

adaboost a d a b o o s t 中,当得到了一个 gt g t 的时候,我们下一步需要作出的决定是这个 gt g t 该以多大的权重加入到 G G 中。这个权重我们记为 α t αt α t 的计算公式如下:

αt=ln?t=ln1??t?t????? α t = l n ? t = l n 1 ? ? t ? t

其中 ?t ? t 指的是 gt g t 的错误率。

这样可能会出现一个问题:
如果我们用于训练的资料完全是不同的,那么一棵完全长成的决策树的 Ein E i n 就是 0 0 , 那么 E i n u = 0 , 那么 ?t=0 ? t = 0 ,所以 αt= α t = ∞ 。所以在这种情况下,最终只是得到了一棵“最好”的树,这就违背了我们的大主题: aggregation a g g r e g a t i o n
问题出在哪里呢?因为我们把所有的数据都喂给了算法, 并且算法能得到的是一个完全长成的树。所以如果要解决这个问题的话,有两个方面可以着手:

  • 不要把所有的数据都喂给算法;
  • 对决策树构造算法做一些限制;

通过这样的技巧我们就可以得到一棵“弱”一点的树。其实我们通过 bootstrap bootstrap 抽样已经做到了不将所有的数据都喂给算法。另外通过采用简单的策略,例如限制决策树的高度也可以得到一棵比较“弱”的树。

所以在实际的应用中,提升树通常是如下的形式:原来的 adaboost adaboost 算法的框架下,根据权重进行采样 sampling sampling ,从而得到隐含有权重意义的数据 D~t D ~ t ,并且通过这样的采样方式也可以避免得到一棵所谓“最好”的树,然后将 D~t D ~ t 喂给 decision tree decision tree ,但是 decision tree d e c i s i o n t r e e 的构造要加一点限制,通常是限制树的高度,也就是利用数据 D~t D ~ t 构造一棵 pruned decision tree pruned decision tree


boosting tree boosting tree
AdaBoost+samplingu(t)+pruned Decision Tree(D~t) A d a B o o s t + s a m p l i n g ∝ u ( t ) + p r u n e d D e c i s i o n T r e e ( D ~ t )

1.3 - 提升树实例

上面提到在 boosting tree boosting tree 算法中,决策树在构造的时候需要限制树的高度, 得到一些“弱”一点的树, 再和 adaboost adaboost 搭配起来。我们考虑一种极端的情况,如果我们限制树的高度小于等于1,此时的决策树变为决策树桩。那么 adaboost adaboost 和这样的 decision treeheight<=1 decision tree ( h e i g h t <= 1 ) 搭配起来会是什么样子的呢?其实这个时候的 boosting tree boosting tree 就退化为了 boosting stump boosting stump

因为针对每一个样本集合,这时 decision treeCART d e c i s i o n t r e e ( C A R T ) 需要做的就只是选择一个分支条件 b(x) b ( x ) 将样本集合划分为两个子树。其划分的依据就是要使得划分之后的数据的不纯度最低

b(x)=argmindecision stump h(x)c=12|Dc with h|?impurity(Dc with h) b ( x ) = a r g m i n d e c i s i o n s t u m p h ( x ) ? ∑ c = 1 2 | D c w i t h h | ? i m p u r i t y ( D c w i t h h )

这个时候就几乎不会出现 ?=0 ? = 0 的情况, 那么这个时候也不见得会做抽样,而是直接在 decision stump d e c i s i o n s t u m p 中考虑权重。

所以简单来说,提升树用于分类只是将 AdaBoost AdaBoost 算法框架中的弱分类器限制为二类分类树即可。

2 - 优化视角下的Adaboost

2.1 - Adaboost的指数损失函数

这一小节通过分析得到 AdaBoost AdaBoost 算法的损失函数是实际上是指数损失 L=exp(?ys) L = e x p ( ? y s ) 。并且可以证明, AdaBoost AdaBoost 算法是前向分步算法在损失函数为指数函数时的加法模型。

首先我们回忆一下 AdaBoost AdaBoost 中每一个样本的权重的计算公式, u(t+1)n u n ( t + 1 ) 是根据 u(t)n u n ( t ) 计算得到的。如果该样本划分不正确,那么 u(t+1)n=u(t)n??t u n ( t + 1 ) = u n ( t ) ? ? t ;如果该样本划分正确,那么 u(t+1)n=u(t)n/?t u n ( t + 1 ) = u n ( t ) / ? t 我们再来审视一下这个更新规则:样本划分不正确的意思就是: yngt(xn) y n ≠ g t ( x n ) ;样本划分正确的意思就是: yn=gt(xn) y n = g t ( x n ) 那么权重 u u 的更新规则就变为:

u n ( t + 1 ) = u n ( t ) ? ? t ? y n g t ( x n )


αt=ln(?t)=ln(1??t?t????) α t = l n ( ? t ) = l n ( 1 ? ? t ? t ) ,所以 ?t=eαt ? t = e α t
更新规则进一步变为:

u(t+1)n=u(t)n?exp(?ynαtgt(xn)) u n ( t + 1 ) = u n ( t ) ? e x p ( ? y n α t g t ( x n ) )

通过这样的表达我们看到样本 (xn,yn) ( x n , y n ) 最终的权重 u(T+1)n u n ( T + 1 ) 和初始的 u(1)n u n ( 1 ) 的关系如下:

u(T+1)n=u(1)n?t=1Texp(?ynαtgt(xn))=1N?exp(?ynt=1Tαtgt(xn)) u n ( T + 1 ) = u n ( 1 ) ? ∏ t = 1 T e x p ( ? y n α t g t ( x n ) ) = 1 N ? e x p ( ? y n ∑ t = 1 T α t g t ( x n ) )

我们将 Tt=1αtgt(x) ∑ t = 1 T α t g t ( x ) 称为 voting score voting score 。因为最后我们需要根据这个分数加一个 sign s i g n 的操作来做分类的决定,即我们最终得到的模型是: G(x)=sign(Tt=1αtgt(x)) G ( x ) = s i g n ( ∑ t = 1 T α t g t ( x ) ) 。从上面的式子可以看出 AdaBoost AdaBoost 中的每一个数据点的权重 u(T+1)n u n ( T + 1 ) 正比于负 yn y n voting score voting score 的乘积的 exponential exponential

我们知道 AdaBoost AdaBoost linear blending linear blending 的延伸, 也就是要将 g g 线性的融合在一起。在 linear blending 中我们可以将整个过程分为两步:1. 将所有的 g g 当做是一个特征转换;2. 将特征转换之后的结果使用一个线性的模型融合起来。

l i n e a r   b l e n d i n g = l i n e a r   m o d e l + h y p o t h e s i s   a s   t r a n s f o r m

G(xn)=sign(t=1Tαt????wtgt(xn)?????????t(xn)) G ( x n ) = s i g n ( ∑ t = 1 T α t ? w t g t ( x n ) ? ? t ( x n ) )

因为 gt(xn) g t ( x n ) 可以视为特征转换,我们将其记为 ?t(xn) ? t ( x n ) ,将每一个 gt(xn) g t ( x n ) 的权重记为 wt w t 。这时, voting score v o t i n g s c o r e 就变成了 wTΦ(xn) w T Φ ( x n ) 。这样我们就得到了一个我们比较熟悉的形式, 因为在硬间隔的 SVM SVM 中: margin=yn?(wT?(xn)+b)||w|| m a r g i n = y n ? ( w T ? ( x n ) + b ) | | w | | , 表示这个数据点距离边界有多远。所以在这里 voting score v o t i n g s c o r e (虽然和上面的相比少了一些项)也是某一种距离, 也是某一种 margin m a r g i n , 也是在某一个空间中这个点到分割线的距离的一种衡量。

所以 yn?(voting score) y n ? ( v o t i n g s c o r e ) 就相当于在 SVM S V M 中的没有归一化的 margin m a r g i n ,也可以说是函数间隔。结合我们对 SVM SVM 的认识,我们希望 yn?(voting score) y n ? ( v o t i n g s c o r e ) 越大越好,即首先这个值要是个正的,正值保证了划分的正确性;其次要尽量的大,这样就能有更大的置信区间或者说更大的 margin margin 。所以我们就会希望 exp(?yn(voting score)) e x p ( ? y n ( v o t i n g s c o r e ) ) 越小越好。也就是每一个数据点的权重 u(T+1)n u n ( T + 1 ) 要越小越好。

通过上面的分析我们知道 AdaBoost A d a B o o s t 想要达到 large margin l a r g e m a r g i n 的效果,就是要努力的使所有的 yn?(voting score) y n ? ( v o t i n g s c o r e ) 变大,就是要使所有的 exp(?yn(voting score)) e x p ( ? y n ( v o t i n g s c o r e ) ) 变小就是要最小化 Nn=1u(T+1)n ∑ n = 1 N u n ( T + 1 ) , 现在可以将 adaboost adaboost 的损失函数定义为:

L=n=1Nu(T+1)n=1Nn=1Nexp(?ynt=1Tαtgt(xn))(1) (1) L = ∑ n = 1 N u n ( T + 1 ) = 1 N ∑ n = 1 N e x p ( ? y n ∑ t = 1 T α t g t ( x n ) )

所以得到了 AdaBoost A d a B o o s t 的损失函数为指数损失函数。

2.2 - 又一个0/1误差的上界

画出 0/1 error 0/1 error AdaBoost error AdaBoost error 的曲线发现, exponential error e x p o n e n t i a l e r r o r (图中的曲线)是 0/1 error 0 / 1 e r r o r (图中的折线)的一个上限。我们之前就碰到过 0/1 error 0 / 1 e r r o r 的一些上限, SVM SVM hinge error(max(1?sy,0)) hinge error ( m a x ( 1 ? s y , 0 ) ) logistic regression logistic regression scale cross entropy(ln(1+exp(?ys))) scale cross entropy ( l n ( 1 + e x p ( ? y s ) ) ) 都是 0/1 error 0 / 1 e r r o r 的上限,我们之前都是利用这些上限将 0/1 error 0 / 1 e r r o r 做到最小,从而将分类问题做好。

现在我们从另一个角度看到 Adaboost A d a b o o s t 通过最小化 Nn=1u(T+1)n ∑ n = 1 N u n ( T + 1 ) 以使得得到的边界有 large margin l a r g e m a r g i n 的效果,所以 adaboost a d a b o o s t 算法在函数

n=1Nexp(?ynt=1Tαtgt(xn))(2) (2) ∑ n = 1 N e x p ( ? y n ∑ t = 1 T α t g t ( x n ) )

上做最小化,我们就将 (2) ( 2 ) 定义为 adaboost error measure a d a b o o s t e r r o r m e a s u r e 。最终通过最小化 errada? e r r a d a ^ err0/1 e r r 0 / 1 做到最好。

  • err0/1(s,y)=|[ys0]| e r r 0 / 1 ( s , y ) = | [ y s ≤ 0 ] |
  • errada?(s,y)=exp(?ys) e r r a d a ^ ( s , y ) = e x p ( ? y s )


这里写图片描述

AdaBoost A d a B o o s t 中既然我们想要所有的样本点的权重越小越好,也就是想要最后的权重的总和越小越好,也就是要在上式 (1) ( 1 ) 中做最小化。 AdaBoost A d a B o o s t 就是要做如下的一个最优化的问题:

minhEADA=1Nn=1Nexp(?ynt=1Tαtgt(xn)) m i n h E A D A = 1 N ∑ n = 1 N e x p ( ? y n ∑ t = 1 T α t g t ( x n ) )

解决上述最优化问题利用的工具是梯度下降法,梯度下降法的思路基本上是:当想要最小化一个函数的时候,可以看看从当前的点出发往哪个方向 v v 走一小步会使得结果变好。 通常的方法是在该点附近使用泰勒公式进行展开,之后通过分析可以得到能使得函数变小的最好的方向就是负梯度的方向。沿着这个方向走一个小小的步长 η , 这样就离我们的目标更近了一步。

泰勒展开

min||v||=1 Ein(wt+ηv)Ein(wt)+ηvTEin(wt)(3) (3) m i n | | v | | = 1 ? E i n ( w t + η v ) ≈ E i n ( w t ) + η v T ▽ E i n ( w t )

现在如果我们想要找一个函数 gt g t 当做方向,(向量和函数在本质上是一样的。当操作的对象是向量的时候,我们根据下标 index i n d e x 可以得到向量中的值;当操作的对象是函数的时候,我们根据输入 x x 可以得到函数的输出值,所以向量的 i n d e x 是整数,函数的 index i n d e x 是实数。这样看来,函数就是无限维度的向量)。 gradient descent g r a d i e n t d e s c e n t 中,我们想要找一个好的向量方向,沿着这个向量方向走一个步长 η η 来做最优化;在这里我们想要找一个好的函数 h(x) h ( x ) ,沿着这个函数走一个步长 η η 来做最优化。
当前的 adaboost a d a b o o s t 已经得到函数是 t?1τ=1ατgτ(xn) ∑ τ = 1 t ? 1 α τ g τ ( x n ) , 所以就是要在 t?1τ=1ατgτ(xn) ∑ τ = 1 t ? 1 α τ g τ ( x n ) 上加一个好的函数 h(xn) h ( x n ) (向量方向)和步长 η η 的乘积 ηh(xn) η h ( x n ) 来使得最终的结果变好一点。

minh Eada?=1Nn=1Nexp(?yn(τ=1t?1ατgτ(xn)+ηh(xn)))(4) (4) m i n h ? E a d a ^ = 1 N ∑ n = 1 N e x p ( ? y n ( ∑ τ = 1 t ? 1 α τ g τ ( x n ) + η h ( x n ) ) )

现在我们要想办法将 (4) ( 4 ) 变成 (3) ( 3 ) 的形式,

minhEada?=1Nn=1Nexp(?yn(τ=1t?1ατgτ(xn)+ηh(xn)))=1Nn=1Nexp((?yn)τ=1t?1ατgτ(xn))?exp(?ynηh(xn))=n=1Nu(t)nexp(?ynηh(xn))taylorn=1Nu(t)n(1?ynηh(xn))=n=1Nu(t)n?ηn=1Nu(t)nynh(xn) m i n h ? E a d a ^ = 1 N ∑ n = 1 N e x p ( ? y n ( ∑ τ = 1 t ? 1 α τ g τ ( x n ) + η h ( x n ) ) ) = 1 N ∑ n = 1 N e x p ( ( ? y n ) ∑ τ = 1 t ? 1 α τ g τ ( x n ) ) ? e x p ( ? y n η h ( x n ) ) = ∑ n = 1 N u n ( t ) e x p ( ? y n η h ( x n ) ) ≈ t a y l o r ∑ n = 1 N u n ( t ) ( 1 ? y n η h ( x n ) ) = ∑ n = 1 N u n ( t ) ? η ∑ n = 1 N u n ( t ) y n h ( x n )

泰勒展开式: exp(x)=1+x+x22!+x33!+?+xNN!+? e x p ( x ) = 1 + x + x 2 2 ! + x 3 3 ! + ? + x N N ! + ?

通过上面的操作得到了和在 gradient descient g r a d i e n t d e s c i e n t 中类似的形式,现在我们的目标是要找到一个好的 h h 来最小化 n = 1 N u n ( t ) ( ? y n h ( x n ) ) 。对于二分类问题来说:

===n=1Nu(t)n(?ynh(xn))n=1Nu(t)n{ ?1if yn=h(xn)1if ynh(xn)?n=1Nu(t)n+n=1Nu(t)n{ 0if yn=h(xn)2if ynh(xn)?n=1Nu(t)n+2Eu(t)in?N(1)(2)(3)(4) (1) ∑ n = 1 N u n ( t ) ( ? y n h ( x n ) ) (2) = ∑ n = 1 N u n ( t ) { ? 1 i f y n = h ( x n ) 1 i f y n ≠ h ( x n ) (3) = ? ∑ n = 1 N u n ( t ) + ∑ n = 1 N u n ( t ) { 0 i f y n = h ( x n ) 2 i f y n ≠ h ( x n ) (4) = ? ∑ n = 1 N u n ( t ) + 2 E i n u ( t ) ? N

我们的出发点是要找到一个好的 h(x) h ( x ) Nn=1u(t)n(?ynh(xn)) ∑ n = 1 N u n ( t ) ( ? y n h ( x n ) ) 变小,经过上面的推导发现想要让 Nn=1u(t)n(?ynh(xn)) ∑ n = 1 N u n ( t ) ( ? y n h ( x n ) ) 变小的就要让 Eu(t)in E i n u ( t ) 变小。能够使得 Eu(t)in E i n u ( t ) 变小的正是 adaboost a d a b o o s t 中的 base algorithm b a s e a l g o r i t h m 算法 A A 。所以 base algorithm b a s e a l g o r i t h m 找到了一个好的函数方向。我们原来认为 A A 找到的 gt g t 只是为了让 Eu(t)in E i n u ( t ) 变小, 现在经过这样的推导发现,这个 gt g t 是一个能够让 Eada? E a d a ^ 变小的函数方向。

adaboost a d a b o o s t 通过大概的最小化 Eada?=Nn=1u(t)nexp(?ynηh(xn)) E a d a ^ = ∑ n = 1 N u n ( t ) e x p ( ? y n η h ( x n ) ) 得到了一个好的函数(方向),按照 gradient descent g r a d i e n t d e s c e n t 的做法,现在要做的就是沿着这个方向走一小步。但是在这里我们不仅仅满足于只走一小步,而是想要走一大步。也就是说在 gt g t 被固定了之后,想要选择一个最大的 η η 来使得 Eada? E a d a ^ 最小:

minηEada?=n=1Nu(t)nexp(?ynηgt(xn))????????????????????????? m i n η ? E a d a ^ = ∑ n = 1 N u n ( t ) e x p ( ? y n η g t ( x n ) ) ? ?

那么怎么来得到这个最好的步长 η η 呢?

  • yn=gt(xn) y n = g t ( x n ) 的时候, ?=u(t)nexp(?η) ? = u n ( t ) e x p ( ? η )
  • yngt(xn) y n ≠ g t ( x n ) 的时候, ?=u(t)nexp(+η) ? = u n ( t ) e x p ( + η )

Eada?=(n=1Nu(t)n)?((1??)exp(?η)+?t exp(+η)) E a d a ^ = ( ∑ n = 1 N u n ( t ) ) ? ( ( 1 ? ? ) e x p ( ? η ) + ? t e x p ( + η ) )

η η 求导来得到最优解:
?Eada??η=0?ηt=ln1??t??????=αt ? E a d a ^ ? η = 0 ? η t = l n 1 ? ? t ? = α t

所以这样看来, adaboost a d a b o o s t 使用 base algorithm A b a s e a l g o r i t h m A 来得到一个最好的函数方向,当最好的函数方向 gt g t 得到之后, adaboost a d a b o o s t 给这个 gt g t 一个权重或者说是票数 αt α t 现在我们知道了这个由 adaboost a d a b o o s t 给出的权重 αt α t 是一个最佳问题的解。所以 adaboost a d a b o o s t 通过也可以称为 steepest descent with approximate functional gradient s t e e p e s t d e s c e n t w i t h a p p r o x i m a t e f u n c t i o n a l g r a d i e n t

3 - Gradient Boosting

上一小节对 adaboost adaboost 做了另一种解释, adaboost adaboost 的每一轮可以看做是在最小化 exponential error exponential error 在每一轮中首先找出一个 h h ,将这个 h 作为 gt g t ;然后再决定要沿着这个 gt g t 走多远的距离,这个距离会变成 gt g t 的权重 αt α t 。所以一共有两个最佳化的过程:一个是对 h h 的最佳化过程, 一个是对 η 的最佳化过程。

minηminh1Nn=1Nexp(?yn(τ=1t?1αtgτ(xn)+ηh(xn)))(1) (1) m i n η ? m i n h ? 1 N ∑ n = 1 N e x p ( ? y n ( ∑ τ = 1 t ? 1 α t g τ ( x n ) + η h ( x n ) ) )

这样的概念可以不可以用在不同的 error function error function 上呢?也就是说不再仅仅只是 (1) ( 1 ) 中的 exponential error exponential error 。例如如果我们想做的是 logistic regression l o g i s t i c r e g r e s s i o n 的话,我们关注的 error e r r o r cross entropy error c r o s s e n t r o p y e r r o r ,如果我们想做的是 regression r e g r e s s i o n 的话,我们关注的 error e r r o r squared error s q u a r e d e r r o r

3.1 - 前向分步算法优化加法模型

基于上述的讨论,将 1 ( 1 ) 式进行扩展,将 err e r r 换掉,不再局限于使用 exponential error e x p o n e n t i a l e r r o r ,而是可以使用任何我们感兴趣的 error function e r r o r f u n c t i o n

minηminh1Nn=1Nerr(τ=1t?1αtgτ(xn)+ηh(xn),yn)(1) (1) m i n η ? m i n h ? 1 N ∑ n = 1 N e r r ( ∑ τ = 1 t ? 1 α t g τ ( x n ) + η h ( x n ) , y n )

这是一个新的 aggregation a g g r e g a t i o n 的模型:从当前已经得到的模型 t?1τ=1αtgτ(xn) ∑ τ = 1 t ? 1 α t g τ ( x n ) 出发,沿着 h(xn) h ( x n ) 走步长 η η ,目的是为了让 err e r r 变小,所以同样的在每一轮都是做两件事:先决定一个好的方向 h h 作为 g t ,然后决定要沿着这个 gt g t 更新多远得到步长 η η 并作为权重 αt α t gt g t 融入到最中的 G G 中。所以这样的模型很像是 a d a b o o s t 只不过是对 adaboost a d a b o o s t 做了延伸,我们称之为 gradientBoost g r a d i e n t B o o s t ,由不同的 error funciton e r r o r f u n c i t o n 就可以解决不同的问题例如 regression r e g r e s s i o n 或者是 soft classification s o f t c l a s s i f i c a t i o n

3.2 - 提升树用于回归

当我们想要使用 boosting tree boosting tree regression r e g r e s s i o n 的时候应该怎么做呢?我们关心的是 squared error s q u a r e d e r r o r err(s,y)=(s?y)2 e r r ( s , y ) = ( s ? y ) 2

minηminh1Nn=1Nerr(τ=1t?1ατgτ(xn)??????????????sn+ηh(xn),yn) m i n η ? m i n h ? 1 N ∑ n = 1 N e r r ( ∑ τ = 1 t ? 1 α τ g τ ( x n ) ? s n + η h ( x n ) , y n )

我们将使用当前已经得到的模型 t?1τ=1ατgτ(xn) ∑ τ = 1 t ? 1 α τ g τ ( x n ) 对样本 xn x n 做出的预测结果记为 sn s n 我们的目的就是要从 sn s n 出发沿着某个 h(xn) h ( x n ) 更新某个步长 η η 来使得 err e r r 变小。 所以第一步我们首先找一个最好的 h(x) h ( x ) 作为 gt g t

minh1Nn=1Nerr(sn+ηh(xn),yn)tarlorminh1Nn=1Nerr(sn,yn)+1Nn=1Nηh(xn)?err(s,yn)?s|s=sn=minhconstants+ηNn=1Nh(xn)2(sn?yn)??????????????????????????????????????????? m i n h ? 1 N ∑ n = 1 N e r r ( s n + η h ( x n ) , y n ) ≈ t a r l o r m i n h ? 1 N ∑ n = 1 N e r r ( s n , y n ) + 1 N ∑ n = 1 N η h ( x n ) ? e r r ( s , y n ) ? s | s = s n = m i n h ? c o n s t a n t s + η N ∑ n = 1 N h ( x n ) 2 ( s n ? y n ) ? ?

我们现在是要找一个 h(xn) h ( x n ) 来使得 ? ? 最小, 那么易知当 h(xn)=??(sn?yn) h ( x n ) = ? ∞ ? ( s n ? y n ) 的时候,上式可以取得最小。因为首先 ?(sn?yn) ? ( s n ? y n ) 保证了结果是负数,再乘以一个 ,就是负的无穷大,这是最直观的该最小化问题的解。 但是因为在这里 h(xn) h ( x n ) 相当于一个方向, 所以应该对其长度进行一下限制,这样就可以避免出现 ? ? ∞ 。并且长度的问题最后交给步长 η η 来解决。
基于以上的讨论我们应该解决的问题是:

min||h||=1constants+ηNn=1Nh(xn)2(sn?yn) m i n | | h | | = 1 c o n s t a n t s + η N ∑ n = 1 N h ( x n ) 2 ( s n ? y n )

但是这样的话变成了需要求解一个有条件 ||h||=1 | | h | | = 1 的最佳化问题,因为我们并不在乎 h h 的大小,所以我们将其作为一个惩罚项放入目标函数中的,只是限制使得 h ( x ) 不要太大即可,新的问题变为:

minhconstants+ηNn=1N(2h(xn)(sn?yn)+h(xn)2)=constants+ηNn=1N(constant+(h(xn)?(yn?sn)??????????residual)2) m i n h c o n s t a n t s + η N ∑ n = 1 N ( 2 h ( x n ) ( s n ? y n ) + h ( x n ) 2 ) = c o n s t a n t s + η N ∑ n = 1 N ( c o n s t a n t + ( h ( x n ) ? ( y n ? s n ) ? r e s i d u a l ) 2 )

yn y n 是目标值, sn s n 是目前给出的预测值, 我们 yn?sn y n ? s n 定义为残差 residual r e s i d u a l 。为了达到最小化的目的,就是要找一个 h

  相关解决方案