梯度提升决策树介绍
背景
决策树是一种基本的分类和回归方法。决策树模型具有分类速度快,模型容易可视化的优点。但另一方面,决策树也容易产生过拟合的问题。虽然可以通过剪枝的方式来解决决策树过拟合的问题,但是这又会使得决策树的性能有所下降,因此简单的决策树还是不能应用到很广泛的领域中。
提升方法(boosting)也是一种在分类问题中比较常用的方法。它通过改变训练样本的权重,学习多个弱分类器,最后将这些弱分类器进行加权组合得到强分类器,从而提高分类性能。boosting的数学表示如下:
如果将决策树和boosting技术结合起来的话,可以产生出很多的算法,主要有随机森林和GBDT等。
Gradient Boosting原理简述
Gradient Boosting是Boosting方法的一种,它的主要思想是:每一次迭代中所建立的模型是通过由上一次迭代所建立的模型所构成的损失函数的梯度下降方向来构成的。损失函数是评价模型性能的指标之一,通常认为,损失函数越小,模型性能越好。而在GB算法中,通过让损失函数持续下降,我们就能不断地改善模型的性能。因此要想损失函数下降得最快,我们就必须沿着梯度方向下降,从而最大程度地改善模型性能。
提升树-boosting tree
以决策树为基函数的提升方法成为提升树,其决策树可以是分类树或者是回归树。提升树模型可以表示为决策树的加法模型:
回归问题的提升树算法
输入:训练数据集
输出:回归树 fM(x)
-
第一步:初始化
- 令 f0(x)=0 ; 第二步:进行M次迭代
-
①对于
m=1,2,...,M
,首先计算真实值和当前模型预测值的差值,我们称之为
残差,计算公式为:
rmi=yi−fm−1(xi)从公式可知,我们需要计算每一个训练数据在当前模型下的残差。
-
②学习一个回归树来拟合①中得到的残差,得到 T(x;θm) 。
-
③更新模型: fm(x)=fm−1(x)+T(x;θm)
第三步:最后得到提升树
备注:这个模型相当于在每次迭代中都尽可能大地减少模型对于当前训练数据集的误差。
Gradient Boosting Decision Tree算法
输入:训练数据集 T={(x1,y1),(x2,y2),...,(xN,yN)} , xi∈Rn , yi∈{−1,+1} , i=1,2,...,N ;
输出:回归树 fM(x)
-
第一步:初始化
-
与普通的提升树不同,GBDT的最初模型是定义为一个使得损失函数最少的常数。
f0(x)=argminc∑i=1NL(yi,c)
第二步:进行M次迭代
对
m=1,2,...,M
-
①对于
i=1,2,...,N
,计算每个训练数据在当前模型下的损失函数的负梯度的值,并把这个值作为残差看待。
rmi=−[∂L(y,f(xi))∂f(xi)]f(x)=fm−1(x)
-
②对 rmi 拟合一棵回归树,并将这棵回归树的叶子节点定义为 Rmj , j=1,2,...,J , J 表明这棵树有
J 叶子节点。 -
③对每个叶子节点 j=1,2,...,J 里的训练数据,计算与当前模型相关的残差常量 cmj :
cmj=argminc∑xi∈RmjL(yi,fm−1(xi)+c) -
④使用上面计算出来的各叶子节点的残差常量来更新模型:
fm(x)=fm−1(x)+∑j=1JcmjI(x∈Rmj)
第三步:最后得到回归树
备注:
①计算残差
rmj
的公式可以理解为,先对损失函数求导,然后使用每一个训练数据在当前模型下的预测值作为导函数的输入并求值。得到的导数值可以理解为在当前模型及当前数据下,使损失函数减少最多的值。这个值越大,当前模型的值越靠近真实值,所以这个值也可以理解为残差值。
②事实上,可以直接使用拟合残差的回归树来更新模型,但是这样更新可能会使得最终模型过拟合,因此使用对回归树的叶子节点结算残差常量来表示回归树,能一定程度地解决过拟合的问题。
③最终的模型可以表示为,所有迭代得到的回归树的叶子结点及其相应的残差常量的乘积之和。
Shrinkage解决过拟合
Shrinkage的思想认为,每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。也就是说shrinkage方法不完全信任每一棵残差树,它认为每棵残差树只学到了真理的一小部分,累加的时候只累加一小部分,通过多次迭代来弥补不足。
数学方程对比:
—之前:
—Shrinkage:
step也称为学习率(learning rate)。
总结
原始的boosting算法是通过将训练数据集的权值、弱分类器的误差以及弱分类器在最终分类器中的贡献度相互关联起来,最终得到一个性能较好的分类器。通常的训练顺序是①计算训练数据的权值;②根据当前训练数据拟合模型并得到当前模型的误差;③使用当前模型误差计算当前模型的贡献度;④根据当前模型能否正确分类重新更新训练数据的权值,然后重复上述步骤。由此可见原始boosting方法当前模型的建立是基于上一个模型的性能的。
而gradient boosting则是通过数据预测值和真实值之间的残差来更新模型的。通过计算损失函数的负梯度的方式来使得每次模型的更新都尽可能使得训练数据的预测值往真实值靠拢。所以gradient boosting和原始boosting是具有共同的思想的。
参考资料
GBDT-维基百科 https://en.wikipedia.org/wiki/Gradient_boosting
GBDT原理解释-CSDN http://blog.csdn.net/shine19930820/article/details/65633436