xgboost公式推导(通俗版)

写在前面

欢迎您关注作者知乎:ML与DL成长之路

推荐关注公众号:AI成长社,ML与DL的成长圣地。

浏览更多内容,可访问:http://www.growai.cn

一 说明

xgboost是boosting算法的其中一种,该算法思想就是不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。具体的目标函数如下:

O b j ( t ) = ∑ i = 1 n l ( y i , y i ^ ( t − 1 ) + f t ( x i ) ) + Ω ( f t ) + c o n s t a n t (1) Obj{(t)} = \sum_{i=1}^nl(y_i, \hat{y_i}^{(t-1)} + f_t(x_i)) + Ω(f_t) + constant\tag {1} Obj(t)=i=1nl(yi,yi^(t1)+ft(xi))+Ω(ft)+constant(1)

​ 主要就是找到 f t f_t ft来优化这一目标函数,通过一个简单的例子来形象的理解该目标函数。例如是小明真实有100个糖果,现在建立一个决策系统来预测小明有多少个糖。首先建立一棵树,记为树1,它的预测结果是90个,这时得到一个残差,这个残差值就是100-90=10,此时和真实值差别是10。为了提高精度,可以在该决策系统中再添加一棵树,记为树2。树2就是为了弥补上一棵树存在的残差,假设它的预测结果是5,此时总体的残差值是10-5=5,即和真实值相差为5。符号化表示:之前的结果10表示为输出结果为 y 1 ^ \hat{y_1} y1^,即上一时刻的残差值,树2的值为 f 2 f_2 f2,此时得到的值。接着可以再建立第三课树,记为树3。假设它的预测值为3,此时总体的残差值是5-3=2,即和真实值相差为2。符号化表示:上一时刻输出结果5为 y 2 ^ \hat{y_2} y2^,即上一时刻的残差值,树3为 f 3 f_3 f3,此时得到的值。xgboost的目标就是通过找到 f t f_t ft来优化这一目标函数,使得最终结果足够小。下面对该函数进行推导化简。

二 目标函数化简

1、预备知识,泰勒展开式。主要使用泰勒展开式来近似原来的目标函数

f ( x + ∇ x ) = f ( x ) + f ’ ( x ) ∇ x + 1 2 f ′ ′ ( x ) ∇ x (2) f(x + \nabla{x}) = f(x) + f^{’}(x)\nabla{x} + \frac{1}{2}f^{''}(x)\nabla{x}\tag {2} f(x+x)=f(x)+f(x)x+21f(x)x(2)

2、推导过程:

