xgboost 正则项_XGBoost 算法原理详解(1)——目标函数、梯度提升、严格的贪心优化算法...

按照惯例,我们先约定一些符号性的内容

训练集

每个样本的特征维度为 \(m\),样本总量为 \(n\)。

模型

模型用函数 \(\phi(x)\) 表示,\(\hat{y}i\) 是测试样本使用模型推理的结果。可以看到,模型是多个函数的叠加,这里的每个 \(f_k\) 都是决策树空间 \(\mathcal{F}\) 上的一个实例。\(\mathcal{F}\) 可以表示为 \(\mathcal{F} = {w{q(x)}}\),其中 \(q(x): R^m \rightarrow {1..T}, w \in R^T\)。解释一下:\(q(x)\) 是决策树的结构,它把 \(x\) 传输到树的 \(T\) 个叶节点之一,\(w\) 存储了每个叶节点的值,是一个\(T\) 维向量,通过 \(w_{q(x)}\) 得到样本的预测值,所以 \(w_{q(x)}\) 实际上就是一颗决策树。

正则化的目标函数

其中第一项为损失项, \(l(y, \hat{y})\) 是通用的损失函数,在实际应用中可以按情况选择合适的形式,把它开放出来后便可作为用户自定义的一个选项。第二项为正则项

这里的 \(\gamma\) 和 \(\lambda\) 是正则化系数,它们分别控制树的叶节点数量和节点值的总体大小,从而控制树的复杂度,防止过拟合。

梯度提升树

提升算法的基本思想是想办法在现有模型的基础上,迭代地对模型进行优化,它的思路是使用训练数据去拟合当前模型的预测残差,现在将模型写成迭代的形式

这里的 \(\phi_{t-1}(x)\) 是当前模型,\(f_t(x)\) 是本轮需要得到的决策树,于是本轮迭代的目标函数就为

这可以看作是对 \(f_t\) 的泛函,对 \(l\) 二阶泰勒展开

其中\(g_i = \frac { \partial l(y_i, \hat{y}^{t-1}_i)}{\partial \hat{y}^{t-1}_i} \),\(h_i = \frac { \partial^2 l(y_i, \hat{y}^{t-1}_i)}{\partial (\hat{y}^{t-1}_i)^2} \)。

代入到目标函数后

去掉与 \(f_t\) 无关的常量,优化目标不变

这里的 \(\tilde{L}^{(t)}\) 如下

对于一个样本 \(x_i\),如果它被决策树 \(f_t\) 分配到了第 \(j\) 个叶节点,也就是说 \(q(x_i) = j\),这时 \(f_t(x_i) = w_{q(x_i)} = w_j\),现在对所有样本按叶节点进行分组,定义集合 \(I_j = {i \mid q(x_i) = j}\),即叶节点索引 \(j\) 上的所有样本,那么目标函数又可以写成

上面的转换其实就是把损失对 \(f_t\) 的泛函转换成为 \(w, q\) 的泛函,为了获得最优解,对 \(w_k\) 求偏导,并令其等于 0

再将 \(w^*\)代入 \(\tilde{L}^{(t)}(w, q)\) 得到关于 \(q\) 的泛函

为了简化表达,再定义

于是目标函数又可写成

上式只与 \(q\) 有关,也就是说任意给出一颗决策树,可以利用上式计算本轮迭代的总体损失。通过枚举所有决策树结构,选取令总体损失最小的 \(q\),便完成了本轮优化。

但实际情况下,枚举所有的决策树结构是不可能的,实际上,决策树的优化有一类比较通用的贪心算法,即通过计算分裂增益来寻找最佳的分裂点,比如 ID3 使用信息增益,C4.5 使用信息增益比,那么在这里,其实就有一个现成的分裂增益评价指标,即 \(\tilde{L}\) 在分裂前后的差值。注意,当前情况下我们的树有 \(T\) 个节点,从中任选一个节点进行分裂,假设编号为 \(k\) ,把 \(I_k\) 分成了两个部分 \(I_L\) 和 \(I_R\),那么分裂后的损失为

其中

于是,分裂前后的总体损失增益就为

下面将利用上述形式的损失增益来训练决策树模型。

精确贪心算法

精确的贪心算法严格按照贪心策略,在特征和值两个维度上搜索。算法过程如下

首先设分裂前的节点上的样本集合为 \(I\),样本特征维度等于 \(m\);

初始化:损失增益变量 \(gain = 0\),最佳分裂特征 \(d = 1\),最佳分裂点 \(z = \min(\mathbf{x}_d)\),这里的 \(\mathbf{x}_d\) 是所有样本第 \(d\) 个特征组成的向量;

计算

对于 \(k = 1…m\):

假设在第 \(k\) 个特征上分裂,为了确定在哪个值上分裂,先对第 \(k\) 个特征上的所有值 \({x_{jk}}{j=1}^n\) 进行排序,得到排序后的向量 \({\bar{x}{jk}}_{j=1}^n\);

假设分裂后的两部分样本分别为 \(I_L\) 和 \(I_R\),初始化 \(G_L = 0, H_L = 0\),对于 \(j = 1… n\):

计算

根据 \(G\) 的定义,得到

计算损失增益

当 \(\Delta L > gain\) 时,更新 \(gain = \Delta L, d = k, z = \bar{x}_{jk}\);

使用第 \(d\) 个特征对样本进行分裂,分裂点为 \(z\)。

小结

这一部分主要是推导了XGBoost的梯度提升原理,以及每轮迭代过程中决策树的贪心优化构建算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值