GBDT、XGboost原理介绍

决策树

  • 决策树是一种基本的分类和回归方法。决策树模型呈树形结构,能够认为是if-else形式的判断集合。其主要的优势有:可读性好;分类速度快。
  • 决策树由节点和有向边组成,节点的类型有:内部节点——表示一个特征及其划分值;叶节点——类别或输出值。当使用决策树进行分类或者回归预测的时候,只需递归地按照内部节点的特征及划分值找到对应的叶节点便可,叶节点的类别或者值即为输出。

本文并不打算介绍分类决策树(你们可自行查询和学习ID3,C4.5,Random Forest等经常使用的基础决策树的原理,以及决策树的裁剪),而主要是为了介绍GBDT及XGBoost的原理。在介绍GBDT和xgboost以前,咱们先介绍一下CART。git

后文的标志:github

  • 训练集: D={(x1,y1),(x2,y2),...,(xn,yn)},其中xi是m维的向量,yi是第i个训练样本的标准结果。(若是yi的取值是离散的,则是分类问题;若是yi的取值范围是连续的,则是回归问题)。本文中的yi为离散取值。

CART

分类和回归树(classification and regression tree, CART)是Breiman等人在1984提出的决策树学习方法。CART假设决策树是二叉树,内部节点表示的是对数据根据某个特征的某个值得划分,特征小于或等于该划分值得数据分配在该内部节点的作节点,大于划分值的数据则被划分到右节点。算法

那么,咱们要怎样构建CART呢?决策树的构建问题主要有两点:内部节点选取哪一个特征的哪一个值做为划分特征?dom

首先要明确的是,咱们的划分目的是使得划分后的到的数据相较于划分前更为纯粹(使得划分后的数据的不肯定性更小),或者使得偏差(损失值)更小。通常,咱们对于不肯定性的度量方法有信息熵(使用信息增益最大的划分方法做为划分依据)、基尼指数等,对于损失值能够采用平方损失函数等。对于回归分析,本文使用平方损失函数做为划分依据和损失函数。机器学习

算法流程

D={(x1,y1),(x2,y2),...,(xn,yn)},其中xi是k维的向量,yi是第i个训练样本的标准结果。训练过程——从根节点开始,递归得对每一节点进行一下操做:函数

  1. 设节点的数据集合为D,根据每一个特征j的每一个可能的取值(划分值)s,将数据划分为两个集合节点R一、R2,节点内数据样例的平均值c1,c2做为节点值(或者按比例使用加权值做为节点值)。计算划分后的损失:图片描述
  2. 选取划分损失最小的特征及其对应的划分值做为该节点的划分方式。
  3. 对两个子节点R1,R2,递归进行步骤一、2的处理直至知足中止条件(节点的数据样例个数为1;样例个数不为1,可是y相同;深度超过d等)。若是知足中止条件,则叶子节点内数据样例的平均值做为节点值(或者使用加权值做为节点值)。

至此,一颗CART就训练完成了。学习

提高决策树BDT

提高树(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

GBDT(Gradient Boosting Decision Tree)是一种迭代的决策树算法,又叫 MART(Multiple Additive Regression Tree),它经过构造一组弱的学习器(树),并把多颗决策树的结果累加起来做为最终的预测输出。该算法将决策树与集成思想进行了有效的结合。rest

咱们须要知道的是,度量任何一个模型最重要的就是这个模型的损失函数。咱们训练的目标就是使得损失函数L最小化。图片描述

当损失函数是平方损失和指数损失时,每一步优化是很简单的。但对通常损失函数而言,每每每一步优化没那么容易,如绝对值损失函数和Huber损失函数。常见的损失函数及其梯度以下表所示:图片描述

如何使得损失函数最小化?调整参数,使得损失沿着梯度方向降低!(不懂的话要重学数学分析。。。)

对于损失函数为平方损失函数的,咱们可使用的是yj-Ti对xj的预测结果做为残差。那么对于其余类型的损失函数咱们应该使用什么做为残差以达到最好的效果呢呢?针对这一问题,Freidman(机器学习界的大佬)提出了梯度提高算法:利用最速降低的近似方法,即利用损失函数的负梯度在当前模型的值。图片描述

若是咱们对提高树的损失函数求偏导,就能够发现,偏导是等于残差的~,见上上图。(由于上文的残差是损失函数梯度的一个特例,对应的损失函数为平方损失函数)。所以,对于不一样的损失函数,咱们可使用损失函数的偏导做为咱们的残差。

这就是梯度提高决策树了。

XGBoost

XGBoost的全称为eXtreme Gradient Boosting,是GBDT的一种高效实现,XGBoost中的基学习器除了能够是CART(gbtree)也能够是线性分类器(gblinear)。

  • 和GBDT不一样,xgboost给损失函数增长了正则化项(L1或L2正则化项,视学习目标不一样而取不一样正则化参数。)
  • 有些损失函数是难以计算导数的,鉴于这种状况,xgboost使用损失函数的二阶泰勒展开做为损失函数的拟合
  • GBDT的节点分裂方式是遍历全部特征的全部可能划分,再选取最优者分裂。xgboost使用分位点及分位数法,近似地计算,有效下降计算量

参考:

推荐:

  • 《统计学习方法》——李航
  • 西瓜书——周志华
相关文章
相关标签/搜索