GBDT 详解分析 转+整理

GBDT

GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由多棵决策树组成,全部树的结论累加起来作最终答案。它在被提出之初就和SVM一块儿被认为是泛化能力(generalization)较强的算法。近些年更由于被用于搜索排序的机器学习模型而引发你们关注。算法

  • GBDT 主要由三个概念组成:
    • regression decision tree (DT)
    • Gradiant Boosting (GB)
    • Shrinkage (算法的一个重要演进分枝,目前大部分源码都按该版本实现)

DT 回归树 Regression Decision Tree

  • 提起决策树(DT, Decision Tree) 绝大部分人首先想到的就是C4.5分类决策树。但若是一开始就把GBDT中的树想成分类树,那就是一条歪路走到黑,一路各类坑,最终摔得都要咯血了仍是一头雾水说的就是LZ本身啊有木有。咳嗯,因此说千万不要觉得GBDT是不少棵分类树。机器学习

  • 决策树分为两大类,回归树和分类树。前者用于预测实数值,如明天的温度、用户的年龄、网页的相关程度;后者用于分类标签值,如晴天/阴天/雾/雨、用户性别、网页是不是垃圾页面。这里要强调的是,前者的结果加减是有意义的,如10岁+5岁-3岁=12岁,后者则无心义,如男+男+女=究竟是男是女? GBDT的核心在于累加全部树的结果做为最终结果,就像前面对年龄的累加(-3是加负3),而分类树的结果显然是没办法累加的,因此GBDT中的树都是回归树,不是分类树, 这点对理解GBDT至关重要(尽管GBDT调整后也可用于分类但不表明GBDT的树是分类树)。那么回归树是如何工做的呢?学习

  • 下面咱们以对人的性别判别/年龄预测为例来讲明,每一个instance都是一个咱们已知性别/年龄的人,而feature则包括这我的上网的时长、上网的时段、网购所花的金额等。测试

  • 做为对比,先说分类树,咱们知道C4.5分类树在每次分枝时,是穷举每个feature的每个阈值,找到使得按照feature<=阈值,和feature>阈值分红的两个分枝的熵最大的feature和阈值(熵最大的概念可理解成尽量每一个分枝的男女比例都远离1:1,其实应该使用特征选择的术语进行描述,应该使用信息增益或者信息增益比来表示) ,按照该标准分枝获得两个新节点,用一样方法继续分枝直到全部人都被分入性别惟一的叶子节点,或达到预设的终止条件,若最终叶子节点中的性别不惟一,则以多数人的性别做为该叶子节点的性别。(这个地方的熵最大可能没把问题解释清楚)spa

  • 回归树整体流程也是相似,不过在每一个节点(不必定是叶子节点)都会得一个预测值,以年龄为例,该预测值等于属于这个节点的全部人年龄的平均值。分枝时穷举每个feature的每一个阈值找最好的分割点,但衡量最好的标准再也不是最大熵,而是 最小化均方差--即(每一个人的年龄-预测年龄)^2 的总和 / N ,或者说是每一个人的预测偏差平方和 除以 N。这很好理解,被预测出错的人数越多,错的越离谱,均方差就越大,经过最小化均方差可以找到最靠谱的分枝依据。分枝直到每一个叶子节点上人的年龄都惟一(这太难了)或者达到预设的终止条件(如叶子个数上限),若最终叶子节点上人的年龄不惟一,则以该节点上全部人的平均年龄作为该叶子节点的预测年龄。若还不明白能够Google "Regression Tree",或阅读本文的第一篇论文中Regression Tree部分。code

梯度迭代

  • 好吧,我起了一个很大的标题,但事实上我并不想多讲Gradient Boosting的原理,由于不明白原理并没有碍于理解GBDT中的Gradient Boosting。喜欢打破砂锅问到底的同窗能够阅读这篇英文wikihttp://en.wikipedia.org/wiki/Gradient_boosted_trees#Gradient_tree_boostingblog

  • Boosting,迭代,即经过迭代多棵树来共同决策。这怎么实现呢?难道是每棵树独立训练一遍,好比A这我的,第一棵树认为是10岁,第二棵树认为是0岁,第三棵树认为是20岁,咱们就取平均值10岁作最终结论?--固然不是!且不说这是投票方法并非GBDT,只要训练集不变,独立训练三次的三棵树一定彻底相同,这样作彻底没有意义。以前说过,GBDT是把全部树的结论累加起来作最终结论的,因此能够想到每棵树的结论并非年龄自己,而是年龄的一个累加量。GBDT的核心就在于,每一棵树学的是以前全部树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。 好比A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里咱们把A的年龄设为6岁去学习,若是第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;若是第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学。这就是Gradient Boosting在GBDT中的意义,简单吧。排序

