集成学习:XGBoost(原理篇)

本文解析XGBoost的原理,通过GBDT的拓展介绍目标函数改进,涉及泰勒展开、正则化和树结构优化。通过实例探讨树的复杂度计算与目标函数结合,以及XGBoost在效率和并行处理上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

  • 本文参考众多技术文章,选取个人认为比较易于理解的例子以及数学公式原理来解读集成学习相关的一些算法原理,作为学习笔记。

  • 集成学习文章将会根据算法提出时间的顺序进行依次总结,最主要的是算法原理会越来越复杂,所以个人能力有限可能有些地方考虑不全面或者理解错了,所以总结文章仅供参考。

  • 每篇文章单独介绍时候会尽可能提出更多围绕本篇算法相关的问题,但是实际需要用到才会理解更深,所以不全面的地方还望提出问题,共同进步。

  • XGBoost原理需要在GBDT的基础上去理解才会容易一些,如果GBDT理解的比较深刻那么XGBoost就是在其基础上的一个较为完美的一个优化。

  • 本文只能理解XGBoost是怎么一个流程,是如何实现的,知道是怎么一回事的程度,具体如何实现可以看参考资料有的带实现代码,等XGBoost代码篇会更深入的解释该算法(应该是很久以后了)。

关于XGBoost与GBDT的关系

  • XGBoost(eXtreme Gradient Boosting)极致梯度提升,是基于GBDT的一种算法。

  • XGBoost比GBDT的优化的地方在于一下方面图片

关于XGBoost的优化

  • XGBoost对于目标函数的推导部分优化:XGBoost的目标函数由损失函数和正则化项两部分组成。图片

  • 其实上图中最后一行公式就是表示最终yi的估计就是K棵回归树组成的分类器预测的结果,那么用GBDT表达XGB就是
    y i ^ = ∑ k = 1 M f k ( x i ) = y i ^ ( t − 1 ) + f t ( x i ) (GBDT梯度提升树表达式) \widehat{y_{i}} = \sum_{k=1}^Mf_{k}(x_{i}) = \widehat{y_{i}}^{(t-1)} + f_{t}(x_{i})\tag{GBDT梯度提升树表达式} yi =k=1Mfk(xi)=yi (t1)+ft(xi)(GBDT)

  • 注:GBDT的表达式一定要理解清楚,连等之间的含义

  • 那么替换上图中整体的目标函数(由于目标函数实在找不到念啥怎么打出来,只能引用原作者的图了,我真是菜)图片

  • 如图所示,我们接下来开始进行优化XGBoost的目标函数

  • 补充:一阶泰勒展开与二阶泰勒展开式图片

  • 根据上图中泰勒展开式我们进行二阶泰勒展开(公式代码不是很好写,再次引用原作者的图示)图片图片

  • 接下来优化正则项图片

  • 关于进一步合并一次项系数与二次项系数(个人难以理解,此处略,感兴趣自己找,原作者给的链接已经失效),但是可以从下方实例中帮助理解

XGBoost实例

  • 我们重新定义一颗树,包括两个部分:

  • 叶子结点的权重向量 ω ;

  • 实例 -> 叶子结点的映射关系q(本质是树的分支结构);图片

  • 我们定义一颗树的复杂度 Ω,它由两部分组成:

  • 叶子结点的数量;

  • 叶子结点权重向量的L2范数;图片

  • 注:这里说的权重都是指的这颗树分叉结束后所有的不同枝干的最终节点对应的权重

  • 接着带入目标函数,对结点进行分组(这个以节点分组就是单纯的最终叶子里面包含的训练数据,比对上图中leaf 3的情况)图片

  • 最后,合并一次项系数、二次项系数。 图片

XGBoost目标函数

  • 构建形如一元二次方程形式,求最优值。图片

  • 目标值Obj最小,则树结构最好,此时即是目标函数的最优解。图片

XGBoost树训练:在实际训练XGBoost树中,最佳分裂点是一个关键问题。

XGB的一些优缺点:

图片图片

个人的一些看法与不解的地方

  • 首先XGBoost相对GBDT来说个人理解的没有那么深入,依旧有些云里雾里的感觉,但是大致就是在GBDT的基础上,目标函数加入了正则化防止过拟合(过拟合也是树模型的一个通病,分裂过深就容易过拟合),利用二阶泰勒展开简化XGBoost的目标函数让其可以收敛的更快,那性能上肯定是比GBDT效率更高的(二阶相对一阶展开),而且加入了并行的运算方式,使得XGBoost处理数据更快。

  • 求出目标函数最优解,与树的分割有什么关系?

    • 个人理解(因为没有百度到很正面的解释,也可能是个人理解的不够全面所以有这个有点沙雕的问题):从上面实例中我们定义一棵树是定义好一颗树的所有结点以及节点的权重还有映射关系,以及树的结构复杂度包括节点的数量以及对节点权重的l2范式,但是树是依次一层一层分裂的,所以训练时候最终的每个叶子对应位置都会有各自的权重但是这个叶子是如何生成的呢?这就是后面提到找寻最佳分裂点的问题,相当于先定义好了最终结果的规格,再去让走向最终结果的路“最优”(如果理解的不对还希望大佬能解答这个问题)

参考资料

主要参考:XGBoost的原理、公式推导、Python实现和应用 - 知乎 (zhihu.com)
其他参考:
xgboost原理分析以及实践_kingsam_的博客-优快云博客_xgboost原理图
XGBoost、GBDT超详细推导 - 知乎 (zhihu.com)
还有人不懂XGBoost的缺失值处理?(全面解析篇) - 知乎 (zhihu.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

矮人三等

秀儿,是你吗秀儿?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值