这篇文章打算介绍一下boosting 和xgboost,这两天也看了好多文章,也感受了解的不深,算是作个记录。c++
先简单提一下Bagging, 原理是从现有数据中有放回的抽取若干个样本构建分类器,重复若干次创建若干个分类器进行投票。 而Boost(提高)是指每一步都产生一个弱预测模型,而后加权累加到总模型中。每一步弱预测模型生成的依据都是损失函数的负梯度方向,若干步之后就能够达到逼近损失函数局部的最小值。算法
首先Boost是一个加法模型,有若干个基函数及其权重乘积之和的累加。
函数
要使损失函数最小,那么新加的这一项恰好等于损失函数的负梯度。这样一步一步就使得损失函数降低最快。 优化
这里的lambda能够和beta合并表示步长。对于这个基函数而言,其实就是关于x和这个函数梯度的一个拟合,而后步长的选择能够根据线性搜索,即寻找在这个梯度上降低最小值的那个步长,尽快逼近损失函数的最小值。 梯度提高完cdn
首先既然是树,上一篇介绍过,基函数是决策树,而损失函数则是根据具体问题具体分析,不过整体方法都是同样,梯度降低。 好比到第m步, 计算残差。 blog
下一步,对树的每一个区域分别用线性搜索的方法寻找最佳步长,而后与上面的区域预测值合并,最后能够获得第m步的目标函数。 get
对于GBDT容易出现过拟合,因此有必要增长一点正则项,好比叶子节点数目或叶子节点预测值的平方和,限制模型复杂度的过分提高。it
以前用的梯度降低只考虑了一阶信息,根据泰勒展开,把二阶信息用上: io
其中fm为参数的函数是正则项。能够表示以下: class
对于决策树而言,最重要的一共有多少个节点以及节点的权值。因此决策树能够表示为:
各类公式,最后获得
能够获得的结果是:把新一步函数的损失函数变成了只与上一步相关的一个新的损失函数。这样能够遍历数据中全部的分割点,寻找新的损失函数降低最多的分割点,重复上述操做。
相比于梯度降低提高,XGBoost在划分新的树的时候还用到了二阶信息,所以可以更快的收敛;因为用c/c++写的,速度也快。在寻找最加分割点的时候,还能够引入并行计算,所以速度进一步提升。
参考文章:
XGBoost 与 Boosted Tree:多看几遍