Boosting:XGBoost思想及数据推导详细过程

来源:互联网 发布:汽修管理系统源码 编辑:程序博客网 时间:2024/06/06 10:00

    Boosting思想:

    Boosting主要是一种思想,表示“知错就改”。是一族可将弱学习器提升为强学习器的算法,如Adaboost、GBDT、XGBOOST,这组算法的工作机制类似。先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个学习器,如此重复进行下去,直到基学习器数目达到事先指定的值T,最终将这 T个基学习器进行加权结合。

    Boosting是是串行构造模型,不断使用后一个弱分类器弥补前一个弱分类器的不足的过程。且最终结果为模型结果的加总。

    Boosting族著名的算法:Adaboost、GBDT、XGBOOST


1、XGBoost介绍

    XGBoost是2014年2月诞生,由中国的陈天奇提出。XGBoost实现的是一种通用的Tree Boosting算法。 xgboost即能解决分类问题,也能解决回归问题。  

    原理是,首先使用训练集和样本真值(即标准答案)训练一棵树,然后使用这棵树预测训练集,得到每个样本的预测值,由于预测值与真值存在偏差,所以二者相减可以得到“残差”。接下来训练第二棵树,此时不再使用真值,而是使用残差作为标准答案。两棵树训练完成后,可以再次得到每个样本的残差,然后进一步训练第三棵树,以此类推。树的总棵数可以人为指定,也可以监控某些指标(例如验证集上的误差)来停止训练。

    举例1说明:预测客户去银行审批贷款的额度,假设客户的额度为1000。

  • 使用第一颗树预测,其目标函数为1000。假设模型预测的结果为920,则残差为80。

  • 接着构造第二课树预测,这时其目标函数就要基于第一颗树的预测结果,此时的目标函数是怎么样弥补前一课树的残差,即减少残差。第二颗树的目标函数为80。假设第二颗树预测的结果为50,则与真实值的残差还剩下30,即会作为第三颗树的目标值。

  • 接着进行第三棵树预测,此时的目标函数为30,假设第三课树又找回来12。

  • 依次类推,串行构造,需要把前一颗树的结果当成一个整体。最终结果值为n棵树的结果相加。比如例中,如果只做三颗树预测,最终结果为982。


    举例2说明:用两颗树来预测一个人是否喜欢玩游戏。最下面的一行数2、0.1、-1为得分值

    模型的结果为两颗树的值相加。比如男孩爱玩游戏的得分为2.9,老人爱玩游戏的得分为1.9。

   

2、目标函数

    监督机器学习问题基本上是“在规则化参数的同时最小化误差”。最小化误差是为了让模型拟合训练数据,而规则化参数是防止模型过分的拟合训练数据。    

设计集成学习的目标函数的目的:

  • 一方面保证预测值和真实值之间的差异最小

  • 另一方面需要树模型更精简,防止过拟合


单个模型的损失函数如下:

    关于逻辑回归的推导,可参考另一篇文章:

统计知识3:逻辑回归函数、Sigmoid函数、极大似然


boosting的损失函数:

    Boosting学习中,假设我们构造了k颗树,则预测函数的总体值为:


因为是一系列串行模型的相加,因此,可以列出构建流程如下:

因为每轮加入一个模型,到底加入模型的标准是什么?

    这就到目标的角度,需要明确一个目标,来确定加进来什么模型合适。

    监督机器学习问题基本上是“在规则化参数的同时最小化误差”。最小化误差是为了让模型拟合训练数据,而规则化参数是防止模型过分的拟合训练数据。    

    设计如下为目标函数,由损失函数、复杂度两部分构成


惩罚项计算案例如下:


确定目标函数后,下面就是训练和求解的过程。

如何训练并求解目标函数,是GBDT和XGboost的一个区别。

  • GBDT的求解:具体到每颗树来说,不断地寻找分割点(split point),将样本集进行分割,初始情况下,所有样本都处于一个结点(即根结点),随着树的分裂过程的展开,样本会分配到分裂开的子结点上。分割点的选择通过枚举训练样本集上的特征值来完成,分割点的选择依据则是减少损失函数。给定一组样本,实际上存在指数规模的分割方式,所以这是一个NP-Hard的问题,实际的求解算法也没有办法在多项式时间内完成求解,而是采用一种基于贪心原则的启发式方法来完成求解。 也就是说,在选取分割点的时候,只考虑当前树结构到下一步树结构的loss变化的最优值,不考虑树分裂的多个步骤之间的最优值,这是典型的greedy的策略。

  • XGboost的求解:则是为了便于求解,对l目标函数进行二级Taylor展开进行了变换


