🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 11 -- Gradient Boosted Decision Tree 上节课我们主要介绍了Random Forest算法模型。Random Forest就是通过bagging的方式将许多不同的decision tree组合起来。除此之外,在decision tree中加入了各种随机性和多样性,比如不同特征的线性组合等。RF还可以使用OOB样本进行self-validation,而且可以通过permutation test进行feature selection。本节课将使用Adaptive Boosting的方法来研究decision tree的一些算法和模型。 ### **Adaptive Boosted Decision Tree** Random Forest的算法流程我们上节课也详细介绍过,就是先通过bootstrapping“复制”原样本集D,得到新的样本集D’;然后对每个D’进行训练得到不同的decision tree和对应的![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg);最后再将所有的![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)通过uniform的形式组合起来,即以投票的方式得到G。这里采用的Bagging的方式,也就是把每个![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)的预测值直接相加。现在,如果将Bagging替换成AdaBoost,处理方式有些不同。首先每轮bootstrap得到的D’中每个样本会赋予不同的权重![](https://img.kancloud.cn/96/b1/96b1486081363aa9f8d6be8601bc1f04_24x18.jpg);然后在每个decision tree中,利用这些权重训练得到最好的![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg);最后得出每个![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)所占的权重,线性组合得到G。这种模型称为AdaBoost-D Tree。 ![这里写图片描述](https://img.kancloud.cn/dd/fa/ddfadfe881dfcaed819eaea8c7cbe829_560x206.jpg) 但是在AdaBoost-DTree中需要注意的一点是每个样本的权重![](https://img.kancloud.cn/96/b1/96b1486081363aa9f8d6be8601bc1f04_24x18.jpg)。我们知道,在Adaptive Boosting中进行了bootstrap操作,![](https://img.kancloud.cn/96/b1/96b1486081363aa9f8d6be8601bc1f04_24x18.jpg)表示D中每个样本在D’中出现的次数。但是在决策树模型中,例如C&RT算法中并没有引入![](https://img.kancloud.cn/96/b1/96b1486081363aa9f8d6be8601bc1f04_24x18.jpg)。那么,如何在决策树中引入这些权重![](https://img.kancloud.cn/96/b1/96b1486081363aa9f8d6be8601bc1f04_24x18.jpg)来得到不同的![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)而又不改变原来的决策树算法呢? 在Adaptive Boosting中,我们使用了weighted algorithm,形如: ![](https://img.kancloud.cn/89/f2/89f214a480805c9fb3a0fceb4abbbf2f_266x54.jpg) 每个犯错误的样本点乘以相应的权重,求和再平均,最终得到了![](https://img.kancloud.cn/04/73/04735e728c53df57f112d62bf2fd02b9_49x19.jpg)。如果在决策树中使用这种方法,将当前分支下犯错误的点赋予权重,每层分支都这样做,会比较复杂,不易求解。为了简化运算,保持决策树算法本身的稳定性和封闭性,我们可以把决策树算法当成一个黑盒子,即不改变其结构,不对算法本身进行修改,而从数据来源D’上做一些处理。按照这种思想,我们来看权重u实际上表示该样本在bootstrap中出现的次数,反映了它出现的概率。那么可以根据u值,对原样本集D进行一次重新的随机sampling,也就是带权重的随机抽样。sampling之后,会得到一个新的D’,D’中每个样本出现的几率与它权重u所占的比例应该是差不多接近的。因此,使用带权重的sampling操作,得到了新的样本数据集D’,可以直接代入决策树进行训练,从而无需改变决策树算法结构。sampling可看成是bootstrap的反操作,这种对数据本身进行修改而不更改算法结构的方法非常重要! ![这里写图片描述](https://img.kancloud.cn/df/57/df57bbee4d969ffe826cdfd5c2208337_561x149.jpg) 所以,AdaBoost-DTree结合了AdaBoost和DTree,但是做了一点小小的改变,就是使用sampling替代权重![](https://img.kancloud.cn/96/b1/96b1486081363aa9f8d6be8601bc1f04_24x18.jpg),效果是相同的。 ![这里写图片描述](https://img.kancloud.cn/be/c9/bec95006c48731d52738c61a2edce9cc_389x77.jpg) 上面我们通过使用sampling,将不同的样本集代入决策树中,得到不同的![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)。除此之外,我们还要确定每个![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)所占的权重![](https://img.kancloud.cn/61/cd/61cd484a3def0840e0d3a201a1b9ae83_16x11.jpg)。之前我们在AdaBoost中已经介绍过,首先算出每个![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)的错误率![](https://img.kancloud.cn/77/39/7739dfd2d81d7bafb881b2b1a88a02de_12x11.jpg),然后计算权重: ![](https://img.kancloud.cn/0e/cc/0ecc8c92250b7c043b1b081f9fabff11_185x45.jpg) 如果现在有一棵完全长成的树(fully grown tree),由所有的样本![](https://img.kancloud.cn/1d/eb/1debcab2fe3793b26ea9e43c365edf29_18x11.jpg)训练得到。若每个样本都不相同的话,一刀刀切割分支,直到所有的![](https://img.kancloud.cn/1d/eb/1debcab2fe3793b26ea9e43c365edf29_18x11.jpg)都被完全分开。这时候,![](https://img.kancloud.cn/e3/f4/e3f4800b6f363dfc7cc30376e111c28e_87x18.jpg),加权的![](https://img.kancloud.cn/87/78/877870c55ccf0905a0a12c35d5f0ffc1_87x19.jpg)而且![](https://img.kancloud.cn/77/39/7739dfd2d81d7bafb881b2b1a88a02de_12x11.jpg)也为0,从而得到权重![](https://img.kancloud.cn/6c/1b/6c1b9454de1850aaccbac131608feb80_59x12.jpg)。![](https://img.kancloud.cn/6c/1b/6c1b9454de1850aaccbac131608feb80_59x12.jpg)表示该![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)所占的权重无限大,相当于它一个就决定了G结构,是一种autocracy,而其它的![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)对G没有影响。 ![这里写图片描述](https://img.kancloud.cn/81/41/8141c2d879d3db7e37b3ef10dde1c2ef_581x122.jpg) 显然![](https://img.kancloud.cn/6c/1b/6c1b9454de1850aaccbac131608feb80_59x12.jpg)不是我们想看到的,因为autocracy总是不好的,我们希望使用aggregation将不同的![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)结合起来,发挥集体智慧来得到最好的模型G。首先,我们来看一下什么原因造成了![](https://img.kancloud.cn/6c/1b/6c1b9454de1850aaccbac131608feb80_59x12.jpg)。有两个原因:一个是使用了所有的样本![](https://img.kancloud.cn/1d/eb/1debcab2fe3793b26ea9e43c365edf29_18x11.jpg)进行训练;一个是树的分支过多,fully grown。针对这两个原因,我们可以对树做一些修剪(pruned),比如只使用一部分样本,这在sampling的操作中已经起到这类作用,因为必然有些样本没有被采样到。除此之外,我们还可以限制树的高度,让分支不要那么多,从而避免树fully grown。 ![这里写图片描述](https://img.kancloud.cn/fc/14/fc14659379bf7bf58cf48db892f3a799_580x87.jpg) 因此,AdaBoost-DTree使用的是pruned DTree,也就是说将这些预测效果较弱的树结合起来,得到最好的G,避免出现autocracy。 ![这里写图片描述](https://img.kancloud.cn/c0/39/c039eb4b6f3abbaf7efa74174e8fd80d_390x55.jpg) 刚才我们说了可以限制树的高度,那索性将树的高度限制到最低,即只有1层高的时候,有什么特性呢?当树高为1的时候,整棵树只有两个分支,切割一次即可。如果impurity是binary classification error的话,那么此时的AdaBoost-DTree就跟AdaBoost-Stump没什么两样。也就是说AdaBoost-Stump是AdaBoost-DTree的一种特殊情况。 ![这里写图片描述](https://img.kancloud.cn/29/63/2963fce37b0fa0dfebef08c1e517b0b9_580x196.jpg) 值得一提是,如果树高为1时,通常较难遇到![](https://img.kancloud.cn/e3/5a/e35ae6553ddaeb0b2919d82e1dba19e0_46x15.jpg)的情况,且一般不采用sampling的操作,而是直接将权重u代入到算法中。这是因为此时的AdaBoost-DTree就相当于是AdaBoost-Stump,而AdaBoost-Stump就是直接使用u来优化模型的。 ### **Optimization View of AdaBoost** 接下来,我们继续将继续探讨AdaBoost算法的一些奥妙之处。我们知道AdaBoost中的权重的迭代计算如下所示: ![这里写图片描述](https://img.kancloud.cn/af/4f/af4f7cff87d9d6ffe34fb1d61c2aa2bd_580x104.jpg) 之前对于incorrect样本和correct样本,![](https://img.kancloud.cn/f2/bc/f2bc989a6a549814ab1c11cb4d2c1ac5_40x23.jpg)的表达式不同。现在,把两种情况结合起来,将![](https://img.kancloud.cn/f2/bc/f2bc989a6a549814ab1c11cb4d2c1ac5_40x23.jpg)写成一种简化的形式: ![](https://img.kancloud.cn/6f/a7/6fa7f63b85ce7e752be82722b55cb149_374x25.jpg) 其中,对于incorrect样本,![](https://img.kancloud.cn/4b/2a/4b2a7545a72b16b2efd0e035393f19e3_97x18.jpg),对于correct样本,![](https://img.kancloud.cn/a9/47/a9475fd78aabc271791da4b2dce76584_97x18.jpg)。从上式可以看出,![](https://img.kancloud.cn/f2/bc/f2bc989a6a549814ab1c11cb4d2c1ac5_40x23.jpg)由![](https://img.kancloud.cn/ad/bb/adbb864976abca7b7c2007dba232a6c9_24x23.jpg)与某个常数相乘得到。所以,最后一轮更新的![](https://img.kancloud.cn/1d/75/1d7548066e5a8dfbf0516d289453845a_45x23.jpg)可以写成![](https://img.kancloud.cn/02/0e/020e3eaac7a4bbc14732aab41ade4c8e_25x23.jpg)的级联形式,我们之前令![](https://img.kancloud.cn/41/f0/41f03381d3f2ecd78684d997995cf160_71x37.jpg),则有如下推导: ![](https://img.kancloud.cn/59/43/5943e908050d6743dbe4fe84757cd090_500x54.jpg) 上式中![](https://img.kancloud.cn/32/ad/32ada55f311f4ef7d5f84799cbcb95d1_91x54.jpg)被称为voting score,最终的模型![](https://img.kancloud.cn/5d/8f/5d8f73bdb78cd14f074debd4ab60acb6_179x54.jpg)。可以看出,在AdaBoost中,![](https://img.kancloud.cn/1d/75/1d7548066e5a8dfbf0516d289453845a_45x23.jpg)与![](https://img.kancloud.cn/d8/a5/d8a5c10f319d548774877f80227ae6d9_234x18.jpg)成正比。 ![这里写图片描述](https://img.kancloud.cn/43/47/4347874c1c52a48b9efe7f8f2a7a140b_580x277.jpg) 接下来我们继续看一下voting score中蕴含了哪些内容。如下图所示,voting score由许多![](https://img.kancloud.cn/fd/dc/fddc1fe62e2f741c1a410522d70f45a9_46x18.jpg)乘以各自的系数![](https://img.kancloud.cn/61/cd/61cd484a3def0840e0d3a201a1b9ae83_16x11.jpg)线性组合而成。从另外一个角度来看,我们可以把![](https://img.kancloud.cn/fd/dc/fddc1fe62e2f741c1a410522d70f45a9_46x18.jpg)看成是对![](https://img.kancloud.cn/1d/eb/1debcab2fe3793b26ea9e43c365edf29_18x11.jpg)的特征转换![](https://img.kancloud.cn/4a/50/4a5061953958210449e6e589aca1dcfa_48x18.jpg),![](https://img.kancloud.cn/61/cd/61cd484a3def0840e0d3a201a1b9ae83_16x11.jpg)就是线性模型中的权重![](https://img.kancloud.cn/49/4f/494f262c0ded99d8ddd368cee8ff26d6_17x11.jpg)。看到这里,我们回忆起之前SVM中,w与![](https://img.kancloud.cn/d6/f7/d6f7494c7fac45ea04c2bdbf85ab546d_43x18.jpg)的乘积再除以w的长度就是margin,即点到边界的距离。另外,乘积项再与![](https://img.kancloud.cn/23/f1/23f1fdeb27de71b5e6113986f1b2bfa6_17x12.jpg)相乘,表示点的位置是在正确的那一侧还是错误的那一侧。所以,回过头来,这里的voting score实际上可以看成是没有正规化(没有除以w的长度)的距离,即可以看成是该点到分类边界距离的一种衡量。从效果上说,距离越大越好,也就是说voting score要尽可能大一些。 ![这里写图片描述](https://img.kancloud.cn/46/06/4606033a6f76a92b2992c52f9272ce22_580x198.jpg) 我们再来看,若voting score与![](https://img.kancloud.cn/23/f1/23f1fdeb27de71b5e6113986f1b2bfa6_17x12.jpg)相乘,则表示一个有对错之分的距离。也就是说,如果二者相乘是负数,则表示该点在错误的一边,分类错误;如果二者相乘是正数,则表示该点在正确的一边,分类正确。所以,我们算法的目的就是让![](https://img.kancloud.cn/23/f1/23f1fdeb27de71b5e6113986f1b2bfa6_17x12.jpg)与voting score的乘积是正的,而且越大越好。那么在刚刚推导的![](https://img.kancloud.cn/1d/75/1d7548066e5a8dfbf0516d289453845a_45x23.jpg)中,得到![](https://img.kancloud.cn/2d/de/2ddeca3da9d92a18a782ebec2438313e_184x18.jpg)越小越好,从而得到![](https://img.kancloud.cn/1d/75/1d7548066e5a8dfbf0516d289453845a_45x23.jpg)越小越好。也就是说,如果voting score表现不错,与![](https://img.kancloud.cn/23/f1/23f1fdeb27de71b5e6113986f1b2bfa6_17x12.jpg)的乘积越大的话,那么相应的![](https://img.kancloud.cn/1d/75/1d7548066e5a8dfbf0516d289453845a_45x23.jpg)应该是最小的。 ![这里写图片描述](https://img.kancloud.cn/29/fc/29fcb797bd4de34f2a5f8d94212807ff_579x123.jpg) 那么在AdaBoost中,随着每轮学习的进行,每个样本的![](https://img.kancloud.cn/ad/bb/adbb864976abca7b7c2007dba232a6c9_24x23.jpg)是逐渐减小的,直到![](https://img.kancloud.cn/1d/75/1d7548066e5a8dfbf0516d289453845a_45x23.jpg)最小。以上是从单个样本点来看的。总体来看,所有样本的![](https://img.kancloud.cn/1d/75/1d7548066e5a8dfbf0516d289453845a_45x23.jpg)之和应该也是最小的。我们的目标就是在最后一轮(T+1)学习后,让所有样本的![](https://img.kancloud.cn/1d/75/1d7548066e5a8dfbf0516d289453845a_45x23.jpg)之和尽可能地小。![](https://img.kancloud.cn/1d/75/1d7548066e5a8dfbf0516d289453845a_45x23.jpg)之和表示为如下形式: ![这里写图片描述](https://img.kancloud.cn/5d/da/5dda8024f1594ca45f9915e3f63510e2_579x113.jpg) 上式中,![](https://img.kancloud.cn/32/ad/32ada55f311f4ef7d5f84799cbcb95d1_91x54.jpg)被称为linear score,用s表示。对于0/1 error:若ys<0,则![](https://img.kancloud.cn/e7/02/e702cd1077901c02dc6e66e1bc43c3d5_77x18.jpg);若ys>=0,则![](https://img.kancloud.cn/04/63/04633e410c2cba66b9eeb8491d8b0721_78x18.jpg)。如下图右边黑色折线所示。对于上式中提到的指数error,即![](https://img.kancloud.cn/04/31/043161561a94f97651f8ef8192338d47_192x18.jpg),随着ys的增加,error单调下降,且始终落在0/1 error折线的上面。如下图右边蓝色曲线所示。很明显,![](https://img.kancloud.cn/11/44/1144dfd5b347006d7cd4641dadb91ff2_95x18.jpg)可以看成是0/1 error的上界。所以,我们可以使用![](https://img.kancloud.cn/11/44/1144dfd5b347006d7cd4641dadb91ff2_95x18.jpg)来替代0/1 error,能达到同样的效果。从这点来说,![](https://img.kancloud.cn/a2/fc/a2fc3221e8963ed30ece4be8a33a8f41_73x54.jpg)可以看成是一种error measure,而我们的目标就是让其最小化,求出最小值时对应的各个![](https://img.kancloud.cn/61/cd/61cd484a3def0840e0d3a201a1b9ae83_16x11.jpg)和![](https://img.kancloud.cn/fd/dc/fddc1fe62e2f741c1a410522d70f45a9_46x18.jpg)。 ![这里写图片描述](https://img.kancloud.cn/cf/26/cf26aa91471dbe69f19df55ab669896b_584x245.jpg) 下面我们来研究如何让![](https://img.kancloud.cn/a2/fc/a2fc3221e8963ed30ece4be8a33a8f41_73x54.jpg)取得最小值,思考是否能用梯度下降(gradient descent)的方法来进行求解。我们之前介绍过gradient descent的核心是在某点处做一阶泰勒展开: ![这里写图片描述](https://img.kancloud.cn/54/ca/54ca233fda7f9611ad49a621b1789505_580x84.jpg) 其中,![](https://img.kancloud.cn/66/37/663765e925c509b920eb6bce47a0fa24_18x11.jpg)是泰勒展开的位置,v是所要求的下降的最好方向,它是梯度![](https://img.kancloud.cn/16/61/16615697e7323ee439d71d6327df1c89_73x18.jpg)的反方向,而![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)是每次前进的步长。则每次沿着当前梯度的反方向走一小步,就会不断逼近谷底(最小值)。这就是梯度下降算法所做的事情。 现在,我们对![](https://img.kancloud.cn/c4/ad/c4adf360d3f73f863dadd8b2f7ac8c07_44x19.jpg)做梯度下降算法处理,区别是这里的方向是一个函数![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg),而不是一个向量![](https://img.kancloud.cn/66/37/663765e925c509b920eb6bce47a0fa24_18x11.jpg)。其实,函数和向量的唯一区别就是一个下标是连续的,另一个下标是离散的,二者在梯度下降算法应用上并没有大的区别。因此,按照梯度下降算法的展开式,做出如下推导: ![这里写图片描述](https://img.kancloud.cn/38/c3/38c3debbd100a0ec90ed6449c689c9c2_581x222.jpg) 上式中,![](https://img.kancloud.cn/52/37/5237cc8b14bcc25d13b54be9732c27e2_41x18.jpg)表示当前的方向,它是一个矩,![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)是沿着当前方向前进的步长。我们要求出这样的![](https://img.kancloud.cn/52/37/5237cc8b14bcc25d13b54be9732c27e2_41x18.jpg)和![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg),使得![](https://img.kancloud.cn/c4/ad/c4adf360d3f73f863dadd8b2f7ac8c07_44x19.jpg)是在不断减小的。当![](https://img.kancloud.cn/c4/ad/c4adf360d3f73f863dadd8b2f7ac8c07_44x19.jpg)取得最小值的时候,那么所有的方向即最佳的![](https://img.kancloud.cn/52/37/5237cc8b14bcc25d13b54be9732c27e2_41x18.jpg)和![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)就都解出来了。上述推导使用了在![](https://img.kancloud.cn/e0/31/e0314ba7c7f9a6438652d768620b10c6_116x18.jpg)处的一阶泰勒展开近似。这样经过推导之后,![](https://img.kancloud.cn/c4/ad/c4adf360d3f73f863dadd8b2f7ac8c07_44x19.jpg)被分解为两个部分,一个是前N个u之和![](https://img.kancloud.cn/5c/35/5c35c50e3c73d3aafe97ff22ff17ebbe_53x54.jpg),也就是当前所有的![](https://img.kancloud.cn/1a/7b/1a7b854be0e1a2c00757595948b96a68_25x15.jpg)之和;另外一个是包含下一步前进的方向![](https://img.kancloud.cn/52/37/5237cc8b14bcc25d13b54be9732c27e2_41x18.jpg)和步进长度![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)的项![](https://img.kancloud.cn/96/d3/96d3e15af13d3173083fb8765f619546_140x54.jpg)。![](https://img.kancloud.cn/c4/ad/c4adf360d3f73f863dadd8b2f7ac8c07_44x19.jpg)的这种形式与gradient descent的形式基本是一致的。 那么接下来,如果要最小化![](https://img.kancloud.cn/c4/ad/c4adf360d3f73f863dadd8b2f7ac8c07_44x19.jpg)的话,就要让第二项![](https://img.kancloud.cn/96/d3/96d3e15af13d3173083fb8765f619546_140x54.jpg)越小越好。则我们的目标就是找到一个好的![](https://img.kancloud.cn/52/37/5237cc8b14bcc25d13b54be9732c27e2_41x18.jpg)(即好的方向)来最小化![](https://img.kancloud.cn/3c/c4/3cc4a60fa154bd94ed988afbfe4501b9_142x54.jpg),此时先忽略步进长度![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)。 ![这里写图片描述](https://img.kancloud.cn/39/d0/39d0f3c530689f1e1289f91f0d31a3b9_578x39.jpg) 对于binary classification,![](https://img.kancloud.cn/23/f1/23f1fdeb27de71b5e6113986f1b2bfa6_17x12.jpg)和![](https://img.kancloud.cn/52/37/5237cc8b14bcc25d13b54be9732c27e2_41x18.jpg)均限定取值-1或+1两种。我们对![](https://img.kancloud.cn/3c/c4/3cc4a60fa154bd94ed988afbfe4501b9_142x54.jpg)做一些推导和平移运算: ![这里写图片描述](https://img.kancloud.cn/46/36/46368e9a2075d287af2e3ecbd2b39fb1_580x276.jpg) 最终![](https://img.kancloud.cn/3c/c4/3cc4a60fa154bd94ed988afbfe4501b9_142x54.jpg)化简为两项组成,一项是![](https://img.kancloud.cn/16/bc/16bc1164d80fb19b45a7b3fc0c081b09_70x54.jpg);另一项是![](https://img.kancloud.cn/fb/20/fb203e05885655252832f3512afa6503_100x25.jpg)。则最小化![](https://img.kancloud.cn/3c/c4/3cc4a60fa154bd94ed988afbfe4501b9_142x54.jpg)就转化为最小化![](https://img.kancloud.cn/a3/78/a3780c5f74844847a9acf6ed7217e4ab_60x25.jpg)。要让![](https://img.kancloud.cn/a3/78/a3780c5f74844847a9acf6ed7217e4ab_60x25.jpg)最小化,正是由AdaBoost中的base algorithm所做的事情。所以说,AdaBoost中的base algorithm正好帮我们找到了梯度下降中下一步最好的函数方向。 ![这里写图片描述](https://img.kancloud.cn/e4/44/e444a06c77f432b0804715bafc119a2c_387x30.jpg) 以上就是从数学上,从gradient descent角度验证了AdaBoost中使用base algorithm得到的![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)就是让![](https://img.kancloud.cn/c4/ad/c4adf360d3f73f863dadd8b2f7ac8c07_44x19.jpg)减小的方向,只不过这个方向是一个函数而不是向量。 在解决了方向问题后,我们需要考虑步进长度![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)如何选取。方法是在确定方向![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)后,选取合适的![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg),使![](https://img.kancloud.cn/c4/ad/c4adf360d3f73f863dadd8b2f7ac8c07_44x19.jpg)取得最小值。也就是说,把![](https://img.kancloud.cn/c4/ad/c4adf360d3f73f863dadd8b2f7ac8c07_44x19.jpg)看成是步进长度![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)的函数,目标是找到![](https://img.kancloud.cn/c4/ad/c4adf360d3f73f863dadd8b2f7ac8c07_44x19.jpg)最小化时对应的![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)值。 ![这里写图片描述](https://img.kancloud.cn/ff/bd/ffbdea3374e5a91d9ca78ed761cd8549_580x112.jpg) 目的是找到在最佳方向上的最大步进长度,也就是steepest decent。我们先把![](https://img.kancloud.cn/c4/ad/c4adf360d3f73f863dadd8b2f7ac8c07_44x19.jpg)表达式写下来: ![](https://img.kancloud.cn/75/9a/759a8d525a298add8fa03e5b5e67ce6d_252x54.jpg) 上式中,有两种情况需要考虑: * **![](https://img.kancloud.cn/a1/8e/a18ee9f7e0160b8891627f17b12db95d_87x18.jpg):![](https://img.kancloud.cn/9f/2d/9f2d13f149fb835966b4efd1b13c43e7_90x23.jpg) correct** * **![](https://img.kancloud.cn/0b/4d/0b4da1f185aaf06d7ee806d6594d4541_87x18.jpg):![](https://img.kancloud.cn/bd/a9/bda9fc97de291c24dadf0e09af7d951c_90x23.jpg) incorrect** 经过推导,可得: ![](https://img.kancloud.cn/ad/9e/ad9e263497a5e1bb6d22decda2c2a49b_392x54.jpg) ![这里写图片描述](https://img.kancloud.cn/e5/b7/e5b7f280791fb951a927c4ae2364e63d_581x176.jpg) 然后对![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)求导,令![](https://img.kancloud.cn/b7/af/b7afe85300f2d8650d0e5e1019c00064_90x45.jpg),得: ![](https://img.kancloud.cn/ea/8d/ea8d6d301d39f974e14ebc8b9b71dc91_161x45.jpg) 由此看出,最大的步进长度就是![](https://img.kancloud.cn/61/cd/61cd484a3def0840e0d3a201a1b9ae83_16x11.jpg),即AdaBoost中计算![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)所占的权重。所以,AdaBoost算法所做的其实是在gradient descent上找到下降最快的方向和最大的步进长度。这里的方向就是![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg),它是一个函数,而步进长度就是![](https://img.kancloud.cn/61/cd/61cd484a3def0840e0d3a201a1b9ae83_16x11.jpg)。也就是说,在AdaBoost中确定![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)和![](https://img.kancloud.cn/61/cd/61cd484a3def0840e0d3a201a1b9ae83_16x11.jpg)的过程就相当于在gradient descent上寻找最快的下降方向和最大的步进长度。 ### **Gradient Boosting** 前面我们从gradient descent的角度来重新介绍了AdaBoost的最优化求解方法。整个过程可以概括为: ![这里写图片描述](https://img.kancloud.cn/b9/19/b9192aa1d4e870330e5875458727743b_580x145.jpg) 以上是针对binary classification问题。如果往更一般的情况进行推广,对于不同的error function,比如logistic error function或者regression中的squared error function,那么这种做法是否仍然有效呢?这种情况下的GradientBoost可以写成如下形式: ![这里写图片描述](https://img.kancloud.cn/53/65/536589dab9492eb64eb0e09f408971cd_580x146.jpg) 仍然按照gradient descent的思想,上式中,![](https://img.kancloud.cn/52/37/5237cc8b14bcc25d13b54be9732c27e2_41x18.jpg)是下一步前进的方向,![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)是步进长度。此时的error function不是前面所讲的exp了,而是任意的一种error function。因此,对应的hypothesis也不再是binary classification,最常用的是实数输出的hypothesis,例如regression。最终的目标也是求解最佳的前进方向![](https://img.kancloud.cn/52/37/5237cc8b14bcc25d13b54be9732c27e2_41x18.jpg)和最快的步进长度![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)。 ![这里写图片描述](https://img.kancloud.cn/8a/14/8a149fcd3f0dcab3ccdb2fd8231e7aa7_390x55.jpg) 接下来,我们就来看看如何求解regression的GradientBoost问题。它的表达式如下所示: ![这里写图片描述](https://img.kancloud.cn/61/35/6135280adf7df096651bbb986adc3cc0_580x111.jpg) 利用梯度下降的思想,我们把上式进行一阶泰勒展开,写成梯度的形式: ![这里写图片描述](https://img.kancloud.cn/91/5e/915e2c1713c1a6c3437d1ba30196a211_580x152.jpg) 上式中,由于regression的error function是squared的,所以,对s的导数就是![](https://img.kancloud.cn/6c/52/6c522df0f3b2af3f9c59b85bc7d12e6e_79x18.jpg)。其中标注灰色的部分表示常数,对最小化求解并没有影响,所以可以忽略。很明显,要使上式最小化,只要令![](https://img.kancloud.cn/52/37/5237cc8b14bcc25d13b54be9732c27e2_41x18.jpg)是梯度![](https://img.kancloud.cn/6c/52/6c522df0f3b2af3f9c59b85bc7d12e6e_79x18.jpg)的反方向就行了,即![](https://img.kancloud.cn/4f/03/4f03feaec1f0b036d4fe5fad03a2275e_159x18.jpg)。但是直接这样赋值,并没有对![](https://img.kancloud.cn/52/37/5237cc8b14bcc25d13b54be9732c27e2_41x18.jpg)的大小进行限制,一般不直接利用这个关系求出![](https://img.kancloud.cn/52/37/5237cc8b14bcc25d13b54be9732c27e2_41x18.jpg)。 ![这里写图片描述](https://img.kancloud.cn/ef/8d/ef8dd4745f7dc701ca3951aa9a6c3efe_580x49.jpg) 实际上![](https://img.kancloud.cn/52/37/5237cc8b14bcc25d13b54be9732c27e2_41x18.jpg)的大小并不重要,因为有步进长度![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)。那么,我们上面的最小化问题中需要对![](https://img.kancloud.cn/52/37/5237cc8b14bcc25d13b54be9732c27e2_41x18.jpg)的大小做些限制。限制![](https://img.kancloud.cn/52/37/5237cc8b14bcc25d13b54be9732c27e2_41x18.jpg)的一种简单做法是把![](https://img.kancloud.cn/52/37/5237cc8b14bcc25d13b54be9732c27e2_41x18.jpg)的大小当成一个惩罚项(![](https://img.kancloud.cn/06/f6/06f602e24bd11f8d70f9336ba37c338c_48x20.jpg))添加到上面的最小化问题中,这种做法与regularization类似。如下图所示,经过推导和整理,忽略常数项,我们得到最关心的式子是: ![](https://img.kancloud.cn/66/d3/66d31f2711ea28d69f2c32a3f1325b73_238x54.jpg) 上式是一个完全平方项之和,![](https://img.kancloud.cn/3a/3a/3a3a2ed5b3fc34cb5a363890c0f15085_56x12.jpg)表示当前第n个样本真实值和预测值的差,称之为余数。余数表示当前预测能够做到的效果与真实值的差值是多少。那么,如果我们想要让上式最小化,求出对应的![](https://img.kancloud.cn/52/37/5237cc8b14bcc25d13b54be9732c27e2_41x18.jpg)的话,只要让![](https://img.kancloud.cn/52/37/5237cc8b14bcc25d13b54be9732c27e2_41x18.jpg)尽可能地接近余数![](https://img.kancloud.cn/3a/3a/3a3a2ed5b3fc34cb5a363890c0f15085_56x12.jpg)即可。在平方误差上尽可能接近其实很简单,就是使用regression的方法,对所有N个点![](https://img.kancloud.cn/13/bb/13bb270e90d4438874604745d28cbdd9_96x18.jpg)做squared-error的regression,得到的回归方程就是我们要求的![](https://img.kancloud.cn/fd/dc/fddc1fe62e2f741c1a410522d70f45a9_46x18.jpg)。 ![这里写图片描述](https://img.kancloud.cn/44/d3/44d3a66207103ff4e66358d0c5b195b1_580x253.jpg) 以上就是使用GradientBoost的思想来解决regression问题的方法,其中应用了一个非常重要的概念,就是余数![](https://img.kancloud.cn/3a/3a/3a3a2ed5b3fc34cb5a363890c0f15085_56x12.jpg)。根据这些余数做regression,得到好的矩![](https://img.kancloud.cn/fd/dc/fddc1fe62e2f741c1a410522d70f45a9_46x18.jpg),方向函数![](https://img.kancloud.cn/fd/dc/fddc1fe62e2f741c1a410522d70f45a9_46x18.jpg)也就是由余数决定的。 ![这里写图片描述](https://img.kancloud.cn/54/b8/54b8f4d17471a93c620dc5cc2dcef41d_390x55.jpg) 在求出最好的方向函数![](https://img.kancloud.cn/fd/dc/fddc1fe62e2f741c1a410522d70f45a9_46x18.jpg)之后,就要来求相应的步进长度![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)。表达式如下: ![这里写图片描述](https://img.kancloud.cn/4e/1d/4e1d8af9c0f0643ee8ddd5d6e927e4eb_580x137.jpg) 同样,对上式进行推导和化简,得到如下表达式: ![这里写图片描述](https://img.kancloud.cn/bb/5a/bb5aeb91c9b1106f58da9fd7e0a11bcf_580x131.jpg) 上式中也包含了余数![](https://img.kancloud.cn/3a/3a/3a3a2ed5b3fc34cb5a363890c0f15085_56x12.jpg),其中![](https://img.kancloud.cn/fd/dc/fddc1fe62e2f741c1a410522d70f45a9_46x18.jpg)可以看成是![](https://img.kancloud.cn/1d/eb/1debcab2fe3793b26ea9e43c365edf29_18x11.jpg)的特征转换,是已知量。那么,如果我们想要让上式最小化,求出对应的![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)的话,只要让![](https://img.kancloud.cn/3c/70/3c70b47c1cecbf0d22aca0d9c853360a_55x18.jpg)尽可能地接近余数![](https://img.kancloud.cn/3a/3a/3a3a2ed5b3fc34cb5a363890c0f15085_56x12.jpg)即可。显然,这也是一个regression问题,而且是一个很简单的形如y=ax的线性回归,只有一个未知数![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)。只要对所有N个点![](https://img.kancloud.cn/75/59/755922c6b383f29532deede77721383b_133x18.jpg)做squared-error的linear regression,利用梯度下降算法就能得到最佳的![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)。 将上述这些概念合并到一起,我们就得到了一个最终的演算法Gradient Boosted Decision Tree(GBDT)。可能有人会问,我们刚才一直没有说到Decison Tree,只是讲到了GradientBoost啊?下面我们来看看Decison Tree究竟是在哪出现并使用的。其实刚刚我们在计算方向函数![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)的时候,是对所有N个点![](https://img.kancloud.cn/13/bb/13bb270e90d4438874604745d28cbdd9_96x18.jpg)做squared-error的regression。那么这个回归算法就可以是决策树C&RT模型(决策树也可以用来做regression)。这样,就引入了Decision Tree,并将GradientBoost和Decision Tree结合起来,构成了真正的GBDT算法。GBDT算法的基本流程图如下所示: ![这里写图片描述](https://img.kancloud.cn/2a/f5/2af571bcf0bc306ca2e2b354827f5f0a_580x237.jpg) 值得注意的是,![](https://img.kancloud.cn/dd/b4/ddb420243a0a90f9e1b8110eac2e7b25_16x11.jpg)的初始值一般均设为0,即![](https://img.kancloud.cn/5d/d9/5dd9f3ced8cf16c37b54ddaed8dbd7f2_179x16.jpg)。每轮迭代中,方向函数![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)通过C&RT算法做regression,进行求解;步进长度![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)通过简单的单参数线性回归进行求解;然后每轮更新![](https://img.kancloud.cn/dd/b4/ddb420243a0a90f9e1b8110eac2e7b25_16x11.jpg)的值,即![](https://img.kancloud.cn/72/6c/726c20cb88edf3c2b9d4b00546f5902a_147x18.jpg)。T轮迭代结束后,最终得到![](https://img.kancloud.cn/06/db/06db451c3cc01494e8887a363fdc97a0_146x54.jpg)。 值得一提的是,本节课第一部分介绍的AdaBoost-DTree是解决binary classification问题,而此处介绍的GBDT是解决regression问题。二者具有一定的相似性,可以说GBDT就是AdaBoost-DTree的regression版本。 ![这里写图片描述](https://img.kancloud.cn/3d/d4/3dd421a27bd4821719d013e133009ead_388x53.jpg) ### **Summary of Aggregation Models** 从机器学习技法课程的第7节课笔记到现在的第11节课笔记,我们已经介绍完所有的aggregation模型了。接下来,我们将对这些内容进行一个简单的总结和概括。 首先,我们介绍了blending。blending就是将所有已知的![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg) aggregate结合起来,发挥集体的智慧得到G。值得注意的一点是这里的![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)都是已知的。blending通常有三种形式: * **uniform:简单地计算所有![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)的平均值** * **non-uniform:所有![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)的线性组合** * **conditional:所有![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)的非线性组合** 其中,uniform采用投票、求平均的形式更注重稳定性;而non-uniform和conditional追求的更复杂准确的模型,但存在过拟合的危险。 ![这里写图片描述](https://img.kancloud.cn/9a/ce/9ace96b91a7c3d6b174d32656665edc2_584x249.jpg) 刚才讲的blending是建立在所有![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)已知的情况。那如果所有![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)未知的情况,对应的就是learning模型,做法就是一边学![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg),一边将它们结合起来。learning通常也有三种形式(与blending的三种形式一一对应): * **Bagging:通过bootstrap方法,得到不同![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg),计算所有![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)的平均值** * **AdaBoost:通过bootstrap方法,得到不同![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg),所有![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)的线性组合** * **Decision Tree:通过数据分割的形式得到不同的![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg),所有![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)的非线性组合** 然后,本节课我们将AdaBoost延伸到另一个模型GradientBoost。对于regression问题,GradientBoost通过residual fitting的方式得到最佳的方向函数![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)和步进长度![](https://img.kancloud.cn/ea/7b/ea7be4a5cce8f4286fbf9fa894a62760_9x12.jpg)。 ![这里写图片描述](https://img.kancloud.cn/dd/24/dd243e50c3fb000204fdb48e556ce388_584x373.jpg) 除了这些基本的aggregation模型之外,我们还可以把某些模型结合起来得到新的aggregation模型。例如,Bagging与Decision Tree结合起来组成了Random Forest。Random Forest中的Decision Tree是比较“茂盛”的树,即每个树的![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)都比较强一些。AdaBoost与Decision Tree结合组成了AdaBoost-DTree。AdaBoost-DTree的Decision Tree是比较“矮弱”的树,即每个树的![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)都比较弱一些,由AdaBoost将所有弱弱的树结合起来,让综合能力更强。同样,GradientBoost与Decision Tree结合就构成了经典的算法GBDT。 ![这里写图片描述](https://img.kancloud.cn/c0/3c/c03c4348512ceda6ad30c9f447a35102_585x338.jpg) Aggregation的核心是将所有的![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)结合起来,融合到一起,即集体智慧的思想。这种做法之所以能得到很好的模型G,是因为aggregation具有两个方面的优点:cure underfitting和cure overfitting。 第一,aggregation models有助于防止欠拟合(underfitting)。它把所有比较弱的![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)结合起来,利用集体智慧来获得比较好的模型G。aggregation就相当于是feature transform,来获得复杂的学习模型。 第二,aggregation models有助于防止过拟合(overfitting)。它把所有![](https://img.kancloud.cn/7f/6b/7f6b19f632c7de7dc0365d013fa05113_14x12.jpg)进行组合,容易得到一个比较中庸的模型,类似于SVM的large margin一样的效果,从而避免一些极端情况包括过拟合的发生。从这个角度来说,aggregation起到了regularization的效果。 由于aggregation具有这两个方面的优点,所以在实际应用中aggregation models都有很好的表现。 ![这里写图片描述](https://img.kancloud.cn/ef/3f/ef3f14d2294412c4de5e233eac5f5bd2_565x366.jpg) ### **总结** 本节课主要介绍了Gradient Boosted Decision Tree。首先讲如何将AdaBoost与Decision Tree结合起来,即通过sampling和pruning的方法得到AdaBoost-D Tree模型。然后,我们从optimization的角度来看AdaBoost,找到好的hypothesis也就是找到一个好的方向,找到权重![](https://img.kancloud.cn/38/9a/389a9983ea24ad0b3af0559c2aca381b_11x8.gif)也就是找到合适的步进长度。接着,我们从binary classification的0/1 error推广到其它的error function,从Gradient Boosting角度推导了regression的squared error形式。Gradient Boosting其实就是不断迭代,做residual fitting。并将其与Decision Tree算法结合,得到了经典的GBDT算法。最后,我们将所有的aggregation models做了总结和概括,这些模型有的能防止欠拟合有的能防止过拟合,应用十分广泛。 **_注明:_** 文章中所有的图片均来自台湾大学林轩田《机器学习技法》课程