XGBoost中参数调整的完整指南

XGBoost(eXtreme Gradient Boosting)是梯度增强算法的高级实现,已成为许多数据科学家的终极武器。它是一种高度复杂的算法,功能强大,足以处理各种不规则的数据。

使用XGBoost构建模型很容易。但是,使用XGBoost改进模型很困难。该算法使用多个参数。要改进模型,必须进行参数调整。

本文最适合XGBoost新手。在本文中,我们将学习参数调整的技巧以及有关XGBoost的一些有用信息。

目录

  1. XGBoost优势
  2. 了解XGBoost参数
  3. 调整参数(带示例)

1. XGBoost优势

  1. 正则:
    • 标准GBM(Gradient Boosting Machine)的实现正则化处理,而XGBoost有L1和L2正则项,因此XGBoost有助于减少模型过度拟合。
    • 实际上,XGBoost也被称为“ 正则化增强 ”技术。
  2. 并行处理:
    • XGBoost实现了并行处理,与GBM相比速度更快
    • 我们知道提升是顺序进程,那么XGBoost如何进行并行化呢?我们知道每棵树只能在前一棵树之后构建,那么是什么阻止我们使用所有cores构建树?请查看此链接以进一步探索。
    • XGBoost还支持在Hadoop上实现。
  3. 高灵活性
    • XGBoost允许用户自定义优化目标和评估标准
    • 这为模型增加了一个全新的维度,我们可以做的事情没有限制。
  4. 处理缺失值
    • XGBoost有一个内置的例程来处理缺失值。
    • 用户需要提供与其他观察值不同的值,并将其作为参数传递。XGBoost会尝试不同的事情,因为它在每个节点上遇到缺失值,并了解将来丢失值的路径。
  5. 树修剪:
    • 当GBM在分割中遇到负损失时,它将停止分割节点。因此,GBM更像是一种贪婪的算法
    • 另一方面,XGBoost分割到指定的max_depth,然后开始向后修剪树并删除没有正增益的分裂。
    • 另一个优点是,有时负损失的分割表示-2后可能会出现正损失+10的分裂。GBM会在遇到-2时停止。但是XGBoost会更深入,它会看到分裂的+8和两者的综合效果。
  6. 内置交叉验证
    • XGBoost允许用户在每次增强过程的迭代运行交叉验证,因此很容易在一次运行中获得精确的最佳增强迭代次数。
    • 这与GBM不同,GBM必须运行网格搜索,并且只能测试有限的值。
  7. 继续使用现有模型
    • 用户可以从上一次运行的最后一次迭代开始训练XGBoost模型。这在某些特定应用中具有显着优势。
    • sklearn的GBM实现也具有此功能。

2. XGBoost参数

XGBoost作者将整体参数分为3类:

  1. 通用的参数:  指导整体功能
  2. 助推器参数:  指导每个步骤的个体助推器(树/回归)
  3. 学习任务参数:  指导执行的优化

这里给出GBM的类比,可阅读本文 。

通用参数

这些定义了XGBoost的整体功能。

  1. booster [default=gbtree]
    • 选择要在每次迭代时运行的模型类型。它有2个选项:
      • gbtree:基于树的模型
      • gblinear:线性模型
  2. silent [default=0]:
    • 设置为1,表示静音模式被激活,即不会打印正在运行的消息。
    • 该参数设置为0时,会一边运行一边打印消息,可能有助于理解模型。
  3. nthread [默认为未设置的最大线程数]
    • 这用于并行处理,应输入系统中的cores的数量
    • 如果您希望在所有核心上运行,则不应输入值,并且算法将自动检测

还有2个参数由XGBoost自动设置

助推器参数

