(十六)GBDT与xgboost

本文详细介绍了GBDT和XGBoost的工作原理,包括泰勒公式、梯度下降法和牛顿法等内容,并深入探讨了XGBoost的模型函数形式、目标函数、正则项及其在函数空间中的优化策略。

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

GBDT与xgboost

1. 泰勒公式

  • 定义:泰勒公式是一个用函数在某点的信息描述其附近取值的公式。 局部有效性

  • 基本形式f(x) = n=0f(n)(x0)n!(xx0)nf(x) = ∑n=0∞f(n)(x0)n!(x−x0)n

    • 一阶泰勒展开:f(x)f(x0)+f(x0)(xx0)f(x)≈f(x0)+f′(x0)(x−x0)
    • 二阶泰勒展开:f(x)f(x0)+f(x0)(xx0)+f′′(x0)(xx0)22f(x)≈f(x0)+f′(x0)(x−x0)+f″(x0)(x−x0)22
    • 迭代形式:假设 xt=xt1+Δxxt=xt−1+Δx,将 f(xt)f(xt)xt1xt−1 处进行泰勒展开:
      f(xt)=f(xt1+Δx)f(xt1)+f(xt1)Δx+f′′(xt1)Δx22(1)(2)(1)f(xt)=f(xt−1+Δx)(2)≈f(xt−1)+f′(xt−1)Δx+f″(xt−1)Δx22

2. 梯度下降法(Gradient Descend Method)

  在机器学习任务中, 需要最小化损失函数 L(θ)L(θ), 其中 θθ 是要求解的模型参数。 梯度下降法常用来求解这种无约束最优化问题, 它是一种迭代方法: 选取初值 θ0θ0, 不断迭代, 更新 θθ 的值, 进行损失函数的极小化。

  • 迭代公式θ=θt1+Δθθ=θt−1+Δθ
  • L(θt)L(θt)θt1θt−1 处进行一阶泰勒展开:

    L(θt)=L(θt1+Δθ)L(θt1)+L(θt1)Δθ(3)(4)(3)L(θt)=L(θt−1+Δθ)(4)≈L(θt−1)+L′(θt−1)Δθ
  • 要使得 L(θt)<L(θt1)L(θt)<L(θt−1),可使:Δθ=αL(θt1)Δθ=−αL′(θt−1),则:θt=θt1αL(θt1)θt=θt−1−αL′(θt−1)
    这里 αα 是步长,可通过 line search 确定,但一般直接赋一个小的数。

3. 牛顿法(Newton’s Method)

  • L(θt)L(θt)θt1θt−1 处进行二阶泰勒展开:

    L(θt)=L(θt1+Δθ)L(θt1)+L(θt1)Δθ+L′′(θt1)Δθ22(5)(6)(5)L(θt)=L(θt−1+Δθ)(6)≈L(θt−1)+L′(θt−1)Δθ+L″(θt−1)Δθ22

      为了简化分析过程,假设参数是标量(即 θθ​ 只有一维),则可将一阶和二阶导数分别记为 ggh
    L(θt)L(θt1)+gΔθ+hΔθ22L(θt)≈L(θt−1)+gΔθ+hΔθ22
  • 要使得 L(θt)L(θt) 极小,即让 gΔθ+hΔθ22gΔθ+hΔθ22 极小,可令:(gΔθ+hΔθ22)Δθ=0∂(gΔθ+hΔθ22)∂Δθ=0
    求得 Δθ=ghΔθ=−gh ,故:θt=θt1+Δθ=θt1ghθt=θt−1+Δθ=θt−1−gh
    参数 θθ 推广到向量形式,迭代公式:θt=θt1H1gθt=θt−1−H−1g
    这里 HH 是海森矩阵

4. 从参数空间到函数空间

  • GBDT 在函数空间中利用梯度下降法进行优化
  • XGBoost 在函数空间中用牛顿法进行优化

