超详细解释XGBoost,一篇文章搞懂XGBoost

XGBoost是一种高效、可扩展的梯度提升树算法,由Tianqi Chen开发,广泛应用于数据科学竞赛。它在Kaggle竞赛中表现出色,被誉为必备技能。XGBoost通过优化目标函数,特别是引入偏差变量,提高了决策树的效率。算法通过贪心算法和加权分位法构建决策树,处理缺失值并控制模型复杂度,确保高效训练。
摘要由CSDN通过智能技术生成

XGBoost

背景

XGBoost 最初是由 Tianqi Chen 作为分布式(深度)机器学习社区(DMLC)组的一部分的一个研究项目开始的。XGBoost后来成为了Kaggle竞赛传奇——在2015年的時候29个Kaggle冠军队伍中有17队在他们的解决方案中使用了XGboost。人们越来越意识到XGBoost的强大威力。夸张一点说,如果你不会XGboost,那你参加Kaggle竞赛就是去送人头的。

XGboost到底是什么呢?Tianqi Chen在XGboost的论文中写道:”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.“[1] 总结一下,XGBoost是一个可拓展的Tree boosting算法,被广泛用于数据科学领域。

XGBoost可以说是GBDT(Gradient Boosting Decision Tree)梯度提升树的一个改进版本。XGBoost中的X代表的就是eXtreme(极致),XGBoost能够更快的、更高效率的训练模型。这就是为什么XGBoost可以说似乎GBDT的一个改进版本。正是得益于XGBoost的高效率,使得她成为数据竞赛中的一大杀器。

工程原理

想要了解一个算法,首先得从宏观上知道这个算法是怎么工作的:1、算法的具体形式;2、怎么做出预测

具体形式

XGboost的可视化(如下图,一个由两棵决策树组成的XGBoost)

重点

1、XGboost的基本组成元素是:决策树;我们将这些决策树成为”弱学习器“,这些”弱学习器“共同组成了XGboost

2、组成XGBoost的决策树之间是有先后顺序的;后一棵决策树的生成会考虑前一棵决策树的预测结果,即将前一棵决策树的偏差考虑在内(在目标函数中有体现)

3、生成每棵决策树使用的数据集,是整个数据集。所以可以将每棵决策树的生成都看作是一个完整的决策树生成过程

怎么做出预测

一个新样本的预测:新样本依次进入XGBoost的每棵决策树。在第一棵决策树,有一个预测值;在第二棵决策树,有一个预测值,依次类推···直到进入完所有”弱学习器“(决策树)。最后,将“在每一颗决策树中的值”相加,即为最后预测结果。

举例:还是刚刚那张图,样本“儿子”在tree1中的预测值为+2,在tree2中为+0.9。将两个值相加,2+0.9=2.9,所以XGboost最后预测样本“儿子”的值为2.9

目标函数

引言

到这里,我们已经知道了一个XGBoost模型到底是什么工作的了。那XGboost模型到底是怎么生成的呢?XGboost中的“弱学习器”是怎么生成的?

了解机器学习的都知道,要评价我们产生的模型是否是最好的,其依据是“目标函数”。目标函数越小,这个模型才越是我们想要的。刚刚提到,XGboost中的“弱学习器”是“决策树”。在经典的“决策树”算法中,ID3的目标函数基于“信息熵”,CART的目标函数基于“GINI系数”。而在XGboost中,“决策树“的目标函数引入了”偏差“这个变量,这也是XGBoost的魅力所在。

总结一下:XGboost的”弱学习器“是”决策树“,每棵”决策树”都是目标函数值最小时的模型。只有这棵“决策树”的目标函数值最小,才会被选为“弱学习器”。

数学详解

要想清楚了解XGBoost的原理,需要对其目标函数进行数学上的解析。这样,我们才能知道,每一个”弱学习器“是怎么生成的。

我们已经知道,要生成一棵好的决策树,目标是:是其目标函数值最小。那问题是,我们该如何使得其最小呢?其中,涉及到两个问题:

问题1:怎么设置叶子节点的值?

问题2:如何进行结点的分裂(怎么构造树的结构)?

围绕问题1问题,笔者对目标函数进行了手写的数学详解


第t个决策树的目标函数公式如下


明确符号

1、 l ( y i , y ^ i ( t − 1 ) ) l({y}_{i},\widehat{y}_{i}^{(t-1)}) l(yiy i(t1)) 表示与 y i , y ^ i ( t − 1 ) {y}_{i},\widehat{y}_{i}^{(t-1)} yiy i(t1) 有关的损失函数,这个损失函数是可以根据需要自己定义的

2、 y ^ i ( t − 1 ) \widehat{y}_{i}^{(t-1)} y i(t1) 表示”前t-1棵决策树“对样本i的预测值(将前t-1棵决策树中的每棵决策树的预测值相加所得); y i {y}_{i} yi 表示样本i的实际值

3、 f t ( x i ) f_{t}(x_{i}) ft(xi) 表示”第t棵决策树“对样本i 的预测值

4、 Ω ( f t ) \Omega(f_{t}) Ω(ft) 表示第t棵树的模型复杂度

所以,我们有结论如下图:总共k棵树对样本i的预测值=前k-1棵预测树的预测值+第k棵树的预测值


化简目标函数

1、将刚刚得到的: y ^ i ( k ) = y ^ i ( k − 1 ) + f k ( x i ) \widehat{y}_{i}^{(k)}=\widehat{y}_{i}^{(k-1)}+{f}_{k}(x_{i}) y i(k)=y i(k1)+fk(xi) 替换进目标函数。过程如下图

2、紧接着第一步的结果,我们有以下目标——怎么样才能使目标函数最小(如下图)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E8rsrcaA-1662714938255)(https://typora-nigel.oss-cn-nanjing.aliyuncs.com/img/未命名图片.png)]

3、为了解决这个问题,我们对目标函数进行化简。根据数学知识,我们可以使用“泰勒展开”对一个函数进行化简。具体过程如下图

大致的思路:1、使用泰勒展开;2、将常数项忽略(因为我们的目标是找最小值);3、转换一些符号,使式子更简洁


注释
Ω ( f k ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega(f_{k})=\gamma T + \frac{1}{2} \lambda\sum_{j=1}^T w_{j}^2 Ω(fk)=γT+

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值