GBDT与XGboost小结

划重点——AdaBoost + 决策树 = 提升树
                 Gradient Boosting + 决策树 = GBDT

GBDTGradient Boosting Decision Tree

1.算法原理:GBDT(梯度提升决策树),是一种基于boosting串行式的集成学习方法,通过采用加法模型(即基函数的线性组合),以及不断减小训练过程产生的残差来达到将数据分类或者回归的算法。
 GBDT与XGboost小结
                                                                                图-GBDT的训练过程
GBDT可认为是一个迭代残差树,通过多轮迭代,每轮迭代产生一个弱分类器(CART TREE),核心就是每个分类器在上一轮分类器的残差基础上进行训练,这里的残差就是当前模型的负梯度值。
GBDT的核心就在于:每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学习。
(传统的boosting与梯度提升的区别:
GB:每个新模型的建立是为了使得之前模型的残差往梯度方向减少;
传统的boosting:对正确、错误的样本进行加权——每一步结束,就增加错误的权重,减少对的权重)
 
      让损失函数沿着梯度方向的下降,这个就是gbdt 的 gb的核心了。 利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值去拟合一个回归树。gbdt 每轮迭代的时候,都去拟合损失函数在当前模型下的负梯度。这样每轮训练的时候都能够让损失函数尽可能快的减小,尽快的收敛达到局部最优解或者全局最优解。
     GBDT的思想可以用一个通俗的例子解释,假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。
2.优点:
(1)GBDT几乎可用于所有回归问题(线性/非线性),GBDT的适用面非常广。
(2)预测精度高、适合低维数据、能处理非线性数据、
(3)可以灵活处理各种类型的数据,包括连续值和离散值。
(4)在相对少的调参时间情况下,预测的准备率也可以比较高。这个是相对SVM来说的。
(5)使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。
(6)泛化能力强,有效避免普通决策树得过拟合问题。
3.缺点:
(1)由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。
(2)如果数据维度较高时会加大算法的计算复杂度

4.算法步骤:
(1)初始化,估计使损失函数极小化的常数值,它是只有一个根节点的树,即ganma是一个常数值。
(2)
     (a)计算损失函数的负梯度在当前模型的值,将它作为残差的估计
     (b)估计回归树叶节点区域,以拟合残差的近似值
     (c)利用线性搜索估计叶节点区域的值,使损失函数极小化

     (d)更新回归树

(3)得到输出的最终模型 f(x)

5. GBDT和随机森林的比较:GBDT和随机森林都是基于决策树的高级算法,都可以用来做分类和回归,那么什么时候用GBDT? 什么时候用随机森林?
(1)二者构建树的差异:
   随机森林采取有放回的抽样构建的每棵树基本是一样的,多棵树形成森林,采用投票机制决定最终的结果。
   GBDT通常只有第一个树是完整的,当预测值和真实值有一定差距时(残差),下一棵树的构建会拿到上一棵树最终的残差作为当前树的输入。GBDT每次关注的不是预测错误的样本,没有对错一说,只有离标准相差的远近。
 (2)因为二者构建树的差异,随机森林采用有放回的抽样进行构建决策树,所以随机森林相对于GBDT来说对于异常数据不是很敏感,但是GBDT不断的关注残差,导致最后的结果会非常的准确,不会出现欠拟合的情况,但是异常数据会干扰最后的决策。
    综上所述:如果数据中异常值较多,那么采用随机森林,否则采用GBDT。

三、xgboost

xgboos也是以(CART)为基学习器的GB算法,但是xgboost在计算速度和准确率上,较GBDT有明显的提升。xgboost最大的特点在于,它能够自动利用CPU的多线程进行并行,同时在算法上加以改进提高了精度。(XGBoost是在GBDT基础上的改良)

1.算法原理:说到xgboost,不得不说gbdt,两者都是boosting方法,希望建立K个回归树,使得树群的预测值尽量接近真实值(准确率)而且有尽量大的泛化能力。

xgboost利用泰勒展开三项,做一个近似,我们可以很清晰地看到,最终的目标函数只依赖于每个数据点的在误差函数上的一阶导数和二阶导数。

GBDT与XGboost小结                         GBDT与XGboost小结

γ越大,表示越希望获得结构简单的树,因为此时对较多叶子节点的树的惩罚越大。λ越大也是越希望获得结构简单的树。