注:实际上GBDT泛指所有梯度提升树算法, 包括XGBoost, 它也是GBDT的一种变种, 这里为了区分它们, GBDT特指“Greedy Function Approximation: A Gradient Boosting Machine” 里提出的算法, 它只用了一阶导数信息。

GD_to_GB
NM_to_NB

5. Gradient Boosting Tree 算法原理

  • Friedman于论文” Greedy Function Approximation…”中最早提出GBDT
  • 其模型 F 定义为加法模型:

    F(x;w)=t=0Tαtht(x;wt)=t=0Tft(x;wt)F(x;w)=∑t=0Tαtht(x;wt)=∑t=0Tft(x;wt)

      其中, xx 为输入样本, h 为分类回归树, ww 是分类回归树的参数,α 是每棵树的权重。
  • 通过最小化损失函数求解最优模型:

    F=argminFi=0NL(yi,F(xi;w))F∗=argminF∑i=0NL(yi,F(xi;w))

      NP难问题 -> 通过贪心法, 迭代求局部最优解
GBT_A

6. 详解 XGBoost

6.1 模型函数形式

  给定数据集 D={(Xi,yi)}D={(Xi,yi)},XGBoost进行 additive training, 学习K棵树, 采用以下函数对样本进行预测:

yi^=ϕ(Xi)=k=1Kfk(Xi)fkFyi^=ϕ(Xi)=∑k=1Kfk(Xi)fk∈F

  这里 FF 是假设空间,f(x) 是回归树(CART):
F={f(X)=wq(x)}(q:RmT,wRT)F={f(X)=wq(x)}(q:Rm→T,w∈RT)

q(x)q(x) 表示将样本 xx 分到了某个叶子节点上, w 是叶子节点的分数(leaf score),所以 wq(x)wq(x) 表示回归树对样本的预测值
  • 例子:预测一个人是否喜欢电脑游戏
    xgblikegame

  回归树的预测输出是实数分数, 可以用于回归、 分类、 排序等任务中。 对于回归问题, 可以直接作为目标值, 对于分类问题, 需要映射成概率, 比如采用逻辑函数:σ(x)=11+ezσ(x)=11+e−z

6.2 目标函数

  • 参数空间中的目标函数:
    xgbtargetfun
      误差函数可以是square loss, logloss等, 正则项可以是L1正则,L2正则等。

  Ridge Regression(岭回归) :ni=1(yiθTxi)2+λ||θ||2∑i=1n(yi−θTxi)2+λ||θ||2
  LASSO:ni=1(yiθTxi)2+λ||θ||1∑i=1n(yi−θTxi)2+λ||θ||1

6.3 正则项

  • XGBoost的目标函数(函数空间)

    L(ϕ)=il(yi^,yi)+kΩ(fk)L(ϕ)=∑il(yi^,yi)+∑kΩ(fk)

      正则项对每棵回归树的复杂度进行了惩罚
  • 相比原始的GBDT, XGBoost的目标函数多了正则项, 使得学习出来的模型更加不容易过拟合。

  • 有哪些指标可以衡量树的复杂度?
    树的深度, 内部节点个数, 叶子节点个数(T), 叶节点分数(w)…
    XGBoost采用的:
    Ω(f)=γT+12λ||w||2Ω(f)=γT+12λ||w||2

      对叶子节点个数进行惩罚, 相当于在训练过程中做了剪枝

