花了三四天学习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
- booster
根据你的需要选择每一轮迭代中的模型类型,默认情况是gbtree, 另外一种是gblinear. 多数情况下,前者的表现优于后者。 - silent
默认为0,将会在运行代码过程中打印提示信息。有助于你探索和理解XGBoost.在使用命令行环境时,建议设置为1. - nthread
默认为最大CPU核数。算法会自动检测可用的最大核数,此时解锁并行计算。这将会占用几乎CPU的所有计算资源(以尽快计算出结果)。
Booster Parameters
eta
默认取值为0.3,类似于GBM的学习率,每一步都以此系数来缩小权重,使得模型的学习更加稳健,泛化能力更强。在调参之后,典型的取值为0.01-0.2. 这是经验规律。min_child_weight
默认是1,对应于在一个叶子节点中,样本的最小权重和。这是停止条件。类似于GBM中的min_child_leaf,但这里是权重和,GBM中是最小样本数。主要是用于限制模型拟合离群值,合适的值通常避免欠拟合或过拟合。max_depth
默认是6,用于控制模型过拟合。典型取值是3-10.max_leaf_nodes
一棵树的允许的最大叶子节点数。如果是二叉树,这实际上和树的深度有关。gamma
默认是0,每一次尝试拆分节点时,必须使得损失函数下降一个大于gamma的数值,才能够被模型接受这次拆分。如果自定义了不同的损失函数,可以尝试调大gamma值,使得模型更加保守。subsample
默认是1,这与GBM中的参数类似,在训练一棵树时,将按subsample的比例随机抽取样本作为输入。它同样是一个用于防止过拟合的参数。典型取值是0.5-1.colsample_bytree
默认是1,类似subsample,在训练一棵树时,按colsample_bytree的比例随机抽取某些特征进行训练。lambda
默认是1,L2正则化项的权重,类似岭回归。alpha
默认为0, L1正则化项,类似Lasso回归。在特征维度非常高时比较适用。
Learning Task Parameters
objective
默认是reg:linear,这将指定你的损失函数。常用的值有binary:logistic, multi:softmax, multi:softprob.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)
- seed
默认是0,随机种子数。