XGBoost算法梳理
XGBoost是boosting算法的其中一种。Boosting算法的思想是将许多弱分类器集成在一起形成一个强分类器。因为XGBoost是一种提升树模型,所以它是将许多树模型集成在一起,形成一个很强的分类器。而所用到的树模型则是CART回归树模型。讲解其原理前,先讲解一下CART回归树。
文章目录
- 一、CART回归树
- 二、XGBoost算法思想
- 三、XGBoost原理
- 四、分裂结点算法
- 五、Shrinkage and Column Subsampling
- 六、近似算法
- 七、针对稀疏数据的算法(缺失值处理)
- 八、XGBoost的优点
- 九、论文解读:XGBoost: A Scalable Tree Boosting System
- 9.1 摘要
- 9.2 导论
一、CART回归树
CART回归树是假设树为二叉树,通过不断将特征进行分裂。比如当前树结点是基于第j个特征值进行分裂的,设该特征值小于s的样本划分为左子树,大于s的样本划分为右子树。
而CART回归树实质上就是在该特征维度对样本空间进行划分,而这种空间划分的优化是一种NP难问题,因此,在决策树模型中是使用启发式方法解决。典型CART回归树产生的目标函数为:
因此,当我们为了求解最优的切分特征j和最优的切分点s,就转化为求解这么一个目标函数:
所以我们只要遍历所有特征的的所有切分点,就能找到最优的切分特征和切分点。最终得到一棵回归树。
二、XGBoost算法思想
该算法思想就是不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数,最后只需要将每棵树对应的分数加起来就是该样本的预测值。
注:w_q(x)为叶子节点q的分数,f(x)为其中一棵回归树。
如下图例子,训练出了2棵决策树,小孩的预测分数就是两棵树中小孩所落到的结点的分数相加。爷爷的预测分数同理。
三、XGBoost原理
XGBoost目标函数定义为:
目标函数由两部分构成,第一部分用来衡量预测分数和真实分数的差距,另一部分则是正则化项。正则化项同样包含两部分,T表示叶子结点的个数,w表示叶子节点的分数。γ可以控制叶子结点的个数,λ可以控制叶子节点的分数不会过大,防止过拟合。
正如上文所说,新生成的树是要拟合上次预测的残差的,即当生成t棵树后,预测分数可以写成:
同时,可以将目标函数改写成:
很明显,我们接下来就是要去找到一个f_t能够最小化目标函数。XGBoost的想法是利用其在f_t=0处的泰勒二阶展开近似它。所以,目标函数近似为:
其中g_i为一阶导数,h_i为二阶导数:
由于前t-1棵树的预测分数与y的残差对目标函数优化不影响,可以直接去掉。简化目标函数为:
上式是将每个样本的损失函数值加起来,我们知道,每个样本都最终会落到一个叶子结点中,所以我们可以将所以同一个叶子结点的样本重组起来,过程如下图:
因此通过上式的改写,我们可以将目标函数改写成关于叶子结点分数w的一个一元二次函数,求解最优的w和目标函数值就变得很简单了,直接使用顶点公式即可。因此,最优的w和目标函数公式为
四、分裂结点算法
在上面的推导中,我们知道了如果我们一棵树的结构确定了,如何求得每个叶子结点的分数。但我们还没介绍如何确定树结构,即每次特征分裂怎么寻找最佳特征,怎么寻找最佳分裂点。
正如上文说到,基于空间切分去构造一颗决策树是一个NP难问题,我们不可能去遍历所有树结构,因此,XGBoost使用了和CART回归树一样的想法,利用贪婪算法,遍历所有特征的所有特征划分点,不同的是使用上式目标函数值作为评价函数。具体做法就是分裂后的目标函数值比单子叶子节点的目标函数的增益,同时为了限制树生长过深,还加了个阈值,只有当增益大于该阈值才进行分裂。
同时可以设置树的最大深度、当样本权重和小于设定阈值时停止生长去防止过拟合。
五、Shrinkage and Column Subsampling
XGBoost还提出了两种防止过拟合的方法:Shrinkage and Column Subsampling。Shrinkage方法就是在每次迭代中对树的每个叶子结点的分数乘上一个缩减权重η,这可以使得每一棵树的影响力不会太大,留下更大的空间给后面生成的树去优化模型。Column Subsampling类似于随机森林中的选取部分特征进行建树。其可分为两种,一种是按层随机采样,在对同一层内每个结点分裂之前,先随机选择一部分特征,然后只需要遍历这部分的特征,来确定最优的分割点。另一种是随机选择特征,则建树前随机选择一部分特征然后分裂就只遍历这些特征。一般情况下前者效果更好。
六、近似算法
对于连续型特征值,当样本数量非常大,该特征取值过多时,遍历所有取值会花费很多时间,且容易过拟合。因此XGBoost思想是对特征进行分桶,即找到l个划分点,将位于相邻分位点之间的样本分在一个桶中。在遍历该特征的时候,只需要遍历各个分位点,从而计算最优划分。从算法伪代码中该流程还可以分为两种,全局的近似是在新生成一棵树之前就对各个特征计算分位点并划分样本,之后在每次分裂过程中都采用近似划分,而局部近似就是在具体的某一次分裂节点的过程中采用近似算法。
七、针对稀疏数据的算法(缺失值处理)
当样本的第i个特征值缺失时,无法利用该特征进行划分时,XGBoost的想法是将该样本分别划分到左结点和右结点,然后计算其增益,哪个大就划分到哪边。
八、XGBoost的优点
之所以XGBoost可以成为机器学习的大杀器,广泛用于数据科学竞赛和工业界,是因为它有许多优点:
1.使用许多策略去防止过拟合,如:正则化项、Shrinkage and Column Subsampling等。
2.目标函数优化利用了损失函数关于待求函数的二阶导数
3.支持并行化,这是XGBoost的闪光点,虽然树与树之间是串行关系,但是同层级节点可并行。具体的对于某个节点,节点内选择最佳分裂点,候选分裂点计算增益用多线程并行。训练速度快。
4.添加了对稀疏数据的处理。
5.交叉验证,early stop,当预测结果已经很好的时候可以提前停止建树,加快训练速度。
6.支持设置样本权重,该权重体现在一阶导数g和二阶导数h,通过调整权重可以去更加关注一些样本。
参考链接:https://blog.csdn.net/fendouaini/article/details/81120786
九、论文解读:XGBoost: A Scalable Tree Boosting System
9.1 摘要
Tree boosting is a highly effective and widely used machine learning method.
In this paper, we describe a scalable end to-end tree boosting system called XGBoost, (which is used widely by data scientists to achieve state-of-the-art results on many machine learning challenges)(非限定性定语从句).
We propose a novel sparsity-aware algorithm for sparse data and weighted quantile sketch for approximate tree learning.
More importantly, we provide insights on cache access patterns, data compression and sharding to build a scalable tree boosting system.
By combining these insights, XGBoost scales beyond billions of examples using far fewer resources than existing systems.
- 为什么高效?高效是由于对稀疏数据使用了稀疏感知算法和加权的分位数草图用来进行近似的树学习。以及使用了数据缓存、数据压缩以及数据分片技术。
9.2 导论
There are two important factors that drive these successful applications: usage of effective (statistical) models that capture the complex data dependencies and scalable learning systems that learn the model of interest from large datasets.
所以XGBoost不仅是优秀的机器学习模型(能够捕捉数据中复杂的依赖关系),而且是一套弹性的机器学习系统。
XGBoost算法梳理相关推荐
- XGBoost算法的相关知识
文章目录 背景 定义损失函数 (1)原始目标函数Obj (2)原始目标函数Obj的泰勒展开 (3)具体化目标函数的泰勒展开细节 (4)求解目标函数中的wjw_jwj 最优切分点算法 基于分桶的划分策 ...
- 【白话机器学习】算法理论+实战之Xgboost算法
1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支 ...
- 数据分析利器:XGBoost算法最佳解析
作者:symonxiong,腾讯 CDG 应用研究员 XGBoost是一种经典的集成式提升算法框架,具有训练效率高.预测效果好.可控参数多.使用方便等特性,是大数据分析领域的一柄利器.在实际业务中,X ...
- 干货▍全网通俗易懂的数据竞赛大杀器XGBoost 算法详解
前言 xgboost一直在竞赛江湖里被传为神器,比如时不时某个kaggle/天池比赛中,某人用xgboost于千军万马中斩获冠军. 而我们的机器学习课程里也必讲xgboost,如寒所说:"R ...
- 相见恨晚!一文搞清XGBoost算法
XGBoost算法 1,算法简介 XGBoost(Extreme Gradient Boosting),即一种高效的梯度提升决策树算法.他在原有的GBDT基础上进行了改进,使得模型效果得到大大提升.作 ...
- 机器学习算法(15)之Xgboost算法
前言:前一篇文章对boosting的两个方法做了阐述,这篇文章将会是对前两篇文章的深化,谈的是一个更加优化了的boostIng算法,自从2014年9月份在 Kaggle 的希格斯玻色子机器学习大赛中夺 ...
- 高级算法梳理-XGB
XGB算法梳理 1.算法原理 XGBoost(eXtreme Gradient Boosting)算法是Gradient Boosting算法的高效实现版本,因其在应用实践中表现出优良的效果和效率,因 ...
- Datawhale组队学习:初级算法梳理课程任务
背景 Datawhale 是国内很有名的一个开源学习组织.这个组织将渴望改变的学习者以及一群有能力有想法的青年人集结在一起,营造出一种互促高效的学习环境,一起为开源学习付出努力. Datawhale ...
- XGBoost算法原理解释(转载)
1.XGBoost算法原理 参考文章1 参考文章2 2.代码实战 train = pd.read_csv(r"./dataset/train.csv") train.head() ...
最新文章
- 【转】js实现复制到剪贴板功能,兼容所有浏览器
- SmartWeatherAPI C#版
- ecshop php升级,升级-安装与升级- ECShop帮助
- linux嵌入式智能家居环境监测系统的设计,智能家居环境监测系统.doc
- 期待三分天下开源芯片有其一
- django-redis的使用,利用配置中的缓存绑定数据库,直接获取连接对象
- python 列表 元祖 字典,Python 列表、元组、字典
- data-ajax=“false“
- 【BZOJ】【1015】 【JSOI2008】星球大战starwar
- redis安全设置及主从配置
- 空间计量经济学(2)---广义空间自回归与空间误差模型
- 信息系统集成监理费收取标准_信息系统工程监理资费标准.doc
- spurious retransmission timeouts理解
- 漫画 | 阿姨,我不想努力了~
- 骨传导与气传导技术联合,这款耳机有何出色之处?开箱体验走起
- Android Process 'command 'C:\Users\Win\AppData\Local\Android\Sdk\build-t non-zero exit value 1错误解决方案
- JAVA我的世界给op_我的世界手机版op指令大全 op指令怎么用
- pgsql时间处理的一些方式
- 网络游戏的朴素理财观
- Lottie-Android详解
热门文章
- Google Wave 翻译机器人 Translatey
- Python3: args and kwargs详解
- IDEA自带maven报错maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories解决
- 全志V3S荔枝派zero10分钟制作TF启动卡,主线Linux,主线u-boot(超过10分钟博主直播吃奥利奥!!!)
- 告别嘈杂传达真心!酷狗跨品牌合作邀你一起“把话说清楚
- vim go ycm
- NGINX启动报错,端口被占用
- 探索鼎龙湾德萨斯牛仔小镇,欣赏粤西非遗文化的魅力 这个是标题
- 目标检测究竟发展到了什么程度?| 目标检测发展22年
- 印象笔记三级目录_09小马哥:如何建立印象笔记的分级目录。