2. xgboost(相比GBDT)优点:

(1)xgboost在代价函数里自带加入了正则项,用于控制模型的复杂度。

(2)xgboost在进行节点的分裂时,支持各个特征多线程进行增益计算,因此算法更快,准确率也相对高一些。支持并行化,因为这是xgboost的闪光点,直接的效果是训练速度快,boosting技术中下一棵树依赖上述树的训练和预测,所以树与树之间应该是只能串行!那么大家想想,哪里可以并行?!没错,在选择最佳分裂点,进行枚举的时候并行!同层级节点可并行。具体的对于某个节点,节点内选择最佳分裂点,候选分裂点计算增益用多线程并行。

(3)XGboost吸取随机森林列采样的思想,有效防止过拟合

(4)在损失函数上进行了二阶泰勒展开,相对GBDT使用了二阶导的信息,计算更精确

四、重要参数的意义及设置

推荐GBDT树的深度:6;(横向比较:DecisionTree/RandomForest需要把树的深度调到15或更高)
  以下摘自知乎上的一个问答,问题和回复都很好的阐述了这个参数设置的数学原理。
  【问】xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?
  用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和DecisionTree一样我能理解,因为它是用bagging的方法把DecisionTree组合在一起,相当于做了多次DecisionTree一样。但是xgboost/gbdt仅仅用梯度上升法就能用6个节点的深度达到很高的预测精度,使我惊讶到怀疑它是黑科技了。请问下xgboost/gbdt是怎么做到的?它的节点和一般的DecisionTree不同吗?
  【答】
  这是一个非常好的问题,题主对各算法的学习非常细致透彻,问的问题也关系到这两个算法的本质。这个问题其实并不是一个很简单的问题,我尝试用我浅薄的机器学习知识对这个问题进行回答。
  一句话的解释,来自周志华老师的机器学习教科书( 机器学习-周志华):Boosting主要关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成;Bagging主要关注降低方差,因此它在不剪枝的决策树、神经网络等学习器上效用更为明显。
  随机森林(random forest)和GBDT都是属于集成学习(ensemble learning)的范畴。集成学习下有两个重要的策略Bagging和Boosting。
  Bagging算法是这样做的:每个分类器都随机从原样本中做有放回的采样,然后分别在这些采样后的样本上训练分类器,然后再把这些分类器组合起来。简单的多数投票一般就可以。其代表算法是随机森林。Boosting的意思是这样,他通过迭代地训练一系列的分类器,每个分类器采用的样本分布都和上一轮的学习结果有关。其代表算法是AdaBoost, GBDT。
  其实就机器学习算法来说,其泛化误差可以分解为两部分,偏差(bias)和方差(variance)。这个可由下图的式子导出(这里用到了概率论公式D(X)=E(X2)-[E(X)]2)。偏差指的是算法的期望预测与真实预测之间的偏差程度,反应了模型本身的拟合能力;方差度量了同等大小的训练集的变动导致学习性能的变化,刻画了数据扰动所导致的影响。这个有点儿绕,不过你一定知道过拟合。
  如下图所示,当模型越复杂时,拟合的程度就越高,模型的训练偏差就越小。但此时如果换一组数据可能模型的变化就会很大,即模型的方差很大。所以模型过于复杂的时候会导致过拟合。
  当模型越简单时,即使我们再换一组数据,最后得出的学习器和之前的学习器的差别就不那么大,模型的方差很小。还是因为模型简单,所以偏差会很大。
也就是说,当我们训练一个模型时,偏差和方差都得照顾到,漏掉一个都不行。
  对于Bagging算法来说,由于我们会并行地训练很多不同的分类器的目的就是降低这个方差(variance) ,因为采用了相互独立的基分类器多了以后,h的值自然就会靠近.所以对于每个基分类器来说,目标就是如何降低这个偏差(bias),所以我们会采用深度很深甚至不剪枝的决策树。
  对于Boosting来说,每一步我们都会在上一轮的基础上更加拟合原数据,所以可以保证偏差(bias),所以对于每个基分类器来说,问题就在于如何选择variance更小的分类器,即更简单的分类器,所以我们选择了深度很浅的决策树。

参考:https://www.cnblogs.com/ModifyRong/p/7744987.html

https://www.cnblogs.com/pinard/p/6140514.html

https://www.jianshu.com/p/005a4e6ac775