XGBoost解析系列-原理


0.前言

  解析源码之前,还是介绍说明下XGBoost原理,网上对于XGBoost原理已有各种版本的解读。而这篇博客,笔者主要想根据自己的理解,梳理看过的XGBoost资料,包括陈天奇的论文以及引用论文内容,本文主要内容基于陈天奇的论文与PPT,希望能够做到系统地介绍XGBoost,同时加入源码新特性让内容上有增量。

  XGBoost不仅能在单机上通过OMP实现高度并行化,还能通过MPI接口与近似分位点算法(论文中是weighted quantiles sketch)实现高效的分布式并行化。其中近似分位点算法(approximate quantiles)会附加一篇博客进行详细说明,分位点算法在分布式系统、流式系统中真的是个很天才的想法,很多分布式算法的基石。最早由M.Greenwald和S. Khanna与2001年提出的GK Summay算法,直到到2007年被Q. Zhang和W. Wang提出的多层level的merge与compress/prune框架进行高度优化,而被称为A fast algorithm for approximate quantiles,详情见下一篇博客。

1.Boosting算法框架

  XGBoost算法属于集成学习中的boosting分支,其算法框架遵循1999年Friedman提出的boosting框架,该分支还有GBDT(Gradient Boosting Decision Tree),boosting集成是后一个模型是对前一个模型产生误差信息进行矫正。gradient boost更具体,新模型的引入是为了减少上个模型的残差(residual),我们可以在残差减少的梯度(Gradient)方向上建立一个新的模型。Friedman论文中针对回归过程提出boost框架如下:


这里写图片描述

  Friedman提出boost算法框架过程描述如下:

  1. 设定函数初始值 F0 ,为一个恒值函数,论文中基于变量优化出恒值,实际上也可以给定任意值或者直接为0。
  2. 根据参数 M ,进行 M 次迭代,不断将当前函数 Fm1 往最优函数 F 空间上逼近,逼近方向就是当前函数下的函数负梯度方向 L(y,F)F=Fm1 。由于优化函数,而非变量,本质上属于泛函优化。
  3. 每次迭代计算出函数负梯度,基于训练数据构建模型来拟合负梯度。原则上可以选择任何模型:树模型,线性模型或者神经网络等等,很少框架支持神经网络,推测:神经网络容易过拟合,后续函数负梯度恒为0就无法继续迭代优化下去。如果用树模型进行拟合,就是我们熟悉的CART建树过程。
  4. 优化步长,根据目标函数来最优步长 ρm ,属于变量优化,并更新当前函数,继续迭代。框架并没有shrinkage机制来控制过拟合,采用树模型和线性模型也可能过度拟合,目前现代的boosting框架都支持shrinkage,即最终的优化步长应乘以shrinkage参数: ρm=ρmγ

  该框架实际上是泛函梯度下降优化过程,尽管中间局部包含变量优化步骤,对比变量优化迭代不难发现相似之处。准确来说适合变量优化的其他策略同样适合泛函优化:1)基于梯度下降优化,步长优化可以是精确优化和非精确优化。2)基于牛顿法,根据二阶梯度直接计算步长 f(x)1 ,即更新变量 xn+1=xnf(x)f(x) ,本质上XGBoost属于牛顿法,而且加入正则化,二阶导数恒大于0;3)拟牛顿法,用于二阶不可导时情况等等

  谈到集成学习,不得不说bagging集成,比如随机森林,1)建树前对样本随机抽样(行采样),2)每个特征分裂随机采样生成特征候选集(列采样),3)根据增益公式选取最优分裂特征和对应特征分裂值建树。建树过程完全独立,不像boosting训练中下一颗树需要依赖前一颗树训练构建完成,因此能够完全并行化。Python机器学习包sklearn中随机森林RF能完全并行训练,而GBDT算法不行,训练过程还是单线程,无法利用多核导致速度慢。希望后续优化实现并行,Boosting并行不是同时构造N颗树,而是单颗树构建中遍历最优特征时的并行,类似XGBoost实现过程。随机森林中行采样与列采样有效抑制模型过拟合,XGBoost也支持这2种特性,此外其还支持Dropout抗过拟合。

2. XGBoost原理推导

  1. XGBoost考虑正则化项,目标函数定义如下:

L(ϕ)=il(yi,ŷ i)+kΩ(fk)Ω(fk)=γT+12λ||w||2

   其中 ŷ i 为预测输出, yi 为label值, fk 为第 k 树模型, T 为树叶子节点数, w 为叶子权重值, γ 为叶子树惩罚正则项,具有剪枝作用, λ 为叶子权重惩罚正则项,防止过拟合。XGBoost也支持一阶正则化,容易优化叶子节点权重为0,不过不常用。

  根据Boosting框架,可以优化出树的建模函数 ft(x)

L(t)=i=1l(yi,ŷ (t1)i+ft(xi))+Ω(ft)i=1n[l(yi,ŷ (t1)i)+g
  • 13
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值