Loading [MathJax]/jax/output/HTML-CSS/jax.js

ML——XGBoost-推导过程

XGBoost,全称: Extreme Gradient Boosting


概述

  • CART回归树是XGBoost的基分类器

XGBoost模型推导(假设回归树的结构确定)

模型F的加法定义:

F(x;w)=Kk=0fk(x;wk)

  • 其中, x为输入样本, fk为分类回归树,可以是分类回归树空间中的任意一棵树, wk是树fk的参数

定义损失函数

Lt=ni=1l(yi,ˆyti)+Ω(ft)=ni=1l(yi,ˆyt1i+ft(xi))+γT+12λTj=1w2j

  • Lt: 第 t 轮迭代的损失函数
  • l(yi,ˆyti) 表示单个样本的损失函数定义
  • ˆyti=ˆyt1i+ft(xi) 表示第 txi 样本的预测值
    • 加法模型: 第 t 轮预测值 = 第 t1 轮预测值 + 第 t 棵(轮)决策树的预测值
  • Ω(ft) 表示正则项
    • n 表示样本的个数
    • T 表示叶子结点的个数
    • wj 表示叶节点分数, 即任意样本落到第 t 棵(轮)决策树的第 j 叶子结点时的预测值(可称为第 t 棵(轮)决策树的第 j 叶子结点的预测值)
    • γλ都是正则项参数

t 轮训练的目标

  • 找到一个最优的分类器 ft(x), 满足
    ft(x)=argmaxft(x)Lt=argmaxft(x)(ni=1l(yi,ˆyti)+Ω(ft))=argmaxft(x)(ni=1l(yi,ˆyt1i+ft(xi))+γT+12λTj=1w2j)

最小化损失函数推导

损失函数二阶泰勒展开

  • 回忆传统泰勒展开:
    f(x)=f(x0)+f(x0)(xx0)+f(x0)2!(xx0)2++f(n)(x0)n!(xx0)n=n=0f(n)x0n!(xx0)n

  • 二阶泰勒展开公式
    f(x+Δx)f(x)+f(x)Δx+12f(x)Δx2

  • 在我们的场景中,令

    • x=ˆyt1i
    • Δx=ft(xi)
  • 则有对单个样本能得到
    l(yi,ˆyt1i+ft(xi))l(yi,ˆyt1i)+l(yi,ˆyt1i)ft(xi)+12l(yi,ˆyt1i)f2t(xi)

    • l(yi,ˆyt1i)l(yi,ˆyi)ˆyi 的一阶导数在 ˆyi=ˆyt1i 处的值
    • l(yi,ˆyt1i)l(yi,ˆyi)ˆyi 的二阶导数在 ˆyi=ˆyt1i 处的值
  • 我们第 t 轮的目标是找到一个最优的分类器 ft(x)最小化损失函数 Lt
    Ltni=1(l(yi,ˆyt1i)+l(yi,ˆyt1i)ft(xi)+12l(yi,ˆyt1i)f2t(xi))+γT+12λTj=1w2j

  • 显然上面式子中的 l(yi,ˆyt1i)ft(xi) 无关,可以移除,于是有
    Ltni=1(l(yi,ˆyt1i)ft(xi)+12l(yi,ˆyt1i)f2t(xi))+γT+12λTj=1w2j

  • 令:

    • gi=l(yi,ˆyt1i)l(yi,ˆyi)ˆyi 的一阶导数在 ˆyi=ˆyt1i 处的值
    • hi=l(yi,ˆyt1i)l(yi,ˆyi)ˆyi 的二阶导数在 ˆyi=ˆyt1i 处的值
  • 则有:
    Ltni=1(gift(xi)+12hif2t(xi))+γT+12λTj=1w2j

  • 做一个重要的转换:
    ft(xi)=wj,s.t. xiIj

    • 上面的式子前半部分成立的条件是 xi 落在叶子结点 j
    • 我们将条件xi 落在叶子结点 j 上表示为  xiIj
  • 于是: 我们可以将前面对样本的累加变成对叶子结点的累加
    LtTj=1((iIjgi)wj+12(iIjhi)w2j)+γT+12λTj=1w2jTj=1((iIjgi)wj+12(iIjhi+λ)w2j)+γT

  • 令:

    • Gj=iIjgi
    • Hj=iIjhi
  • 则有
    LtTj=1(Gjwj+12(Hj+λ)w2j)+γT

  • Ltwj 求偏导有
    Ltwj=Gj+(Hj+λ)wj

  • 令导数 Ltwj=0 可得
    wj=GjHj+λ

  • 同时
    Ltmin(Lt)Tj=1(Gj(GjHj+λ)+12(Hj+λ)(GjHj+λ)2)+γT12Tj=1(G2jHj+λ)+γT

  • 目标函数的计算示例: 目标分数越小越好

