本文始发于个人公众号:TechFlow,原创不易,求个关注
今天是机器学习专题的第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的预测公式:
f M ( x ) = ∑ i = 1 M T ( x , θ i ) f_M(x) = \sum_{i=1}^MT(x, \theta_i) fM(x)=i=1∑MT(x,θi)
公式中的M表示CART树的个数, T ( x , θ i ) T(x, \theta_i) T(x,θi)表示第i棵回归树对于样本的预测结果,其中的 θ \theta θ表示每一棵回归树当中的参数。所以整个过程就和我刚才说的一样,GBDT模型最后的结果是所有回归树预测结果的加和。
但是这就有了一个问题,如果是回归问题那还好说,如果是分类问题那怎么办?难道分类结果也能加和吗?
其实也是可以的,我们知道在逻辑回归当中,我们用到的公式是 y ^ = 1 1 + e − θ x \hat{y}=\frac{1}{1 + e^{-\theta x}} y^=1+e−θx1,这个式子的结果表示样本的类别是1的概率。我们当然不能直接来拟合这个概率,但是我们可以用加和的方式来拟合 θ x \theta x θx的结果,这样我们就间接得到了概率。
今天的文章当中我们主要先来讲解回归问题,因为它的公式和理解最直观简单。分类的问题我们将会放到下一篇文章当中,因此这里稍作了解即可。
梯度和残差
下面我们要介绍到梯度和残差的概念了,我们先来回顾一下线性回归当中梯度下降的用法。
在线性回归当中我们使用梯度下降法是为了寻找最佳的参数,使得损失函数最小。实际上目前绝大多数的模型都是这么做的,计算梯度的目的是为了调整参数。但是GBDT不同,计算梯度是为了下一轮的迭代,这句话非常关键,一定要理解。
我们来举个例子,假设我们用线性回归 y = θ x + b y = \theta x + b y=θx+b拟合一个值,这里的目标y是20。我们当前的 θ \theta θ得到的 y ^ \hat{y} y^是10,那么我们应该计算梯度来调整参数 θ \theta θ,明显应该将它调大一些从而降低偏差。
但是GBDT不是这么干的,同样假设我们第一棵回归树得到的结果也是10,和真实结果相差了10,我们一样来计算梯度。在回归问题当中,我们通常使用均方差MSE作为损失函数,那么我们可以来算一下这个函数的梯度。我们先写出损失函数的公式:
L = 1 2 ( y i − f ( x i ) ) 2 L = \frac{1}{2}(y_i - f(x_i))^2 L=21(