XGboost

2024-07-30 13:29:41 浏览数 (1)

学习目标

  1. 知道XGBoost原理
  2. 了解XGBoost API的常用参数

1. XGBoost 原理

XGBoost 是对梯度提升算法的改进:

  1. 求解损失函数极值时使用泰勒二阶展开
  2. 另外在损失函数中加入了正则化项
  3. XGB 自创一个树节点分裂指标。这个分裂指标就是从损失函数推导出来的。XGB 分裂树时考虑到了树的复杂度。

我们在前面已经知道,构建最优模型的一般方法是 最小化训练数据的损失函数

预测值和真实值经过某个函数计算出损失,并求解所有样本的平均损失,并且使得损失最小。

上面的式子称为 经验风险最小化 ,如果仅仅追求经验风险最小化,那么训练得到的模型复杂度较高,很容易出现过拟合。因此,为了降低模型的复杂度,常采用下式:

上面的式子称为 结构风险最小化 ,结构风险最小化的模型往往对训练数据以及未知的测试数据都有较好的预测 。

XGBoost的决策树生成是结构风险最小化的结果。

1.1 目标函数确定和树的复杂度介绍

XGBoost(Extreme Gradient Boosting)是对梯度提升树的改进,并且在损失函数中加入了正则化项。

目标函数的第一项表示整个强学习器的损失,第二部分表示强学习器中 K 个弱学习器的复杂度。

xgboost 每一个弱学习器的复杂度主要从两个方面来考量:

  1. γT 中的 T 表示一棵树的叶子结点数量,γ 是对该项的调节系数
  2. λ||w||2 中的 w 表示叶子结点输出值组成的向量,λ 是对该项的调节系数
1.2 XGBoost目标函数的推导

上公式中,第一部分是从强学习器的角度去衡量,第二项也是衡量整个强学习器的复杂·程度。

1.3 泰勒公式展开

我们直接对目标函数求解比较困难,通过泰勒展开将目标函数换一种近似的表示方式。接下来对  yi(t-1)  进行泰勒二阶展开,得到如下近似表示的公式:

其中,gi 和 hi的分别为损失函数的一阶导、二阶导:

1.4 化简目标函数

我们观察目标函数,发现以下两项都是常数项,我们可以将其去掉。

为什么说是常数项呢?这是因为当前学习器之前的学习器都已经训练完了,可以直接通过样本得出结果。化简之后的结果为:

我们再将 Ω(f<sub>t</sub>) 展开,结果如下:

这个公式中只有 ft,该公式可以理解为,当前这棵树如何构建能够降低损失。

1.5 问题再次转换

我们再次理解下这个公式表示的含义:

  1. gi 表示每个样本的一阶导,hi 表示每个样本的二阶导
  2. ft(xi) 表示样本的预测值
  3. T 表示叶子结点的数目
  4. ||w||2 由叶子结点值组成向量的模

现在,我们发现公式的各个部分考虑的角度不同,有的从样本角度来看,例如:ft(xi) ,有的从叶子结点的角度来看,例如:T、||w||2。我们下面就要将其转换为相同角度的问题,这样方便进一步合并项、化简公式。我们统一将其转换为从叶子角度的问题:

例如:10 个样本,落在 D 结点 3 个样本,落在 E 结点 2 个样本,落在 F 结点 2 个样本,落在 G 结点 3 个样本

  1. D 结点计算: w1 * gi1 w1 * gi2 w1 * gi3 = (gi1 gi2 gi3) * w1
  2. E 结点计算: w2 * gi4 w2 * gi5 = (gi4 gi5) * w2
  3. F 结点计算: w3 * gi6 w3 * gi6 = (gi6 gi7) * w3
  4. G 节点计算:w4 * gi8 w4 * gi9 w4 * gi10 = (gi8 gi9 gi10) * w4

gi ft(xi) 表示样本的预测值,我们将其转换为如下形式:

  • wj 表示第 j 个叶子结点的值
  • gi 表示每个样本的一阶导 hift2(xi) 转换从叶子结点的问题,如下:

λ||w||2 由于本身就是从叶子角度来看,我们将其转换一种表示形式:

我们重新梳理下整理后的公式,如下:

上面的公式太复杂了,我们令:

Gi 表示样本的一阶导之和,Hi 表示样本的二阶导之和,当确定损失函数时,就可以通过计算得到结果。 现在我们的公式变为:

1.6 对叶子结点求导 此时,公式可以看作是关于叶子结点 w 的一元二次函数,我们可以对 w 求导并令其等于 0,可得到 w 的最优值,将其代入到公式中,即可再次化简上面的公式。

将 w<sub>j</sub> 代入到公式中,即可得到:

1.7 XGBoost的回归树构建方法 该公式也叫做打分函数 (scoring function),它可以从树的损失函数、树的复杂度两个角度来衡量一棵树的优劣。 这个公式,我们怎么用呢? 当我们构建树时,可以用来选择树的最佳划分点。