6.4 误差函数的二阶泰勒展开

  • tt 次迭代后, 模型的预测等于前 t1 次的模型预测加上第 tt 棵树的预测:

    yi^(t)=yi^(t1)+ft(xi)

  • 此时目标函数可写作:

    L(t)=inl(yi^(t1)+ft(xi),yi)+Ω(ft)L(t)=∑inl(yi^(t−1)+ft(xi),yi)+Ω(ft)

      公式中 yiyi, yi^(t1)yi^(t−1) 都已知, 模型要学习的只有第 tt 棵树 ft
  • 将误差函数在 yi^(t1)yi^(t−1) 处进行二阶泰勒展开:

    L(t)i=1n[l(yi,y^(t1))+gift(xi)+12hif2t(xi)]+Ω(ft)L(t)≃∑i=1n[l(yi,y^(t−1))+gift(xi)+12hift2(xi)]+Ω(ft)

      公式中,gi=y^(t1)l(yi,y^(t1))hi=2y^(t1)l(yi,y^(t1))gi=∂y^(t−1)l(yi,y^(t−1))hi=∂y^(t−1)2l(yi,y^(t−1))
  • 将公式中的常数项去掉, 得到:

    L˜(t)=i=1n[gift(xi)+12hif2t(xi)]+Ω(ft)L~(t)=∑i=1n[gift(xi)+12hift2(xi)]+Ω(ft)
  • ftftΩ(ft)Ω(ft) 写成树结构的形式, 即把下式代入目标函数中

    f(x)=wq(x)Ω(f)=γT+12λ||w||2f(x)=wq(x)Ω(f)=γT+12λ||w||2
  • 得到:

    L˜(t)=i=1n[gift(xi)+12hif2t(xi)]+Ω(ft)=i=1n[giwq(xi)+12hiw2q(x)]+γT+λ12j=1Tw2j(7)(8)(7)L~(t)=∑i=1n[gift(xi)+12hift2(xi)]+Ω(ft)(8)=∑i=1n[giwq(xi)+12hiwq(x)2]+γT+λ12∑j=1Twj2

      上面第一个 是对样本累加,第二个 是对叶节点累加,如何统一起来呢?
  • 定义每个叶节点 jj 上的样本集合为:Ij={i|q(xi)=j}
    则目标函数可以写成按叶节点累加的形式:

    L˜(t)=j=1T(iIjgi)wj+12(iIjhi+λ)w2j+γT=j=1T[Gjwj+12(Hj+λ)w2j]+γT(9)(10)(9)L~(t)=∑j=1T[(∑i∈Ijgi)wj+12(∑i∈Ijhi+λ)wj2]+γT(10)=∑j=1T[Gjwj+12(Hj+λ)wj2]+γT
  • 如果确定了树的结构(即 q(x)q(x) 确定) , 为了使目标函数最小, 可以令其导数为 0, 解得每个叶节点的最优预测分数为:

    wj= GjHj+λwj∗=− GjHj+λ

      代入目标函数, 得到最小损失为:
    L˜= 12j=1TG2jHj+λ+γTL~∗=− 12∑j=1TGj2Hj+λ+γT

6.5 回归树的学习策略

  • 当回归树的结构确定时, 我们前面已经推导出其最优的叶节点分数以及对应的最小损失值, 问题是怎么确定树的结构?

暴力枚举所有可能的树结构, 选择损失值最小的 - NP难问题
贪心法, 每次尝试分裂一个叶节点, 计算分裂前后的增益, 选择增益最大的

  • 分裂前后的增益怎么计算?
    ID3算法采用信息增益
    C4.5算法采用信息增益比
    CART采用Gini系数
    XGBoost呢?

6.6 XGBoost 的打分函数

L˜= 12j=1TG2jHj+λ+γTL~∗=− 12∑j=1TGj2Hj+λ+γT

G2jHj+λGj2Hj+λ 衡量了每个叶子节点对总体损失的的贡献, 我们希望损失越小越好, 则其值越大越好。
  因此, 对一个叶子节点进行分裂, 分裂前后的增益定义为:
Gain=G2LHL+λ+G2RHR+λ(GL+GR)2HL+HR+λγGain=GL2HL+λ+GR2HR+λ−(GL+GR)2HL+HR+λ−γ

GainGain 的值越大, 分裂后 LL 减小越多。 所以当对一个叶节点分割时, 计算所有候选(feature,value)对应的 gain, 选取 gain 最大的进行分割

6.7 树节点分裂方法(Split Finding)

xgbsuanfa
xgbsuanfa1
xgblizi
xgblizi1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值