GBRT原理介绍

GBDT有很多简称,有GBT(Gradient Boosting Tree), GTB(Gradient Tree Boosting ), GBRT(Gradient Boosting Regression Tree), MART(Multiple Additive Regression Tree),其实都是指的同一种算法。
如集成方法原理介绍中,集成方法主要分为Bagging和Boosting方法,Bagging方法得典型例子是随即森林RF,而Boosting的一个典型例子就是GBDT。

1.GBRT原理介绍

GBRT是集成学习Boosting家族的成员,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型。前向分布算法的思想是基于当前模型和拟合函数选择合适的决策树函数,从而最小化损失函数。
GBRT主要有两个部分组成:
回归树:Regression Tree(RT)
梯度提升:Gradient Boosting(GB)

(1)回归树(RT):GBRT是迭代的决策树算法,决策树分为两类,回归树和分类树,分类树用于分类标签值,回归树用来预测实际值。GBRT是一种迭代的回归树算法,由多棵回归树组成,所有回归树的结论累加起来为最终结果。
(2)梯度提升(GB):Boosting通过迭代多棵树来共同决策。核心是每一棵树都是学习之前所有树的结论和残差。

下面主要以GBDT讲述:

在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是ft−1(x), 损失函数是L(y,ft−1(x)), 我们本轮迭代的目标是找到一个CART回归树模型的弱学习器ht(x),让本轮的损失函数L(y,ft(x))=L(y,ft−1(x)+ht(x))最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。

GBDT的思想可以用一个通俗的例子解释,假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。
问题就是损失的拟合不好度量。
GBDT使用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树。

梯度:在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。就是函数变化增加最快的地方。沿着梯度方向,容易找到函数的最大值。负梯度即梯度的反方向,沿着负梯度方向,容易找到函数最小值。

2.GBRT损失函数

对于回归算法,常用损失函数有如下4种:
a)均方差,这个是最常见的回归损失函数:
在这里插入图片描述
b)绝对损失,这个损失函数也很常见:
在这里插入图片描述
c)Huber损失,它是均方差和绝对损失的折中产物,对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量。损失函数如下:
在这里插入图片描述
d)分位数损失。它对应的是分位数回归的损失函数,表达式为:
在这里插入图片描述
对于Huber损失和分位数损失,主要用于健壮回归,也就是减少异常点对损失函数的影响。

3.GBRT调参

GBRT需要调参的参数包括两部分,第一部分是Boosting框架的参数,第二部分是CART决策树的参数(同RF)。详细请参考随机森林RF调参的CART决策树的参数。

(1)GBRT框架参数

  1. n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。在实际调参的过程中,我们常常将n_estimators和下面参数learning_rate一起考虑。
  2. learning_rate: 即每个弱学习器的权重缩减系数ν,也称作步长,我们的强学习器的迭代公式为fk(x)=fk−1(x)+νhk(x)。ν的取值范围为0<ν≤1。对于同样的训练集拟合效果,较小的ν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。所以这两个参数n_estimators和learning_rate要一起调参。一般来说,可以从小一点的ν开始调参,默认是1。
  3. subsample: 子采样,取值为(0,1]。这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间,默认是1.0,即使用子采样后,也被称为随机梯度提升树(Stochastic Gradient Boosting Tree,SGBT)。
  4. init: 即我们的初始化的时候的弱学习器,如果不输入,则用训练集样本来做样本集的初始化分类回归预测。否则用init参数提供的学习器做初始化分类回归预测。一般用在我们对数据有先验知识,或者之前做过一些拟合的时候,如果没有的话就不用管这个参数了。
  5. loss: 即我们GBDT算法中的损失函数。对于回归模型,有均方差"ls", 绝对损失"lad", Huber损失"huber"和分位数损失“quantile”。默认是均方差"ls"。一般来说,如果数据的噪音点不多,用默认的均方差"ls"比较好。如果是噪音点较多,则推荐用抗噪音的损失函数"huber"。而如果我们需要对训练集进行分段预测的时候,则采用“quantile”。
  6. alpha:这个参数只有GradientBoostingRegressor有,当我们使用Huber损失"huber"和分位数损失“quantile”时,需要指定分位数的值。默认是0.9,如果噪音点较多,可以适当降低这个分位数的值。
    从上面可以看出, GBRT的框架参数主要需要关注的是 n_estimators,即弱学习器的最大迭代次数、learning_rate每个弱学习器的权重缩减系数ν和subsample子采样。

4.GBDT优缺点

GBDT主要的优点有:
   1) 可以灵活处理各种类型的数据,包括连续值和离散值。
   2) 在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。
   3)使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。

GBDT的主要缺点有:
   1)由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过子采样的SGBT来达到部分并行。使用了子采样,程序可以通过采样分发到不同的任务去做boosting的迭代过程,最后形成新树,从而减少弱学习器难以并行学习的弱点。

5.GBRT的scikit-learn使用

使用GBRT构建模型:

from sklearn.ensemble import GradientBoostingRegressor
model = GradientBoostingRegressor()
model.fit(train_x, train_y)

调用特征重要性评估:

model = GradientBoostingRegressor()
model.fit(train_x, train_y)
y = model.feature_importances_

你可能感兴趣的:(机器学习)