XGBoost完全调参指南(Python)

花了三四天学习XGBoost,这篇文章教会了我如何调参。我把文章的主要内容作翻译和摘录,也算是为XGboost中文社区贡献一份资源。

前言

XGBoost中的算法已经成为了许多数据科学家的终极武器了!这是一个内部实现高度复杂的算法,在处理各种不规范的数据时有强大的表现。

(由于DMLC已经将代码和文档不断完善)利用XGBoost建立一个模型是简单的,但是因为它使用了众多参数,所以提升它的预测效果是比较有难度的。其中调参是重要的一步,但仍然有很多现实的挑战——哪些参数是我们需要调整的?每个参数的最佳值又应该是多少呢?

因此,这篇文章最适合刚刚接触XGBoost的人,我们将会了解到调整参数的步骤,获得一些有关XGBoost的新理解。本文使用的语言是Python.

简介

XGBoost(eXtreme Gradient Boosting)是一些梯度提升算法的先进实现。另外一篇文章《GBM完全调参指南(in Python)》能帮助你理解Boosting这一模型提升技术以及GBM调参的步骤。同时,你能了解GBM中参数的内涵。

XGBoost的优势

正则化

  • XGBoost在标准的GBM实现中增加了正则化,从而能有效避免过拟合

并行计算

  • XGBoost实现了并行计算,实在是太快了!(众所周知,Boosting依赖串行序列已有的计算结果,如何并行化呢?看这里
  • XGBoost同时支持Hadoop分布式版本的实现

灵活性高

  • XGBoost允许代码家自定义优化目标函数和评价标准(指标/函数)
  • 这使得模型能够获得更多生命力和自由度,你可以任意发挥想象去定义上述函数

能处理缺失值

  • XGBoost内置了一套对缺失值进行处理的方法,并提供接口
  • 使用者必须提供一个与现有取值都不相同的特殊值来代替缺失值。默认是-999. 如果每个节点都有缺失值,XGBoost会采取特殊的处理,尝试学习哪个路径是更好的选择

树剪枝

  • GBM模型的停止条件是当节点继续分列时不能减少损失。这是一种贪心的策略
  • XGBoost通过指定参数max_depth限制最大的分裂次数(深度),停止分裂的条件是分裂不能带来正增益

内置交叉验证CV

  • XGBoost允许使用者在每次迭代都进行一次交叉验证。因此,很容易在一次实验中直接得到最佳的迭代次数
  • 而GBM只能进行参数网格搜索来测试有限的取值,进而确定最佳迭代次数

模型的继续训练

  • 使用者能继续从上一次模型的结束位置开始进一步的训练,这在某些具体应用场景中非常有优势
  • GBM的sklearn实现也有类似的功能(即将模型保存至硬盘)

XGBoost中的三类参数

General Parameters

  1. booster
    根据你的需要选择每一轮迭代中的模型类型,默认情况是gbtree, 另外一种是gblinear. 多数情况下,前者的表现优于后者。
  2. silent
    默认为0,将会在运行代码过程中打印提示信息。有助于你探索和理解XGBoost.在使用命令行环境时,建议设置为1.
  3. nthread
    默认为最大CPU核数。算法会自动检测可用的最大核数,此时解锁并行计算。这将会占用几乎CPU的所有计算资源(以尽快计算出结果)。

Booster Parameters

  1. eta
    默认取值为0.3,类似于GBM的学习率,每一步都以此系数来缩小权重,使得模型的学习更加稳健,泛化能力更强。在调参之后,典型的取值为0.01-0.2. 这是经验规律。

  2. min_child_weight
    默认是1,对应于在一个叶子节点中,样本的最小权重和。这是停止条件。类似于GBM中的min_child_leaf,但这里是权重和,GBM中是最小样本数。主要是用于限制模型拟合离群值,合适的值通常避免欠拟合或过拟合。

  3. max_depth
    默认是6,用于控制模型过拟合。典型取值是3-10.

  4. max_leaf_nodes
    一棵树的允许的最大叶子节点数。如果是二叉树,这实际上和树的深度有关。

  5. gamma
    默认是0,每一次尝试拆分节点时,必须使得损失函数下降一个大于gamma的数值,才能够被模型接受这次拆分。如果自定义了不同的损失函数,可以尝试调大gamma值,使得模型更加保守。

  6. subsample
    默认是1,这与GBM中的参数类似,在训练一棵树时,将按subsample的比例随机抽取样本作为输入。它同样是一个用于防止过拟合的参数。典型取值是0.5-1.

  7. colsample_bytree
    默认是1,类似subsample,在训练一棵树时,按colsample_bytree的比例随机抽取某些特征进行训练。

  8. lambda
    默认是1,L2正则化项的权重,类似岭回归。

  9. alpha
    默认为0, L1正则化项,类似Lasso回归。在特征维度非常高时比较适用。

Learning Task Parameters

  1. objective
    默认是reg:linear,这将指定你的损失函数。常用的值有binary:logistic, multi:softmax, multi:softprob.

  2. eval_metric
    默认值随objective的具体情况而改变。常见的有:

  • rmse(root mean square error)
  • mae(mean absolute error)
  • logloss(negative log-likelihood)
  • error(Binary classification error rate)
  • merror(Multiclass classification error rate)
  • mlogloss(Multiclass logloss)
  • auc(Area under the curve)
  1. seed
    默认是0,随机种子数。
打赏作者一个苹果