【零散知识】梯度提升(gradient boosting,GB)的简单记录

前言:

{

    之前在kaggle上看到了几个之前没学习过的模型,梯度提升机(gradient boosting machine,GBM)就是其中之一,可是《机器学习》[1]里没有相关介绍,因此我就在网上找了一些资料了解一下gradient boosting。

}

 

正文:

{

    boosting算法:

    {

        首先需要介绍一下boosting算法。根据[1]中的介绍,boosting算法是一种集成学习的算法,集成学习是把许多模型集成为一个模型,并且包括串行集成和并行集成两种方式,boosting则是串行集成的代表。

        简单来说,boosting算法就是根据前一个模型在训练集上训练的结果来调整训练集的分布,比如boosting的一个实例——adboost

        adboost算法大概包括:将第一个模型在第一个训练集(原始)上进行训练;根据结果为训练样本分配权值(错误越多的权值越大,错误越少的权值越小);根据此权值对原始数据集进行采样以得到第二个训练集;之后将第二个模型在第二个训练集上进行训练;重复上述过程直到最后一个模型完成训练。

    }

    梯度提升(gradient boosting,GB):

    {

        kaggle上的一篇文章“a kaggle master explains gradient boosting(kaggle大佬解释梯度提升)”[2]写的很好,我就以此来学习一下。

        就拿[2]中的例子来说,表1是数据。

【零散知识】梯度提升(gradient boosting,GB)的简单记录
表1

        首先,使用后面三种布朗变量作为训练数据,对上面的数据建立一个预测年龄的回归树Tree1,如图1。

【零散知识】梯度提升(gradient boosting,GB)的简单记录
图1

        表2是Tree1所得到的结果。

【零散知识】梯度提升(gradient boosting,GB)的简单记录
表2

        接下来就是重点。使用Tree1所使用的训练数据再训练一个回归树Tree2,不过Tree2预测的是表2的残差(误差)。Tree2类似于图2。

【零散知识】梯度提升(gradient boosting,GB)的简单记录
图2

        之后把Tree1和Tree2结合起来,即Tree输出(年龄预测)加上Tree2的输出(残差)就等于一个新模型Combined的输出。结果见表3。

【零散知识】梯度提升(gradient boosting,GB)的简单记录
表3(SSE应该是误差平方和)

        那么我们把得到的Combined作为Tree1,按上述方法还可以训练出其Tree2,之后又可以串行地生成新模型.........。也可以用下面的方式表达:

        【零散知识】梯度提升(gradient boosting,GB)的简单记录

        当然,这个gradient boosting的思想也可以用在其他模型上(例如神经网络),只不过耗时可能是一个瓶颈。

    }

 

    结语:

    {

        我有一个问题,[1]中boosting算法会调整样本分布,而且[3]中直接说了“the data weights are readjusted(重调数据权重)”,但[2]中描述的gradient boosting并没有改变样本分布,并且[4]也说明了样本权值对gradient boosting来说不是必须的。所以我不知道在gradient boosting前先介绍boosting是不是跑题了,或者说我是不是理解错了。

        应该有不全的地方,这可能就要等到之后实践的时候在补了。

        参考资料:

        {

            [1] 周志华.《机器学习》.清华大学出版社

            [2] http://blog.kaggle.com/2017/01/23/a-kaggle-master-explains-gradient-boosting/

            [3] https://en.wikipedia.org/wiki/Gradient_boosting

            [4] https://github.com/scikit-learn/scikit-learn/issues/2490

        }

    }

}