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