机器学习 基础教程

机器学习 集成学习

机器学习 笔记

机器学习 GBDT


机器学习中的 Boosting 算法族有两大类,一类是 weight_boosting,其中以 adaboost 为主要代表,另一类是 gradient_boosting,其中以 gbdt 为主要代表。Boosting 算法通俗一点讲,每一轮的迭代训练需要依赖上一次迭代的结果,所以它是一个串行方法,用专业的说法就是通过分步迭代(stage-wise)的方式来构建模型,在迭代的每一步构建的弱学习器都是为了弥补已有模型的不足。

GBDT 全称 Gradient Boosting Decision Tree,中文名“梯度提升决策树”,它是以决策树为基分类器(一般是 CART 树)进行迭代的决策树算法,由多棵决策树组合而成。它有很多不同的叫法,GBT(Gradient Boosting Tree)、GBRT(Gradient Boosting Regression Tree)、MART(Multiple Additive Regression Tree)等。

GBDT 的发展历史

  • 1997年6月,GBDT 的思想最初是由 Leo Breiman(机器学习先驱者,分类回归树的作者之一)提出;
  • 1999年,Jerome Harold Friedman(一位美国的统计学家,斯坦福大学教授)将 GBDT 算法用于回归分析并正式提出,它最初是为了解决回归问题而生,后续经过改进也可以解决分类问题;
  • 2014年,正在华盛顿大学就读计算机专业博士的中国留学生陈天奇发布了 XGBoost 最初版本,它是在 GBDT 的基础上对 boosting 算法进行的改进;
  • 2016年,微软 DMTK(分布式机器学习工具包)团队在 GitHub 上开源了性能超越其他 boosting 工具的 LightGBM;在不降低准确度的的前提下,速度提升了10倍左右,占用内存下降了3倍左右;

GBDT 算法

GBDT 的核心思想

GBDT 的核心思想在于,每一棵树学的是之前所有树结论和的残差,这个残差(残差的意思就是: A 的预测值 + A 的残差 = A 的实际值)就是一个加预测值后能得真实值的累加量,。比如 A 的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把 A 的年龄设为6岁去学习,如果第二棵树真的能把 A 分到6岁的叶子节点,那累加两棵树的结论就是 A 的真实年龄;如果第二棵树的结论是5岁,则 A 仍然存在1岁的残差,第三棵树里 A 的年龄就变成1岁,继续学。这就是 Gradient Boosting 在 GBDT 中的意义。

为什么要用残差来学习?

Boosting 的最大好处在于,每一步的残差计算其实变相地增大了分错样本的权重,而已经分对的样本则都趋向于0。这样后面的树就能越来越专注那些前面被分错的样本。就像我们做互联网,总是先解决60%用户的需求凑合着,再解决35%用户的需求,最后才关注那5%人的需求,这样就能逐渐把产品做好,因为不同类型用户需求可能完全不同,需要分别独立分析。如果反过来做,或者刚上来就一定要做到尽善尽美,往往最终会竹篮打水一场空(步子迈大了,容易扯到蛋)。

GBDT 算法流程

GBDT 是通过采用加法模型(即基函数的线性组合),以及不断减小训练过程产生的残差来达到将数据分类或者回归的算法。

GBDT 通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度。弱分类器一般选择 CART 树。

值得注意的是,GBDT 不管是解决回归问题,还是通过改进解决分类问题,其弱分类器(基分类器)都是 CART 回归树。不会因为我们所选择的任务是分类任务就选用分类树,这里面的核心是因为 GBDT 每轮的训练是在上一轮的训练的残差基础之上进行训练的。这里的残差就是当前模型的负梯度值 。这个要求每轮迭代的时候,弱分类器的输出的结果相减是有意义的。残差相减是有意义的。如果选用的弱分类器是分类树,类别相减是没有意义的。上一轮输出的是样本 x 属于 A 类,本一轮训练输出的是样本 x 属于 B 类。A 和 B 很多时候甚至都没有比较的意义,A 类减 B 类是没有意义的。