GBDT集成算法(梯度提升树)
一、算法思想
GBDT是集成学习Boosting算法中的一种,它与Adaboost相比,Adaboost算法利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去,GBDT也是一轮一轮迭代弱学习器,使用前向分布算法,但是它限定弱学习器只能是决策树(CART回归树)。决策树分为两大类,回归树和分类树,GBDT中的树都是回归树,不是分类树。
GBDT的思想可以用一个通俗的例子解释,假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。
二、最小二乘回归树生成算法
三、提升树
1、提升树模型
提升方法实际采用加法模型(即基函数的线性组合)与前向分步算法。以决策树为基函数的提升方法称为提升树(boosting tree)。提升树模型可以表示为决策树的加法模型:
由于树的线性组合可以很好地拟合训练数据,即使数据中的输入和输出之间的关系很复杂也是如此,所以提升树是一个高功能的学习算法。不同的提升树其主要区别在于使用的损失函数,包括平方误差损失函数的回归问题,用指数损失函数的分类问题,以及用一般损失函数的一般决策问题。
2、提升树算法
算法推导:
回归问题的提升树算法流程:
3、实例
四、梯度提升树(Gradient Boosting Decison Tree)
1、梯度提升树思想:负梯度拟合
提升树利用加法模型与前向分步算法实现学习的优化过程,当损失函数是平方损失和指数损失函数时,每一步优化很简单,但对一般损失函数而言,每一步的优化并不容易。大牛Freidman提出了梯度提升算法(gradient boosting),其关键是利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值,拟合一个回归树(用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树)。第t轮的第i个样本的损失函数的负梯度表示为:
通过损失函数的负梯度来拟合,是一种通用的拟合损失误差的办法。无论是分类问题还是回归问题,我们都可以通过其损失函数的负梯度的拟合,从而用GBDT来解决我们的分类和回归问题。区别仅仅在于损失函数不同导致的负梯度不同而已。
2、GBDT回归算法流程:
3、GBDT分类算法:
GBDT的分类算法从思想上和GBDT的回归算法没有区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差。为了解决这个问题,主要有两个方法,一个是用指数损失函数,此时GBDT退化为Adaboost算法。另一种方法是用类似于逻辑回归的对数似然损失函数的方法。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。
(1)二元GBDT分类算法:
(2)多元GBDT分类算法:
4、GBDT常用损失函数
(1)GBDT分类算法的损失函数
(a)指数损失函数(其实就是Adaboost算法),损失函数表达式为:
(b)对数损失函数,分为二元分类和多元分类两种
(2)GBDT回归算法的损失函数
(a)均方差,最常用,损失函数表达式为:
(b)绝对损失,损失函数表达式为:
对应负梯度误差为:
(c)Huber损失,它是均方差和绝对损失的折衷产物,对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量。损失函数如下:
对应的负梯度误差为:
(d)分位数损失,它对应的是分位数回归的损失函数,表达式为:
其中θ为分位数,需要我们在回归前指定。对应的负梯度误差为:
对于Huber损失和分位数损失,主要用于健壮回归,也就是减少异常点对损失函数的影响。
5、GBDT的正则化(防止过拟合)
第一种,步长(learning rate),对于弱学习器的迭代加上正则化项 v 。0< v <=1。对于同样的训练集学习效果,较小的ν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。
第二种,通过子采样比例(subsample),取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在 [0.5, 0.8] 之间。
第三种对于弱学习器即CART回归树进行正则化剪枝。
6、GBDT的优缺点
GBDT主要的优点有:
(1) 可以灵活处理各种类型的数据,包括连续值和离散值。
(2) 在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。
(3)使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。
GBDT的主要缺点有:由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来 达到部分并行。