结论

  • t 轮回归树的结构确定后,我们得到的最优叶节点分数与结构无关 wj=GjHj+λ
  • 最小损失与第 t 轮回归树的结构的复杂度(叶节点数量)相关
  • 我们还需要确定第 t 轮回归树的结构

回归树的结构确定

普通决策树树结构的确定

ID3
  • 最大化信息增益来选择分裂特征
C4.5
  • 最大化信息增益比来选择分裂特征
CART
分类树
  • 最小化基尼指数来选择分裂特征
回归树
  • 最小化平方误差来选择分裂特征

XGBoost结点分裂前后的信息增益

  • 信息增益应该与前面的损失函数相关, 损失越小越好
  • 原始损失函数为
    Lt12Tj=1(G2jHj+λ)+γT
  • 显然,要使得损失函数最小,我们需要使得下面的式子最大:
    G2jHj+λ
  • 一个结点分裂后的信息为
    G2LHL+λ+G2RHR+λ
    • 左子树的信息 + 右子树的信息
  • 一个结点分裂前信息为
    (GL+GR)2HL+HR+λ
  • 从而我们定义一个结点分列前后的信息增益为:
    Gain=G2LHL+λ+G2RHR+λ(GL+GR)2HL+HR+λγ
    • Gain 越大说明当前结点的当前分裂方式越好
    • 其中 γ 是一个超参数用于防止过拟合,可以理解为有两层含义:
      • 用于对叶节点数目进行控制
      • 用于增大分裂前后Gain的阈值
      • 事实上 γ 不是凭空来的,开始的定义中 γ 就是L1正则化(叶节点数量)的系数, 这里分裂后叶节点数量多了1个, 我们希望树的叶节点越少越好(模型越简单越好),而这个的信息增益越大越好, 所以减去 γ 值,防止结点分裂得太多
      • 对于每个特征的每个分裂点, γ 值都相同,所以 γ 值对特征和分裂点的选择没有影响,只是影响了某个结点是否能够被分裂(信息增益太小或者为负时我们可以选择不分裂)

XGBoost树节点分裂

精确分裂算法
  • 单个叶节点精确计算信息增益分裂流程(特征和特征分裂取值的选择, 假设一共m个特征)
近似分裂算法
  • 将每个特征的取值划分为多个分位点
  • 每次考察特征时值考察分位点,减少计算复杂度
  • 其他的步骤与前面的精确分裂算法相同,包括分数计算和选择最大分数等
分桶策略与GBDT的不同
  • 传统的GBDT分桶时每个样本的权重都是相同的
  • XGBoost中每个样本的权重为损失函数在该样本点的二阶导数(对不同的样本,计算得到的损失函数的二阶导数是不同的), 这里优点AdaBoost的思想,重点关注某些样本的感觉
  • 这里影响的是划分点的位置(我们划分划分点[桶]时都是均匀划分样本到桶里面,当不同样本的权重不同时,每个桶里面的样本数量可能会不同)
  • 下图是一个示例
  • 详细推导解释,为什么选择损失函数在当前样本的二阶导数作为权重?
    Ltni=1(gift(xi)+12hif2t(xi))+γT+12λTj=1w2jni=112hi(2gihift(xi)+f2t(xi))+γT+12λTj=1w2jni=112hi(ft(xi)gihi)2+ni=1(g2i2hi2gift(xi))+γT+12λTj=1w2j
    • 上面的式子中第二项在原文中用constant来表示,可以被看成某种正则项
    • 第一项是一个平方误差表达式,样本 xi 对应的输出值为 gihi, 而样本权重就是 hi
    • 权重代表概率,概率越大说明该点出现的次数或者该点附近的值出现的次数就越多.
  • XGBoost分桶流程
    • [待更新]

XGBoost整棵树分裂流程

  • 初始化f0(x)
  • for t=1 to M:
    • 计算损失函数对每个训练样本点的一阶导数 gi ,二阶导数 hi
    • 递归对叶子节点运用树分裂算法生成一颗决策树 ft(x),
      • (这一步包括叶子节点的分数 wj 也都确定下来)
      • (这一步可以使用近似分裂算法加快训练速度)
    • 把新生成的决策树加入到模型中, ˆyt=ˆyt1+fm(x)

传统GDBT与XGBoost的比较