虽然有两种类型的助推器,但在这里只考虑 树助推器,因为它总是优于线性助力器,因此后者很少使用。

  1. eta [默认值= 0.3]
    • 类似于GBM中的学习率
    • 通过缩小每一步的权重,使模型更加健壮
    • 典型的最终使用值:0.01-0.2
  2. min_child_weight [default = 1]
    • 定义子树所需观察的最小权重总和。
    • 这类似于GBM中的min_child_leaf,但并不完全相同。这指的是观察的最小“权重总和”,而GBM具有最小“观察数”。
    • 用于控制过度配合。较高的值会阻止模型学习关系,这种关系可能对为树选择的特定样本高度特定。
    • 太高的值会导致欠拟合,因此应使用CV进行调整。
  3. max_depth [default = 6]
    • 树的最大深度,与GBM相同。
    • 用于控制过度拟合,因为更高的深度将允许模型学习非常特定于特定样本的关系。
    • 应该使用CV进行调整。
    • 典型值:3-10
  4. max_leaf_nodes
    • 树中终端节点或叶子的最大数量。
    • 可以代替max_depth。由于创建了二叉树,因此深度'n'将产生最多2 ^ n个叶子。
    • 如果已定义,则GBM将忽略max_depth。
  5. gamma [default = 0]
    • 仅当结果分割给出损失函数的正向减少时,才分割节点。Gamma指定进行拆分所需的最小损失减少量。
    • 使算法保守。值可能会根据损耗函数而有所不同,因此应进行调整。
  6. max_delta_step [default = 0]
    • 在最大增量步长中,我们允许每棵树的权重估计。如果该值设置为0,则表示没有约束。如果将其设置为正值,则可以帮助使更新步骤更加保守。
    • 通常不需要此参数,但是当类非常不平衡时,它可能有助于逻辑回归。
    • 这通常不使用,但如果您愿意,可以进一步探索。
  7. subsample [default = 1]
    • 与GBM的子样本相同。表示观察的比例是每棵树的随机样本。
    • 较低的值使算法更加保守并防止过度拟合,但过小的值可能导致不合适。
    • 典型值:0.5-1
  8. colsample_bytree [default = 1]
    • 与GBM中的max_features类似。表示每个树的随机样本列的比例。
    • 典型值:0.5-1
  9. colsample_bylevel [default = 1]
    • 表示每个级别中每个拆分的列的子采样率。
    • 我不经常使用它,因为subsample和colsample_bytree会为你完成这项工作。但如果你有这种感觉,你可以进一步探索。
  10. lambda [default = 1]
    • 关于权重的L2正则项(类似于岭回归)
    • 这用于处理XGBoost的正则化部分。虽然许多数据科学家不经常使用它,但应该探索减少过度拟合。
  11. alpha [默认= 0]
    • L1正则化项的权重(类似于Lasso回归)
    • 可以在非常高维度的情况下使用,以便算法在实现时运行得更快
  12. scale_pos_weight [default = 1]
    • 在高级别不平衡的情况下,应使用大于0的值,因为它有助于更​​快的收敛。

 

学习任务参数

这些参数用于定义要在每个步骤计算的度量的优化目标。

  1. objective[default = reg:linear]
    • 这定义了要最小化的损失函数。最常用的值是:
      • binary:logistic  logistic回归用于二进制分类,返回预测概率(不是类)
      • multi:softmax   使用softmax目标的softmax -multiclass分类,返回预测类(不是概率)
        • 还需要设置一个额外的  num_class (类数)参数,用于定义唯一类的数量
      • multi:softprob   和softmax一样,但返回属于每个类的每个数据点的预测概率。
  2. eval_metric [默认根据objective参数]
    • 用于验证数据的度量标准。
    • 回归的默认值为rmse,分类的误差为rmse。
    • 典型值为:
      • rmse - 均方根误差
      • mae - 平均绝对误差
      • logloss - 负对数似然
      • error - 二进制分类错误率(0.5阈值)
      • merror - 多类分类错误率
      • mlogloss - 多类logloss
      • auc:  曲线下面积
  3. seed[默认= 0]
    • 随机数种子。
    • 可用于生成可重复的结果,也可用于参数调整。

阅读xgboost指南的以下部分,可以更好地理解参数和代码

  1. XGBoost Parameters (official guide)
  2. XGBoost Demo Codes (xgboost GitHub repository)
  3. Python API Reference (official guide)

未完,待续。。。

本文翻译自【https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/】并在此基础上做一些修改

posted @ 2019-01-11 17:21  XieHS  阅读(1439)  评论(0编辑  收藏  举报