本文并不打算介绍分类决策树(你们可自行查询和学习ID3,C4.5,Random Forest等经常使用的基础决策树的原理,以及决策树的裁剪),而主要是为了介绍GBDT及XGBoost的原理。在介绍GBDT和xgboost以前,咱们先介绍一下CART。git
后文的标志:github
分类和回归树(classification and regression tree, CART)是Breiman等人在1984提出的决策树学习方法。CART假设决策树是二叉树,内部节点表示的是对数据根据某个特征的某个值得划分,特征小于或等于该划分值得数据分配在该内部节点的作节点,大于划分值的数据则被划分到右节点。算法
那么,咱们要怎样构建CART呢?决策树的构建问题主要有两点:内部节点选取哪一个特征的哪一个值做为划分特征?dom
首先要明确的是,咱们的划分目的是使得划分后的到的数据相较于划分前更为纯粹(使得划分后的数据的不肯定性更小),或者使得偏差(损失值)更小。通常,咱们对于不肯定性的度量方法有信息熵(使用信息增益最大的划分方法做为划分依据)、基尼指数等,对于损失值能够采用平方损失函数等。对于回归分析,本文使用平方损失函数做为划分依据和损失函数。机器学习
D={(x1,y1),(x2,y2),...,(xn,yn)},其中xi是k维的向量,yi是第i个训练样本的标准结果。训练过程——从根节点开始,递归得对每一节点进行一下操做:函数
至此,一颗CART就训练完成了。学习
提高树(Boosting Decision Tree)是迭代多棵回归树来共同决策。当采用平方偏差损失函数时,每一棵回归树学习的是以前全部树的结论和残差,拟合获得一个当前的残差回归树,通常,残差的意义如公式:残差 = 真实值 - 预测值 。提高树便是整个迭代过程生成的回归树的累加。提高树模型能够表示为决策树的加法模型:优化
其中T(x;Θm)表示决策树;Θm为决策树的参数;M为树的个数。spa
D1=训练集D // m为回归树数量(自定义),m越大表示越精确,同时也意味着可能过拟合 for i range m: Ti=根据Di使用训练出的一棵CART 使用Ti对Di进行预测,rj=Ti对Di第j个样例的预测结果,并获取每一个训练样本的残差yj', 其中yj'=yj-rj Di+1={(x1,y1'),(x2,y2'),...,(xn,yn')} // 最后的模型为: f(x)=T1+T2+...+Tm
GBDT(Gradient Boosting Decision Tree)是一种迭代的决策树算法,又叫 MART(Multiple Additive Regression Tree),它经过构造一组弱的学习器(树),并把多颗决策树的结果累加起来做为最终的预测输出。该算法将决策树与集成思想进行了有效的结合。rest
咱们须要知道的是,度量任何一个模型最重要的就是这个模型的损失函数。咱们训练的目标就是使得损失函数L最小化。
当损失函数是平方损失和指数损失时,每一步优化是很简单的。但对通常损失函数而言,每每每一步优化没那么容易,如绝对值损失函数和Huber损失函数。常见的损失函数及其梯度以下表所示:
如何使得损失函数最小化?调整参数,使得损失沿着梯度方向降低!(不懂的话要重学数学分析。。。)
对于损失函数为平方损失函数的,咱们可使用的是yj-Ti对xj的预测结果做为残差。那么对于其余类型的损失函数咱们应该使用什么做为残差以达到最好的效果呢呢?针对这一问题,Freidman(机器学习界的大佬)提出了梯度提高算法:利用最速降低的近似方法,即利用损失函数的负梯度在当前模型的值。
若是咱们对提高树的损失函数求偏导,就能够发现,偏导是等于残差的~,见上上图。(由于上文的残差是损失函数梯度的一个特例,对应的损失函数为平方损失函数)。所以,对于不一样的损失函数,咱们可使用损失函数的偏导做为咱们的残差。
这就是梯度提高决策树了。
XGBoost的全称为eXtreme Gradient Boosting,是GBDT的一种高效实现,XGBoost中的基学习器除了能够是CART(gbtree)也能够是线性分类器(gblinear)。
参考:
推荐: