今天是
机器学习专题
的第30篇文章,我们今天来聊一个机器学习时代可以说是最厉害的模型——GBDT。
虽然文无第一武无第二,在机器学习领域并没有什么最厉害的模型这一说。但在深度学习兴起和流行之前,GBDT的确是
公认效果最出色的几个模型
之一。虽然现在已经号称进入了深度学习以及人工智能时代,但是GBDT也没有落伍,它依然在很多的场景和公司当中被广泛使用。也是面试当中经常会问到的模型之一。
遗憾的是市面上关于GBDT的资料虽然不少,但是很少有人把其中的核心精髓介绍清楚的。新手在初学的时候往往会被”
梯度
“,”
残差
“等这些令人费解的概念给困惑住,耽误了算法原理的学习和理解。但其实GBDT整体的原理还是比较直观和简单的,只要我们找对了方法,抓住了核心,我相信对于绝大多数人来说,应该都不会问题。
GBDT基础概念
GBDT的英文原文是Gradient Boosting Decision Tree,即
梯度提升决策树
。从它的英文表述我们可以看出来,GBDT的基础还是决策树。决策树我们在之前的文章当中曾经有过详细的讨论,我们这里就不再赘述了。在GBDT当中用到的主要是决策树的CART算法,在CART算法当中,我们每次都会选择一个特征并且寻找一个阈值进行二分。将样本根据阈值分成小于等于阈值的以及大于阈值的两个部分,在CART树当中,同一个特征可以重复使用,其他类似的ID3和C4.5都没有这个性质。
另外一个关键词是Boosting,Boosting表示一种
集成模型的训练方法
,我们之前在介绍AdaBoost模型的时候曾经提到过。它最大的特点就是会训练多个模型,通过不断地迭代来降低整体模型的偏差。比如在Adaboost模型当中,会设置多个弱分类器,根据这些分类器的表现我们会给与它们不同的权值。通过这种设计尽可能让效果好的分类器拥有高权重,从而保证模型的拟合能力。
但GBDT的Boosting方法与众不同,它是一个由多棵CART决策回归树构成的
加法模型
。我们可以简单理解成最后整个模型的预测结果是所有回归树预测结果的和,理解了这一点对于后面理解梯度和残差非常重要。
我们可以试着写一下GBDT的预测公式:
公式中的M表示CART树的个数,
表示第i棵回归树对于样本的预测结果,其中的
表示每一棵回归树当中的参数。所以整个过程就和我刚才说的一样,GBDT模型最后的结果是
所有回归树预测结果的加和
。
但是这就有了一个问题,如果是回归问题那还好说,如果是分类问题那怎么办?难道分类结果也能加和吗?
其实也是可以的,我们知道在逻辑回归当中,我们用到的公式是
,这个式子的结果表示样本的类别是1的概率。我们当然不能直接来拟合这个概率,但是我们可以
用加和的方式来拟合
的结果
,这样我们就间接得到了概率。
今天的文章当中我们主要先来讲解回归问题,因为它的公式和理解最直观简单。分类的问题我们将会放到下一篇文章当中,因此这里稍作了解即可。
梯度和残差
下面我们要介绍到梯度和残差的概念了,我们先来回顾一下线性回归当中梯度下降的用法。
在线性回归当中我们使用梯度下降法是为了
寻找最佳的参数
,使得损失函数最小。实际上目前绝大多数的模型都是这么做的,计算梯度的目的是为了调整参数。但是GBDT不同,
计算梯度是为了下一轮的迭代
,这句话非常关键,一定要理解。
我们来举个例子,假设我们用线性回归
拟合一个值,这里的目标y是20。我们当前的
得到的
是10,那么我们应该计算梯度来调整参数
,明显应该将它调大一些从而降低偏差。
但是GBDT不是这么干的,同样假设我们第一棵回归树得到的结果也是10,和真实结果相差了10,我们一样来计算梯度。在回归问题当中,我们通常使用
均方差MSE
作为损失函数,那么我们可以来算一下这个函数的梯度。我们先写出损失函数的公式:
L关于
的负梯度值刚好等于
,看起来
刚好是我们要预测的目标值减去之前模型预测的结果
。这个值也就是我们常说的残差。
我们用
表示第m棵回归树对于样本i的训练目标,它的公式为:
从直观上来讲究很简单了,我们要预测的结果是20,第一棵树预测了10,相差还剩10,于是我们用第二棵树来逼近。第二棵树预测了5,相差变成了5,我们继续创建第三棵树……
一直到我们已经逼近到了非常接近小于我们设定的阈值的时候,或者子树的数量达到了上限,这个时候模型的训练就停止了。
这里要注意,
不能把残差简单理解成目标值和
的差值
,它本质是由损失函数计算负梯度得到的。
我们再把模型训练的整个过程给整理一下,把所有的细节串联起来。
首先我们先明确几个参数,M表示决策树的数量。
表示第m轮训练之后的整体,
即为最终输出的GBDT模型。
首先,我们创建第一棵回归树即
,在回归问题当中,它是直接用回归树拟合目标值的结果,所以:
i. 对于第2到第m棵回归树,我们要计算出每一棵树的训练目标, 也就是前面结果的残差:
ii. 对于当前第m棵子树而言,我们需要遍历它的可行的切分点以及阈值,找到最优的预测值c对应的参数,使得尽可能逼近残差,我们来写出这段公式:
这里的
指的是第m棵子树所有的划分方法中叶子节点预测值的集合,也就是
第m棵回归树可能达到的预测值
。其中j的范围是1,2,3...J。
接着,我们更新
,这里的I是一个函数,如果样本落在了
节点上,那么I=1,否则I=0。