boosting的训练求解推导

在介绍推导前,先介绍下泰勒展开。

而我们的目标函数是:

先定义一阶导数和二阶导数:

带入公式转化目标:

因为上面的公式需要遍历每一个样本,计算比较复杂,因为每一个样本最终都要落在叶子节点上,因此可以简化为遍历样本,定义每个叶子节点的样本个数。

根据叶节点重新组合函数:注意现在遍历点已经转移到遍历所有的叶子节点T。


推导到此,xgboost的问题演变为,每轮加进来的模型,该怎么样构造,按照什么样的标准评估。

Obj代表了当我们指定一个树结构的时候,我们在目标上面最多减少多少,可以把它叫做结构分数。类似于基尼系数一样,是对树结构进行打分的函数。

下面就是算如何切分,才能使得上面的值最小。而上面的值就是一个切分标准。

假设我们在样本上切了一刀,

对某个特定的分隔a,可以计算出计算a左边和右边的导数和。

进而求出切分后带来的信息增益。

    xgboost通过巧妙的设计目标函数,先是在分母上加一个λ,来降低分支的收益“灵敏度”,这个“灵敏度”可以通过修改此参数来控制。当收益小于一个阈值则剪枝,从而达到防止过拟合的目的。另外一个参数γ,从最后每次分割后的收益函数可以看到,这个参数的“物理意义”就是每分裂一次,减去一个视为惩罚的常数

    但是对于样本的切分,需要枚举所有可能的切分方案,看看哪个切分方案带来的增益最大,从而使得损失函数最小。贪婪的做法,可以假设对于变量x,若要确定切分节点,可以先排序数据,从左到右对所有可能的切分点进行切分一次,每次计算出左导数和右导数和,然后求出信息增益,最终找出最优切分方案。

    Boosting推导过程可以看出,为了求损失函数最小,最后一步步演变成,每轮加进来的模型,该怎么样构造,按照什么样的标准的问题。

xgboost为什么是目前比较好用的算法?(引用总结)

    机器学习就是模型对数据的拟合。对于一组数据,使用过于复杂的模型去拟合,往往会发生过拟合,这时就需要引入正则化项来限制模型复杂度,然而正则化项的选取、正则化系数的设定都是比较随意的,也比较难做到最佳。而如果使用过于简单的模型,由于模型能力有限,很难把握数据中蕴含的规律,导致效果不佳。
    Boosting算法比较巧妙,首先使用简单的模型去拟合数据,得到一个比较一般的结果,然后不断向模型中添加简单模型(多数情况下为层数较浅决策树),随着树的增多,整个boosting模型的复杂度逐渐变高,直到接近数据本身的复杂度,此时训练达到最佳水平。
    因此,boosting算法要取得良好效果,要求每棵树都足够“弱”,使得每次增加的复杂度都不大,同时树的总数目要足够多。XGBoost中,对每棵树的叶子节点数做了惩罚,从而限制了叶子节点的增长,使得每棵树都是“弱”的,同时还引入了学习速率,进一步降低了每棵树的影响。这样做的代价是,数的总数目会多一些,但从其取得的效果上看,这样做是值得的。


参考文章:

https://www.zhihu.com/question/41354392/answer/124274741

http://www.a-site.cn/article/714295.html

http://blog.csdn.net/sb19931201/article/details/52557382

http://blog.csdn.net/wty__/article/details/52919675


附:

稀疏矩阵:

矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素的分布没有规律,通常认为矩阵中非零元素的总数比上矩阵所有元素总数的值小于等于0.05时,则称该矩阵为稀疏矩阵(sparse matrix),该比值称为这个矩阵的稠密度;与之相区别的是,如果非零元素的分布存在规律(如上三角矩阵、下三角矩阵、对角矩阵),则称该矩阵为特殊矩阵。