GBDT算法(Gradient Boosting Decision Tree),由于其出色的非线性拟合能力,被广泛应用在各种回归,分类的机器学习问题中。
除了能在日常工作中调用该算法取得好的结果之外,我们更需要深入理解这个算法的原理,以及其中涉及到的概念。
GBDT中Gradient Boosting和Decision Tree是两个独立的概念。Boosting意思是把多个弱分类器组合起来形成一个强分类器。因此这不是某个算法,而一种理念。而和这个理念对应的是直接训练一次性构造一个强分类器,例如SVM,LR等等。
通常通过相加来组合分类器,形式如下:
Gradient Boosting Model,以下简称GBM。这是一种构造弱分类的方法。同样地,这不是某个具体的算法,仍然是只是一个理念。
先看一个典型的优化问题:
以上迭代过程可以这么理解:整个寻优的过程就是个小步快跑的过程,每跑一小步,都往函数当前下降最快的那个方向走一点。
这样寻优得到的结果可以表示成加和形式,即
但是,一个函数对函数的求导不好理解。而且通常都无法通过上述公式直接求解到梯度函数 gi 。为此,采取一个近似的方法,把函数 Fi−1 理解成在所有样本上的离散的函数值,即:
严格来说 gi^(xk) k=1,2,……,N 只是描述了 gi 在某些个别点上的值,并不足以表达 gi ,但我们可以通过函数拟合的方法从 gi^(xk) k=1,2,……,N 构造 gi ,这样我们就通过近似的方法得到了函数对函数的梯度求导。
GBM的过程可以总结如下:
2.对i=1,2,……,K分别做如下迭代:
3.直到 |ĝ i−1| 足够小,或者迭代次数完毕
常量函数 f0 通常取样本目标值的均值,即
在GBM的过程中,尚未说清楚如何通过离散值 ĝ i−1(xj) j=1,2,……,N 构造拟合函数 gi−1 。函数拟合是个比较熟知的概念,有很多现成的方法,不过有一种拟合方法广为应用,那就是决策树Decision Tree。理解GBDT重点首先是Gradient Boosting,其次才是Decision Tree。GBDT是Gradient Boosting的一种具体实例,只不过这里的弱分类器是决策树。如果你改用其他弱分类器XYZ,你也可以称之为Gradient Boosting XYZ。只不过Decision Tree很好用,GBDT才如此引人注目。
GBDT的优势得益于Decision Tree本身的一些良好特性,具体可以列举如下:
当然Decision Tree也不是毫无缺陷,通常在给定的不带噪音的问题上,他能达到的最佳分类效果还是不如SVM,逻辑回归之类的。但是,我们实际面对的问题中,往往有很大的噪音,使得Decision Tree这个弱势就不那么明显了。而且,GBDT通过不断的叠加组合多个小的Decision Tree,他在不带噪音的问题上也能达到很好的分类效果。换句话说,通过GBDT训练组合多个小的Decision Tree往往要比一次性训练一个很大的Decision Tree的效果好很多。因此不能把GBDT理解为一颗大的决策树,几颗小树经过叠加后就不再是颗大树了,它比一颗大树更强。
谈到GBDT,常听到一种简单的描述方式:“先构造一个(决策)树,然后不断在已有模型和实际样本输出的残差上再构造一颗树,依次迭代”。其实这个说法不全面,它只是GBDT的一种特殊情况,为了看清这个问题,需要对损失函数的选择做一些解释。
从对GBM的描述里可以看到Gradient Boosting过程和具体用什么样的弱分类器是完全独立的,可以任意组合,因此这里不再刻意强调用决策树来构造弱分类器,转而我们来仔细看看弱分类器拟合的目标值,即梯度 ĝ i−1(xj) ,之前我们已经提到过
Boosting是一类机器学习算法,在这个家族中还有一种非常著名的算法叫AdaBoost,是Adaptive Boosting的简称,AdaBoost在人脸检测问题上尤其出名。既然也是Boosting,可以想象它的构造过程也是通过多个弱分类器来构造一个强分类器。
首先看下Adaboost算法,Adaboost的核心在于Adaptive,它的自适应体现在:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。以下是它的算法迭代步骤:
那AdaBoost和GBDT有什么区别呢?两者最大的区别在于,AdaBoost不属于Gradient Boosting,即它在构造弱分类器时并没有利用到梯度下降法的思想,而是用的Forward Stagewise Additive Modeling (FSAM)。为了理解FSAM,在回过头来看看Eq.(2)中的优化问题。从可以表达成一个迭代的形式
其中 ωm−1i=exp(−yiFm−1(xi)) 和要求解的 αmfm 无关,可以当成样本的权重,因此在这种情况下,构造弱分类器就是在对样本设置权重后的数据上拟合,且损失函数还是指数形式。
这个就是AdaBoost,不过AdaBoost最早并不是按这个思路推出来的,相反,是在AdaBoost提出5年后,人们才开始用Forward Stagewise Additive Modeling来解释AdaBoost背后的原理。
为什么要把平方差和指数形式Loss函数单独拿出来说呢?这是因为对这两个损失函数来说,按照Forward Stagewise Additive Modeling的思路构造弱分类器时比较方便。如果是平方差损失函数,就在残差上做平方差拟合构造弱分类器; 如果是指数形式的损失函数,就在带权重的样本上构造弱分类器。但损失函数如果不是这两种,问题就没那么简单,比如绝对差值函数,虽然构造弱分类器也可以表示成在残差上做绝对差值拟合,但这个子问题本身也不容易解,因为我们是要构造多个弱分类器的,所以我们当然希望构造弱分类器这个子问题比较好解。因此 FSAM思路无法推广到其他一些实用的损失函数上。相比而言,Gradient Boosting Modeling (GBM) 有什么优势呢?GBM每次迭代时,只需要计算当前的梯度,并在平方差损失函数的基础上拟合梯度。虽然梯度的计算依赖原始问题的损失函数形式,但这不是问题,只要损失函数是连续可微的,梯度就可以计算。至于拟合梯度这个子问题,我们总是可以选择平方差函数作为这个子问题的损失函数,因为这个子问题是一个独立的回归问题。
因此 FSAM和GBM得到的模型虽然从形式上是一样的,都是若干弱模型相加,但是他们求解弱分类器的思路和方法有很大的差别。只有当选择平方差函数为损失函数时,这两种方法等同。