其过程如下:

  1. 对树中的每个叶子结点尝试进行分裂
  2. 计算分裂前 - 分裂后的分数:
    1. 如果分数 > 0,则分裂之后分树的结构损失更小,我们会考虑此次分裂
    2. 如果分数 < 0,说明分裂后的分数比分裂前的分数大,此时不建议分裂
  3. 当触发以下条件时停止分裂:
    1. 达到最大深度
    2. 叶子结点样本数量低于某个阈值
    3. 等等...

2. XGBoost API 2.1 通用参数 booster [缺省值=gbtree]

  1. gbtree:使用树模型
  2. gblinear:使用线性模型
  3. dart:使用树模型,主要多了 Dropout

silent [缺省值=0]

  • 设置为 0 打印运行信息
  • 设置为 1不打印运行信息

nthread [缺省值=设置为最大可能的线程数]

  • 并行运行的线程数,输入的参数应该 <= 系统的CPU核心数
  • 若是没有设置算法会检测将其设置为 CPU 的全部核心数

> 下面的两个参数不需要设置,使用默认的就好了 num_pbuffer [xgboost自动设置,不需要用户设置]

  • 预测结果缓存大小,通常设置为训练实例的个数。该缓存用于保存最后 boosting 操作的预测结果

num_feature [xgboost自动设置,不需要用户设置]

  • 在boosting中使用特征的维度,设置为特征的最大维度

2.2 Booster 参数 2.2.1 Parameters for Tree Booster eta [缺省值=0.3,别名:learning_rate]

  • 更新中减少的步长来防止过拟合
  • 每次 boosting 之后,可以直接获得新的特征权值,这样可以使得 boosting 更加鲁棒
  • 范围: [0,1]

gamma [缺省值=0,别名: min_split_loss](分裂最小loss)

  • gamma 指定了节点分裂所需的最小损失函数下降值
  • 这个参数的值和损失函数息息相关,所以是需要调整的
  • 范围: [0, ∞]

max_depth [缺省值=6]

  • 这个值为树的最大深度。 这个值也是用来避免过拟合的
  • max_depth越大,模型会学到更具体更局部的样本
  • 设置为 0 代表没有限制
  • 范围: [0 ,∞]

min_child_weight [缺省值=1]

  • 当它的值较大时,可以避免模型学习到局部的特殊样本
  • 如果这个值过高,会导致欠拟合
  • 范围: [0,∞]

subsample [缺省值=1]

  • 这个参数控制对于每棵树,随机采样的比例
  • 如果这个值设置得过大,它可能会导致过拟合
  • 如果这个值设置得过小,它可能会导致欠拟合
  • 典型值:0.5-1,0.5 代表平均采样,防止过拟合
  • 范围: (0,1]

colsample_bytree [缺省值=1]

  • 控制每棵随机特征采样的比例
  • 范围: (0,1],典型值:0.5-1

colsample_bylevel [缺省值=1]

  • 用来控制树每一次分裂时对特征的采样的比例
  • 范围: (0,1]

alpha [缺省值=0,别名: reg_alpha]

  • 权重的L1正则化项。(和Lasso regression类似)。 可以应用在很高维度的情况下,使得算法的速度更快

scale_pos_weight[缺省值=1]

  • 在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛
  • 通常可以将其设置为负样本的数目与正样本数目的比值

2.2.2 Parameters for Linear Booster > linear booster一般很少用到。 lambda [缺省值=0,别称: reg_lambda]

  • L2 正则化惩罚系数,增加该值会使得模型更加保守

alpha [缺省值=0,别称: reg_alpha]

  • L1正则化惩罚系数,增加该值会使得模型更加保守。

lambda_bias [缺省值=0,别称: reg_lambda_bias]

  • 偏置上的 L2 正则化(没有在L1上加偏置,因为并不重要)

2.3 学习目标参数 objective [缺省值=reg:linear]

  1. reg:linear:线性回归
  2. reg:logistic: 逻辑回归
  3. binary:logistic:二分类逻辑回归,输出为概率
  4. multi:softmax:使用softmax的多分类器,返回预测的类别(不是概率)。在这种情况下,你还需要多设一个参数:num_class(类别数目)
  5. multi:softprob:和multi:softmax参数一样,但是返回的是每个数据属于各个类别的概率。

eval_metric [缺省值=通过目标函数选择] 验证集 可供选择的如下所示:

  1. rmse: 均方根误差
  2. mae: 平均绝对值误差
  3. logloss: 负对数似然函数值
  4. error:其值通过错误分类数目与全部分类数目比值得到。对于预测,预测值大于0.5被认为是正类,其它归为负类。
  5. error@t: 不同的划分阈值可以通过 ‘t’进行设置
  6. merror: 多分类错误率,计算公式为(wrong cases)/(all cases)
  7. mlogloss: 多分类log损失
  8. auc: 曲线下的面积

seed [缺省值=0]

  • 随机数的种子,设置它可以复现随机数据的结果,也可以用于调整参数

3. 小结

  1. XGBoost 算法是对 GBDT 的改进,在损失函数中增加了正则化项,综合考虑了模型的结构风险
  2. XGBoost 使用自己的分裂增益计算方法来构建强学习器

0 人点赞