机器学习之xgboost

举报
最后一个好人 发表于 2020/11/20 10:00:53 2020/11/20
【摘要】 xgboost详解

机器学习之xgboost

   Xgboost是陈天奇等人开发的一个开源机器学习项目,高效的实现了GBDT算法,并进行了算法和工程上的许多改进。在kaggle大赛上的表现十分优异,XGBoost 是一种 Boosting 方法,而 Boosting 方法又是集成学习的一个分支,因此我们首先得介绍一下它与集成学习关系。集成学习是机器学习领域的一个重要的分支,它不是一种具体的算法,而是一种“兄弟同心,其利断金”的思想。主要分为两种重要的方法:Bagging Boosting 。它们都是通过某种策略把多个弱学习器组合起来,形成一个具有很高准确率的强学习算法。

先说一说boosting方法吧:

提升(Boosting)是集成学习方法里的一个重要方法,其主要思想是将弱分类器组装成一个强分类器。在 PAC(概率近似正确)学习框架下,则一定可以将弱分类器组装成一个强分类器。

关于 Boosting 的两个核心问题:

1. 通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。

2. 通过加法模型将弱分类器进行线性组合,比如 AdaBoost 通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。而提升树通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。

 

提升树模型

提升方法实际采用的是加法模型(即基函数的线性组合)与前向分步算法。而以决策树为基函数的提升方法称为提升树(Boosting Tree)。对分类问题,决策树是二叉分类树,对回归问

题决策树是二叉回归树。提升树模型可以表示为决策树的加法模型:  

 

因此,我们可以这样认为:回归树是一个将实例的特征向量映射为一个分值的函数。

提升树预测示意图

 

是当前模型拟合数据的残差(Residual)。因此,对回归树的提升算法而言,只需要简单的拟合当前模型的残差。这样使得算法过程变得十分简单

XGBoost 原理详解

前面介绍了提升树算法,其实 XGBoost 就是一种特殊的提升树算法,准确的说它是一种梯度提升决策树(GBDT Gradient Boosting Decision Trees)。GBDT 与前面介绍的提升树方

法主要的区别就是利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中残差的近似值,来拟合一颗回归树,即:

 

XGBoost 的目标函数

传统 GBDT 算法的目标函数只有损失函数这一项,而 XGBoost 在此基础上进行了改进,增加了正则项以防止

提升树一样,采用 Boosting 的思想,从一个常量(通常是0)进行预测,每次添加一个新的预测残差的函数:

由以上的公式我们可以知道,我们所要做的唯一的一件事就是需要寻找一个方法来确定第 t 轮fxi的函数。但是怎么确定每一轮迭代的函数fx呢?答案是显然是优化

下面我们来一同学习一下:

  

推导到这里,应该就清楚了,我们的目标就是最小化上式去除常量的部分。那么我们首先来考虑一下损失函数为平方(Square)损失的情况,即:

 

有上述分析,我们知道对于目标函数当我们将损失函数设定为平方损失的时候,目标函数最终可转化为一个关于fx的二次函数,这时候我们很容易对其进行优化,甚至可以求出它的解析解,但是,为了算法的通用性和可扩展性的考虑,XGBoost 并没有指定损失函数为平方损失函数,此时我们会发现其实目标函数的表达是还是相当复杂的:

陈天奇大神想出了我们高数中学过的泰勒展开。

 

 

 

为什么我们要花费这么大的力气来推导出 (28) 所示的目标函数,而不像传统 GBDT 那样直接迭代生成新的 Tree 呢?原因是这样的:理论上的好处:使得我们更加清楚的知道我们在学习什么,以及更好的收敛性;

工程上的好处:

1.gihi都来自于损失函数的定义;

2. 函数的学习过程仅仅通过gihi依赖于目标函数;

3. 可以利用不同的模块分开实现不同的损失函数,例如平方损失函数和 logistic 失函数,这样损失函数不会受限制。

到这里,损失函数部分已经十分简单,但是我们知道,我们最终要求解的是目标函数。因此,我们还需要对目标函数的正则化项进行合适的定义和处理。

正则化项的处理

学过机器学习的同学都知道,目标函数中正则化项存在的原因是为了限制模型的复杂度,让模型在训练集上能够取得较好的结果的前提下尽可能地简单。而前面我们也提到了,在XGBoost 中,对于采用前向分布方法一步步迭代的优化时,我们模型的复杂度就是当前要定义的决策树的复杂度。

决策树函数的定义 

为此,我们首先重新定义树:我们将树定义为一个该树中所有叶子节点的值的向量。并且,每个叶子的索引映射函数映射实例到每个叶子节点上:

 

目标函数:

 

 

 

 

 

至此,对于第 t 轮的一颗已经分裂好的决策树,我们能够求出其对应的最小化的目标函数

至此xgboost我们就介绍完了!


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。