机器学习算法系列(14)梯度提升决策树

1. GBDT与AdaBoost的联系与区别

在前面的文章中,我们了解到了一种提升方法 —— AdaBoost,它是一类能够从训练数据中学习一组弱分类器,并将弱分类器组合成强分类器的算法,通俗一点解释就是“三个臭皮匠顶个诸葛亮”。GBDT跟AdaBoost一样都属于集成学习中的提升方法(另一种是Bagging),特殊之处在于GBDT的弱学习器限定为了决策树(分类树或回归树),提升树可以看做是多颗决策树的线性组合。不过AdaBoost算是年代比较久远的集成学习算法,现在基本上很少用到了。

除了弱学习器的不同,另外,它们两者在迭代上有所区别。AdaBoost利用的是上一轮学习器的误差率来更新数据的权重,在每一轮的迭代中误分类的数据和分类误差率小的模型会获得更高的权重,理论上AdaBoost的学习器可以选择任何分类模型,只是由于树形模型比较简单且容易产生随机性所以通常被用于基分类器。而GBDT的基学习分类器限定只能是CART回归树,顾名思义,它可以解决回归和分类问题,GBDT的迭代思路是使用前向分布算法,基本思想是根据上一轮学习器损失函数的负梯度来训练本轮的学习器,本轮学习器$f_{t}(x)$的优化的目标是将上一轮学习器的损失函数L优化得到一个最小值。如果这样解释还不太清楚,那我举一个例子,比如现在给你k次机会猜测我的真实年龄,并且下一次猜测的数字需要跟上一次猜测的数字相加才能成为下一次猜测的最终结果,第一次你猜测20岁,我说小了,然后第二次你说加10岁,我说大了,然后第三次你说减5岁,我说小了……

而如何拟合GBDT的损失函数则是一个GBDT需要考虑的关键问题。

总结一下Adaboost 与 GBDT的区别:

  1. Adaboost 是基于样本权重更新,误分类的样本和误差率低的学习器可以获得更高的权重
  2. Gradient Boost 是基于残差减小的梯度方向进行更新
  3. 理论上AdaBoost的分类器可以选择任何分类模型,GBDT的学习器则限定于分类回归树

可以这样说,如果限定提升树的基分类器为分类回归树(CART),那么此时的GBDT跟AdaBoost就没有差别了

2. 回归问题的提升树算法

下面讨论回归问题的提升树,其实相比分类问题,回归问题更好计算,没有 AdaBoost 那一套复杂的权重更新过程,每一次的迭代只需要拟合残差,每一棵新树的建立都是基于残差的负梯度方向。残差是什么?残差是实际值与预测值之差

打个比方,假设一个人真实年龄是30岁,第一颗回归树预测的结果是27岁,残差是3,下一颗树的目标就是假定预测一个年龄等于3岁的人,如果第二棵树预测的结果是2岁,那么第一颗和第二棵树相加的结果29就是两棵树的预测结果。

回归问题的提升树有两个值得关注的点:

一、寻找使得残差最小的切分节点

二、平方损失误差 $L$ 达到要求后即可停止。

3. 梯度提升(Gradient Boosting)

上面一节中,可以知道,平方损失函数的情形很简单,但是对于更一般的损失函数,优化就没有那么简单了,于是我们需要在提升树算法中引入梯度下降的优化算法,即所谓的GBDT。GBDT的损失函数,如果是对于分类算法,其损失函数有对数损失和指数损失,如果是回归算法,其损失函数一般有平方损失、绝对值损失、Huber损失函数(对异常值的鲁棒性比较强)等等。梯度下降优化算法的关键是计算其负梯度在当前模型的值,并将该值作为近似的残差,最后根据残差拟合一个回归树。

第2(c)步的$c_{mj}$是各个叶子节点最佳负梯度的拟合值,第2(d)步将该拟合值更新到下一轮的学习器中。

3. sklearn GBDT可调节的参数

按照分类和回归问题,sklearn有GradientBoostingClassifier为GBDT的分类类, 而GradientBoostingRegressor为GBDT的回归类,两者的参数类型差不多相同。

  1. loss:选择损失函数,分类问题的损失函数可以选择对数损失函数(deviance)和指数损失函数(exponential),回归问题的损失函数可以选择均方差损失函数(ls)、绝对损失函数(lad)、huber损失函数(huber)和分位数损失函数(quantile)
  2. learning_rate:学习率,默认0.1,取值范围(0,1],文档提示这个参数经常需要跟n_estimators一块调节
  3. n_estimators:学习器的迭代次数,一般可以把这个参数设置得大一点以获得更好的效果,默认是100
  4. subsample:采样率决定数据中不放回抽样一定比率的样本拟合基学习器,抽样能减小方差防止过拟合,但是同时也会增加偏差
  5. max_depth:决策树的最大深度,默认为3,max_depth限制了数的节点个数,如果数据集的特征和数据量比较大可以把这个值调大一点
  6. min_samples_split:内部节点再划分所需要的最小样本数,可以取int或者float,如果在划分的时候子树的节点数小于这个参数便不会继续划分
  7. min_samples_leaf:叶子节点所需要的最少的样本数,默认等于1,可以取int或者float
  8. min_weight_fraction_leaf:叶子节点最小的样本权重和,如果样本中有比较多的缺失值可以引进这个参数
  9. max_leaf_nodes:最大叶子节点数,默认为None,可以防止模型过拟合
  10. min_impurity_split:节点划分的最小不纯度,如果节点的不纯度小于它,那么该节点不再生成子节点

GBDT的优点和局限性

优点:

  1. 由于GBDT的弱学习器是决策树,这就决定了我们在应用模型的时候无需对数据进行归一化等预处理
  2. 泛化能力强

局限性:

  1. 不适合处理文本分类的任务,在高维稀疏的数据集上表现也一般
  2. 因为GBDT是加法模型,下一个模型是基于上一个模型的,所以它的训练过程是串行的

推荐阅读

  1. 机器学习中的算法(1)-决策树模型组合之随机森林与GBDT
  2. chentianqi: XGBoost 与 Boosted Tree
  3. GBDT原理与Sklearn源码分析-分类篇 - SCUT_Sam - CSDN博客
  4. GBDT原理与Sklearn源码分析-回归篇 - SCUT_Sam - CSDN博客
------本文结束,欢迎收藏本站、分享、评论或联系作者!------
点击查看
赠人玫瑰 手有余香
0%