(十六)GBDT与xgboost

GBDT与xgboost

1. 泰勒公式

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

  • 基本形式 f ( x )   =   n = 0 f ( n ) ( x 0 ) n ! ( x x 0 ) n

    • 一阶泰勒展开: f ( x ) f ( x 0 ) + f ( x 0 ) ( x x 0 )
    • 二阶泰勒展开: f ( x ) f ( x 0 ) + f ( x 0 ) ( x x 0 ) + f ( x 0 ) ( x x 0 ) 2 2
    • 迭代形式:假设 x t = x t 1 + Δ x ,将 f ( x t ) x t 1 处进行泰勒展开:
      (1) f ( x t ) = f ( x t 1 + Δ x ) (2) f ( x t 1 ) + f ( x t 1 ) Δ x + f ( x t 1 ) Δ x 2 2

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

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

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

    (3) L ( θ t ) = L ( θ t 1 + Δ θ ) (4) L ( θ t 1 ) + L ( θ t 1 ) Δ θ

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

3. 牛顿法(Newton’s Method)

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

    (5) L ( θ t ) = L ( θ t 1 + Δ θ ) (6) L ( θ t 1 ) + L ( θ t 1 ) Δ θ + L ( θ t 1 ) Δ θ 2 2

      为了简化分析过程,假设参数是标量(即 θ 只有一维),则可将一阶和二阶导数分别记为 g h
    L ( θ t ) L ( θ t 1 ) + g Δ θ + h Δ θ 2 2

  • 要使得 L ( θ t ) 极小,即让 g Δ θ + h Δ θ 2 2 极小,可令: ( g Δ θ + h Δ θ 2 2 ) Δ θ = 0
    求得 Δ θ = g h ,故: θ t = θ t 1 + Δ θ = θ t 1 g h
    参数 θ 推广到向量形式,迭代公式: θ t = θ t 1 H 1 g
    这里 H 是海森矩阵

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 = 0 T α t h t ( x ; w t ) = t = 0 T f t ( x ; w t )

      其中, x 为输入样本, h 为分类回归树, w 是分类回归树的参数, α 是每棵树的权重。

  • 通过最小化损失函数求解最优模型:

    F = a r g min F i = 0 N L ( y i , F ( x i ; w ) )

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

GBT_A

6. 详解 XGBoost

6.1 模型函数形式

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

y i ^ = ϕ ( X i ) = k = 1 K f k ( X i ) f k F

  这里 F 是假设空间, f ( x ) 是回归树(CART):
F = { f ( X ) = w q ( x ) } ( q : R m T , w R T )

q ( x ) 表示将样本 x 分到了某个叶子节点上, w 是叶子节点的分数(leaf score),所以 w q ( x ) 表示回归树对样本的预测值

  • 例子:预测一个人是否喜欢电脑游戏
    xgblikegame

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

6.2 目标函数

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

  Ridge Regression(岭回归) : i = 1 n ( y i θ T x i ) 2 + λ | | θ | | 2
  LASSO: i = 1 n ( y i θ T x i ) 2 + λ | | θ | | 1

6.3 正则项

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

    L ( ϕ ) = i l ( y i ^ , y i ) + k Ω ( f k )

      正则项对每棵回归树的复杂度进行了惩罚

  • 相比原始的GBDT, XGBoost的目标函数多了正则项, 使得学习出来的模型更加不容易过拟合。

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

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

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

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

    y i ^ ( t ) = y i ^ ( t 1 ) + f t ( x i )

  • 此时目标函数可写作:

    L ( t ) = i n l ( y i ^ ( t 1 ) + f t ( x i ) , y i ) + Ω ( f t )

      公式中 y i , y i ^ ( t 1 ) 都已知, 模型要学习的只有第 t 棵树 f t

  • 将误差函数在 y i ^ ( t 1 ) 处进行二阶泰勒展开:

    L ( t ) i = 1 n [ l ( y i , y ^ ( t 1 ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t )

      公式中, g i = y ^ ( t 1 ) l ( y i , y ^ ( t 1 ) ) h i = y ^ ( t 1 ) 2 l ( y i , y ^ ( t 1 ) )

  • 将公式中的常数项去掉, 得到:

    L ~ ( t ) = i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t )

  • f t Ω ( f t ) 写成树结构的形式, 即把下式代入目标函数中

    f ( x ) = w q ( x ) Ω ( f ) = γ T + 1 2 λ | | w | | 2

  • 得到:

    (7) L ~ ( t ) = i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) (8) = i = 1 n [ g i w q ( x i ) + 1 2 h i w q ( x ) 2 ] + γ T + λ 1 2 j = 1 T w j 2

      上面第一个 是对样本累加,第二个 是对叶节点累加,如何统一起来呢?

  • 定义每个叶节点 j 上的样本集合为: I j = { i | q ( x i ) = j }
    则目标函数可以写成按叶节点累加的形式:

    (9) L ~ ( t ) = j = 1 T [ ( i I j g i ) w j + 1 2 ( i I j h i + λ ) w j 2 ] + γ T (10) = j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T

  • 如果确定了树的结构(即 q ( x ) 确定) , 为了使目标函数最小, 可以令其导数为 0, 解得每个叶节点的最优预测分数为:

    w j =   G j H j + λ

      代入目标函数, 得到最小损失为:
    L ~ =   1 2 j = 1 T G j 2 H j + λ + γ T

6.5 回归树的学习策略

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

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

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

6.6 XGBoost 的打分函数

L ~ =   1 2 j = 1 T G j 2 H j + λ + γ T

G j 2 H j + λ 衡量了每个叶子节点对总体损失的的贡献, 我们希望损失越小越好, 则其值越大越好。
  因此, 对一个叶子节点进行分裂, 分裂前后的增益定义为:
G a i n = G L 2 H L + λ + G R 2 H R + λ ( G L + G R ) 2 H L + H R + λ γ

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

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

xgbsuanfa
xgbsuanfa1
xgblizi
xgblizi1

猜你喜欢

转载自blog.csdn.net/LintaoD/article/details/81674447