首页>>技术前沿>>网站/软件行业动态
GBDT原理与Sklearn源码分析
作者:西安软件公司 | 转载 来源:西安软件公司 | 时间:2018年10月12日| 点击:0次 | 【评论】

1.GB原理概述
注意:对原理已经熟知或者不想太多了解者可直接跳过看实践部分,另外在学习GBDT前非常建议读者先看一下李航老师的《统计学习方法》中的8.4.1节。

首先,先解释一下所谓的boosting(提升)。提升方法就是从弱学习算法出发,反复学习,得到一系列的弱分类器(基分类器),然后组合这些弱分类器,构成一个强分类器。大多数的提升方法都是改变训练数据的概率分布(训练数据的权值分布)。

所以,对于提升方法来说,需要解决两个问题:一是每一轮学习中,如何改变训练数据的权值或者概率分布;二是如何将弱分类器组合成一个强分类器。

了解了所谓的boosting后,我们得到上面的两个问题,对于第一个问题,在GBDT中,其实就是通过拟合损失函数的负梯度值在当前模型的值,这里需要注意的,在以前的机器学习算法中,我们都是通过直接拟合真实值,而在GBDT里,我们拟合的目标不再是真实值,而是一个梯度值,当然这个梯度值和真实值有关系,后面部分会说明。

对于第二个问题,GBDT中的基分类器当然是决策树。但是决策树有很多比如C4.5、ID3、CART等等。那么用的是哪种树?在GBDT里,用的是CART(分类与回归树),同时Sklearn里面实现GBDT时用的基分类器也是CART。

为了前后连贯,这里简单介绍一下CART。一般的CART是这样的:用于分类任务时,树的分裂准则采用基尼指数,用于回归任务时,用MSE(均方误差)。
注意:当然在回归任务中,分裂准则也不再局限于用MSE,也可以用MAE,还可以用Friedman_mse(改进型的mse)。

上面提到,CART可以用于回归和分类,那么到底用回归还是分类呢?上面我们已经提到了,GBDT拟合的目标是一个梯度值,这个值当然是一个连续值或者说实值,所以在GBDT里,通通都是回归树。

有了基分类器后,如何将这些基分类器组合起来?boosting方法一般是使用加法模型。
即:fM(x)=∑Mm=1T(x,θm)fM(x)=∑m=1MT(x,θm)
其实利用GB训练强学习器的思路,总结下来就是下面这个过程:


对于算法的第3步:yi~=?[?L(yi,F(xi))?F(xi)]F(x)=Fm?1(x)yi~=?[?L(yi,F(xi))?F(xi)]F(x)=Fm?1(x),就是我们上面说的损失函数的负梯度在当前模型的值。
也就是说,我们每一个颗回归树拟合的目标是yi~yi~。

这里这样说可能比较抽象,我们举几个例子:
比如说,损失函数选择使用:
L(yi,F(xi))=(12)?(yi?F(xi))2L(yi,F(xi))=(12)?(yi?F(xi))2,那么其负梯度值为:?[?L(yi,F(xi))?F(xi)]=(yi?F(xi))?[?L(yi,F(xi))?F(xi)]=(yi?F(xi)),再带入当前模型的值F(x)=Fm?1(x)F(x)=Fm?1(x)。
则有:
yi~=?[?L(yi,F(xi))?F(xi)]F(x)=Fm?1(x)=(yi?Fm?1(xi))yi~=?[?L(yi,F(xi))?F(xi)]F(x)=Fm?1(x)=(yi?Fm?1(xi))
所以我们能看到,当损失函数选用Least-square时,每一次拟合的值就是(真实值-当前模型的值)。

比如说,损失函数选择Least-absolute使用:
L(yi,F(xi))=|yi?F(xi)|L(yi,F(xi))=|yi?F(xi)|,其梯度值为:
yi~=?[?L(yi,F(xi))?F(xi)]F(x)=Fm?1(x)=sign(yi?Fm?1(xi))yi~=?[?L(yi,F(xi))?F(xi)]F(x)=Fm?1(x)=sign(yi?Fm?1(xi))
其中signsign是符号函数。

比如说,损失函数选择使用logistic loss时:(二分类任务)
L(yi,F(xi))=yilog(pi)+(1?yi)log(1?pi)L(yi,F(xi))=yilog(pi)+(1?yi)log(1?pi)。
其中pi=11+e?F(xi)pi=11+e?F(xi)。
其梯度值为:
yi~=?[?L(yi,F(xi))?F(xi)]F(x)=Fm?1(x)=yi?11+e?Fm?1(xi)yi~=?[?L(yi,F(xi))?F(xi)]F(x)=Fm?1(x)=yi?11+e?Fm?1(xi)(这个简单推导过程在下一篇文章有,以及多分类任务采用的loss-function)

对于算法的第4步,在这里先简单提一下,其目的就是为了求一个最优的基分类器。对于不同的基分类器有不同的寻找,比如,对于决策树,寻找一个最优的树的过程其实依靠的就是启发式的分裂准则。

对于算法的第5步,是一个Line search 的过程,具体可以参考Friedman的文章。在GBDT里,通常将这个过程作为Shrinkage,也就是把ρm做为学习率ρm做为学习率,后面实践部分可以看到效果