O b j ( t ) = ∑ i = 1 n [ l ( y i , y i ^ ( t − 1 ) ) + ∂ y ^ ( t − 1 ) l ( y i , y ^ ( t − 1 ) ) ∗ f t ( x i ) + ∂ y ^ ( t − 1 ) 2 l ( y i , y ^ ( t − 1 ) ) ∗ f t ( x i ) 2 + Ω ( f t ) + c o n s t a n t (3) Obj{(t)} = \sum_{i=1}^n[l(y_i, \hat{y_i}^{(t-1)})+\partial_{\hat{y}^{(t-1)}}l(y_i, \hat{y}^{(t-1)})*f_t(x_i) +\partial_{\hat{y}^{(t-1)}}^{2}l(y_i, \hat{y}^{(t-1)})*\frac{f_t(x_i)}{2} + Ω(f_t) + constant\tag {3} Obj(t)=i=1n[l(yi,yi^(t1))+y^(t1)l(yi,y^(t1))ft(xi)+y^(t1)2l(yi,y^(t1))2ft(xi)+Ω(ft)+constant(3) ≈ ∑ i = 1 n [ g i ∗ f t ( x i ) + h i ∗ f t ( x i ) 2 ] + Ω ( f t ) + c o n s t a n t (4) \approx{ \sum_{i=1}^n[g_i*f_t(x_i) + h_i*\frac{f_t(x_i)}{2}] + Ω(f_t) + constant}\tag {4} i=1n[gift(xi)+hi2ft(xi)]+Ω(ft)+constant(4)

= ∑ i = 1 n [ g i ∗ w q ( x i ) + 1 2 h i ∗ w q ( x i ) 2 ] + γ T + λ ∑ j = 1 T ω j 2 (5) =\sum_{i=1}^n[g_i*w_{q(x_i)} + \frac{1}{2}h_i*w_{q(x_i)}^2] + \gamma{T} + \lambda{\sum_{j=1}^T\omega_j^{2}} \tag {5} =i=1n[giwq(xi)+21hiwq(xi)2]+γT+λj=1Tωj2(5)

= ∑ j = 1 T [ ( ∑ i ∈ I j g i ) w j + 1 2 ( ( ∑ i ∈ I j h i + λ ) w j 2 ) ] + γ T (6) =\sum_{j=1}^T[(\sum_{i\in{I_j}}g_i) w_j+ \frac{1}{2}((\sum_{i\in{I_j}}h_i + \lambda) w_j^2)] + \gamma{T}\tag {6} =j=1T[(iIjgi)wj+21((iIjhi+λ)wj2)]+γT(6) = ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T (7) =\sum_{j=1}^T[G_jw_j + \frac{1}{2}{(H_j + \lambda)w_j^2}] + \gamma{T} \tag {7} =j=1T[Gjwj+21(Hj+λ)wj2]+γT(7)

  • 式(3):它是在(2)的基础上推导出来,是将 l ( y i , y i ^ ( t − 1 ) ) l(y_i, \hat{y_i}^{(t-1)}) l(yi,yi^(t1))看着(2)中的x, f t ( x i ) f_t(x_i) ft(xi)记为 ∇ x \nabla{x} x(注:这里的变换是近似变换。后面式中的t,表示时刻;i表示第i个样本。将 g i = ∂ y ^ ( t − 1 ) l ( y i , y ^ ( t − 1 ) ) , h i = ∂ y ^ ( t − 1 ) 2 l ( y i , y ^ ( t − 1 ) ) g_i = \partial_{\hat{y}^{(t-1)}}l(y_i, \hat{y}^{(t-1)}), h_i = \partial_{\hat{y}^{(t-1)}}^{2}l(y_i, \hat{y}^{(t-1)}) gi=y^(t1)l(yi,y^(t1)),hi=y^(t1)2l(yi,y^(t1));又因为 l ( y i , y i ^ ( t − 1 ) ) l(y_i, \hat{y_i}^{(t-1)}) l(yi,yi^(t1))是一个固定值,可以合并到后面的常数项中。式(3)变形为式(4)
  • 式(5):它是将 f t ( x i ) f_t(x_i) ft(xi)z和后面的正则项目展开了。
    • 这里对于f的定义做一下细化,把树拆分成结构部分q叶子权重部分w。下图是一个具体的例子。结构函数q把输入映射到叶子的索引号上面去,即第几个叶子;而w给定了每个索引号对应的叶子分数是什么。通俗的理解就是样本x落到那个叶子结点上,取该结点的值。在这里插入图片描述
    • 正则化项目选择了数据树的叶子个数,以及叶子权值大小平方。为了防止树在训练过程中过度复杂。当然这不是唯一的一种定义方式,不过这一定义方式学习出的树效果一般都比较不错。下图还给出了正则化项目计算的一个例子。在这里插入图片描述
  • 式(6)主要的变换是将对样本的遍历,转换为对树的叶子结点的遍历。(理解部分:假设一共5个样本,其中共有两个样本落在上图树中的leaf1,一个样本落在leaf2中,还有两个样本落在leaf3中。式(5)是直接统计各个样本的值,式(6)则是直接遍历叶子,遍历leaf1时可以取得统计2个样本的值,leaf2时可以取得统计1个样本的值, leaf3时可以取得统计2个样本的值,同样可以访问所有的样本。在叶子上遍历更加方便计算)。式(6)中就是统计落在每个叶子结点中所有的样本的一阶导数 g i g_i gi和该叶子结点权值w的乘积,同时二阶导数 h i h_i hi和该叶子结点权值w的乘积(每个样本的 g i 和 h i g_i和h_i gihi都不一样)。
  • 使式中 G j G_j Gj表示当前叶子结点所有样本一阶导数的和,同理 H j H_j Hj表示当前样本所有二阶导数的和

3 目标函数转换

O b j ( t ) = ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T (8) Obj^{(t)}=\sum_{j=1}^T[G_jw_j + \frac{1}{2}{(H_j + \lambda)w_j^2}] + \gamma{T} \tag {8} Obj(t)=j=1T[Gjwj+21(Hj+λ)wj2]+γT(8)

使得式(8)最小,令 ∂ j ( f t ) ∂ w j = G j + ( H j + λ ) w j = 0 (9) \frac{\partial{j(f_t)}}{\partial{w_j}} = G_j + (H_j + \lambda)w_j = 0\tag {9} wjj(ft)=Gj+(Hj+λ)wj=0(9)

得到 w j = − G j H j + λ (10) w_j = -\frac{G_j}{H_j +\lambda}\tag {10} wj=Hj+λGj(10)

将(10)代入(9)得到: O b j = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T (11) Obj = -\frac{1}{2}\sum_{j=1}^T\frac{G_j^2}{H_j + \lambda} + \gamma{T}\tag {11} Obj=21j=1THj+λGj2+γT(11)

举例说明:下图公有5个样本,三个叶子结点,计算的目标函数如下,最终的目标是得到最小值:在这里插入图片描述

三 分支

在这里插入图片描述
如何找到最佳的分支切割点,如上图所示。如何选取合适的a点分割,使目标函数值变小。这里是基于式(11),得到分支增益的公式:

G a i n = 1 2 [ G L 2 H L + λ + G R 2 H R + λ + G L 2 + G R 2 H L + H R + λ ] − γ (12) Gain = \frac{1}{2}[\frac{G_L^2}{H_L +\lambda} + \frac{G_R^2}{H_R +\lambda} + \frac{G_L^2 + G_R^2}{H_L +H_R +\lambda}] -\gamma\tag {12} Gain=21[HL+λGL2+HR+λGR2+HL+HR+λGL2+GR2]γ(12)

选取是Gain最小的切割点进行分支。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升树的机器学习算法,它在各种机器学习竞赛中表现出色。下面是XGBoost的原理和公式推导: 1. 原理: XGBoost是一种集成学习算法,通过组合多个弱学习器(决策树)来构建一个强学习器。它采用了梯度提升的思想,每一轮迭代都通过拟合前一轮模型的残差来训练新的模型,然后将新模型加入到集成中。 2. 损失函数XGBoost使用了一种特殊的损失函数,称为目标函数目标函数由两部分组成:损失函数和正则化项。常用的损失函数有平方损失函数、逻辑损失函数等。 3. 梯度提升: 在XGBoost中,每个决策树都是通过梯度提升来构建的。梯度提升的过程可以简单描述为以下几个步骤: - 初始化模型:将初始预测值设置为常数,通常为训练集样本的平均值。 - 计算残差:计算当前模型对训练集样本的预测值与真实值之间的差异,得到残差。 - 拟合决策树:使用残差作为目标变量,拟合一个决策树模型。 - 更新模型:将新的决策树模型加入到集成中,并更新模型的预测值。 - 重复以上步骤,直到达到预定的迭代次数或满足停止条件。 4. 正则化: 为了防止过拟合,XGBoost引入了正则化项。正则化项由两部分组成:树的复杂度和叶子节点权重的L1或L2正则化。通过控制正则化参数,可以平衡模型的复杂度和拟合能力。 5. 公式推导XGBoost公式推导涉及到目标函数、损失函数、正则化项等,具体推导过程较为复杂。你可以参考XGBoost的论文《XGBoost: A Scalable Tree Boosting System》中的相关推导部分,详细了解公式推导的细节。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值