GBDT工做过程实例

  1. 仍是年龄预测,简单起见训练集只有4我的,A,B,C,D,他们的年龄分别是14,16,24,26。其中A、B分别是高一和高三学生;C,D分别是应届毕业生和工做两年的员工。
  2. 若是是用一棵传统的回归决策树来训练,会获得以下图1所示结果:ip

  3. 如今咱们使用GBDT来作这件事,因为数据太少,咱们限定叶子节点最多有两个,即每棵树都只有一个分枝,而且限定只学两棵树。咱们会获得以下图2所示结果:ci

  4. 在第一棵树分枝和图1同样,因为A,B年龄较为相近,C,D年龄较为相近,他们被分为两拨,每拨用平均年龄做为预测值。此时计算残差(残差的意思就是: A的预测值 + A的残差 = A的实际值),因此A的残差就是16-15=1(注意,A的预测值是指前面全部树累加的和,这里前面只有一棵树因此直接是15,若是还有树则须要都累加起来做为A的预测值)。进而获得A,B,C,D的残差分别为-1,1,-1,1。而后咱们拿残差替代A,B,C,D的原值,到第二棵树去学习,若是咱们的预测值和它们的残差相等,则只需把第二棵树的结论累加到第一棵树上就能获得真实年龄了。这里的数据显然是我能够作的,第二棵树只有两个值1和-1,直接分红两个节点。此时全部人的残差都是0,即每一个人都获得了真实的预测值。

  5. 换句话说,如今A,B,C,D的预测值都和真实年龄一致了。Perfect!:

    A: 14岁高一学生,购物较少,常常问学长问题;预测年龄A = 15 – 1 = 14

    B: 16岁高三学生;购物较少,常常被学弟问问题;预测年龄B = 15 + 1 = 16

    C: 24岁应届毕业生;购物较多,常常问师兄问题;预测年龄C = 25 – 1 = 24

    D: 26岁工做两年员工;购物较多,常常被师弟问问题;预测年龄D = 25 + 1 = 26

  6. 那么哪里体现了Gradient呢?其实回到第一棵树结束时想想,不管此时的cost function是什么,是均方差仍是均差,只要它以偏差做为衡量标准,残差向量(-1, 1, -1, 1)都是它的全局最优方向,这就是Gradient。

须要解释的三个问题

讲到这里咱们已经把GBDT最核心的概念、运算过程讲完了!没错就是这么简单。
不过讲到这里很容易发现三个问题:
既然图1和图2 最终效果相同,为什么还须要GBDT呢?
答案是过拟合。过拟合是指为了让训练集精度更高,
学到了不少”仅在训练集上成立的规律“,致使换一个数据集当前规律就不适用了。
其实只要容许一棵树的叶子节点足够多,训练集老是能训练到100%准确率的
(大不了最后一个叶子上只有一个instance)。
在训练精度和实际精度(或测试精度)之间,后者才是咱们想要真正获得的。

咱们发现图1为了达到100%精度使用了3个feature(上网时长、时段、网购金额),
其中分枝“上网时长>1.1h” 很显然已通过拟合了,这个数据集上A,B也许刚好A
天天上网1.09h, B上网1.05小时,但用上网时间是否是>1.1小时来判断全部人
的年龄很显然是有悖常识的;

相对来讲图2的boosting虽然用了两棵树 ,但其实只用了2个feature就搞定了,后一个
feature是问答比例,显然图2的依据更靠谱。(固然,这里是LZ故意作的数据,因此才能
靠谱得如此狗血。实际中靠谱不靠谱老是相对的) Boosting的最大好处在于,每一步的
残差计算其实变相地增大了分错instance的权重,而已经分对的instance则都趋向于0。
这样后面的树就能愈来愈专一那些前面被分错的instance。
就像咱们作互联网,老是先解决60%用户的需求凑合着,再解决35%用户的需求,最后才关
注那5%人的需求。
这样就能逐渐把产品作好,由于不一样类型用户需求可能彻底不一样,须要分别独立分析。
若是反过来作,或者刚上来就必定要作到尽善尽美,每每最终会竹篮打水一场空。
Gradient呢?不是“G”BDT么?
到目前为止,咱们的确没有用到求导的Gradient。在当前版本GBDT描述中,的确没有用
到Gradient,该版本用残差做为全局最优的绝对方向,并不须要Gradient求解.
这不是boosting吧?Adaboost可不是这么定义的。
  • 这是boosting,但不是Adaboost。GBDT不是Adaboost Decistion Tree。就像提到决策树你们会想起C4.5,提到boost多数人也会想到Adaboost。Adaboost是另外一种boost方法,它按分类对错,分配不一样的weight,计算cost function时使用这些weight,从而让“错分的样本权重愈来愈大,使它们更被重视”。
  • Bootstrap也有相似思想,它在每一步迭代时不改变模型自己,也不计算残差,而是从N个instance训练集中按必定几率从新抽取N个instance出来(单个instance能够被重复sample),对着这N个新的instance再训练一轮。因为数据集变了迭代模型训练结果也不同,而一个instance被前面分错的越厉害,它的几率就被设的越高,这样就能一样达到逐步关注被分错的instance,逐步完善的效果。Adaboost的方法被实践证实是一种很好的防止过拟合的方法,但至于为何则至今没从理论上被证实。
  • GBDT也能够在使用残差的同时引入Bootstrap re-sampling,GBDT多数实现版本中也增长的这个选项,可是否必定使用则有不一样见解。re-sampling一个缺点是它的随机性,即一样的数据集合训练两遍结果是不同的,也就是模型不可稳定复现,这对评估是很大挑战,好比很难说一个模型变好是由于你选用了更好的feature,仍是因为此次sample的随机因素。

GBDT的适用范围

该版本GBDT几乎可用于全部回归问题(线性/非线性),相对logistic regression仅能用于线性回归,GBDT的适用面很是广。亦可用于二分类问题(设定阈值,大于阈值为正例,反之为负例)。根据sklearn官网上的说明,对于多分类的数据:

The advantages of GBRT are:

  • Natural handling of data of mixed type (= heterogeneous features)
  • Predictive power
  • Robustness to outliers in output space (via robust loss functions)

The disadvantages of GBRT are:

  • Scalability, due to the sequential nature of boosting it can hardly be parallelized.
相关文章
相关标签/搜索