xgboost参数和调参技巧

写在前面

对于小样本数据,传统的机器学习方法效果可能会比深度学习好

xgboost参数

XGBoost的参数可以分为三种类型:通用参数booster参数以及学习目标参数

General Parameters

有两种模型可以选择gbtree和gblinear。gbtree使用基于树的模型进行提升计算,gblinear使用线性模型进行提升计算。缺省值为gbtree

取0时表示打印出运行时信息,取1时表示以缄默方式运行,不打印运行时的信息。缺省值为0
建议取0,过程中的输出数据有助于理解模型以及调参。另外实际上我设置其为1也通常无法缄默运行。。

XGBoost运行时的线程数。缺省值是当前系统可以获得的最大线程数
如果你希望以最大速度运行,建议不设置这个参数,模型将自动获得最大线程

size of prediction buffer, normally set to number of training instances. The buffers are used to save the prediction results of last boosting step.

boosting过程中用到的特征维数,设置为特征个数。XGBoost会自动设置,不需要手工设置

Booster Parameters

From xgboost-unity, the bst: prefix is no longer needed for booster parameters. Parameter with or without bst: prefix will be equivalent(i.e. both bst:eta and eta will be valid parameter setting) .

Parameter for Tree Booster

为了防止过拟合,更新过程中用到的收缩步长。在每次提升计算之后,算法会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守。缺省值为0.3
取值范围为:[0,1]
通常最后设置eta为0.01~0.2

minimum loss reduction required to make a further partition on a leaf node of the tree. the larger, the more conservative the algorithm will be.

模型在默认情况下,对于一个节点的划分只有在其loss function 得到结果大于0的情况下才进行,而- gamma 给定了所需的最低loss function的值

gamma值使得算法更conservation,且其值依赖于loss function ,在模型中应该进行调参。

树的最大深度。缺省值为6
取值范围为:[1,∞]
指树的最大深度
树的深度越大,则对数据的拟合程度越高(过拟合程度也越高)。即该参数也是控制过拟合
建议通过交叉验证(xgb.cv ) 进行调参
通常取值:3-10

孩子节点中最小的样本权重和。如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束。在现行回归模型中,这个参数是指建立每个模型所需要的最小样本数。该成熟越大算法越

Maximum delta step we allow each tree’s weight estimation to be. If the value is set to 0, it means there is no constraint. If it is set to a positive value, it can help making the update step more conservative. Usually this parameter is not needed, but it might help in logistic regression when class is extremely imbalanced. Set it to value of 1-10 might help control the update

取值范围为:[0,∞]

如果取值为0,那么意味着无限制。如果取为正数,则其使得xgboost更新过程更加保守。
通常不需要设置这个值,但在使用logistics 回归时,若类别极度不平衡,则调整该参数可能有效果

用于训练模型的子样本占整个样本集合的比例。如果设置为0.5则意味着XGBoost将随机的从整个样本集合中抽取出50%的子样本建立树模型,这能够防止过拟合。

取值范围为:(0,1]

在建立树时对特征随机采样的比例。缺省值为1

取值范围:(0,1]

决定每次节点划分时子样例的比例
通常不使用,因为subsample和colsample_bytree已经可以起到相同的作用了

A value greater than 0 can be used in case of high class imbalance as it helps in faster convergence.

大于0的取值可以处理类别不平衡的情况。帮助模型更快收敛

Parameter for Linear Booster

L2 正则的惩罚系数
用于处理XGBoost的正则化部分。通常不使用,但可以用来降低过拟合

L1 正则的惩罚系数

当数据维度极高时可以使用,使得算法运行更快。

在偏置上的L2正则。缺省值为0(在L1上没有偏置项的正则,因为L1时偏置不重要)

Task Parameters

the initial prediction score of all instances, global bias

- eval_metric [ default according to objective ]

校验数据所需要的评价指标,不同的目标函数将会有缺省的评价指标(rmse for regression, and error for classification, mean average precision for ranking)

用户可以添加多种评价指标,对于Python用户要以list传递参数对给程序,而不是map参数list参数不会覆盖’eval_metric’

The choices are listed below:

- rmse: root mean square error

- logloss: negative log-likelihood

- error: Binary classification error rate. It is calculated as #(wrong cases)/#(all cases). For the predictions, the evaluation will regard the instances with prediction value larger than 0.5 as positive instances, and the others as negative instances.

- merror: Multiclass classification error rate. It is calculated as #(wrong cases)/#(all cases).

- mlogloss: Multiclass logloss

- auc: Area under the curve for ranking evaluation.

- ndcg:Normalized Discounted Cumulative Gain

- map:Mean average precision

- ndcg@n,map@n: n can be assigned as an integer to cut off the top positions in the lists for evaluation.

- ndcg-,map-,ndcg@n-,map@n-: In XGBoost, NDCG and MAP will evaluate the score of a list without any positive samples as 1. By adding - in the evaluation metric XGBoost will evaluate these score as 0 to be consistent under some conditions.

training repeatively

随机数的种子。缺省值为0
可以用于产生可重复的结果(每次取一样的seed即可得到相同的随机划分)

Console Parameters

The following parameters are only used in the console version of xgboost
* use_buffer [ default=1 ]

是否为输入创建二进制的缓存文件,缓存文件可以加速计算。缺省值为1
* num_round

boosting迭代计算次数。
* data

输入数据的路径
* test:data

测试数据的路径
* save_period [default=0]

表示保存第i*save_period次迭代的模型。例如save_period=10表示每隔10迭代计算XGBoost将会保存中间结果,设置为0表示每次计算的模型都要保持。

输出模型所保存的路径。

feature map, used for dump model

name of model dump file

预测结果文件

输出预测的边界,而不是转换后的概率

sklearn参数对比

如果你比较习惯scikit-learn的参数形式,那么XGBoost的Python 版本也提供了sklearn形式的接口 XGBClassifier。它使用sklearn形式的参数命名方式,对应关系如下:

eta –> learning_rate
lambda –> reg_lambda
alpha –> reg_alpha

调参核心

调参方向:处理过拟合(过拟合和准确率往往相反)

XGBoost扩展

Xgbfi特征重要性分析

用于训练好的 xgboost 模型分析对应特征的重要性,当然你也可以使用 fmap 来观察

XGBoost调参技巧(实战经验)

本节整理的是本人在实战过程中调惨的经验, 第一个建议就是在没有弄清每个参数对训练效果的影响时不要使用太多的参数, 刚开始就使用简单的一两个参数就好, 我在使用过程中刚开始只是指定objective和num_class即可.

max_depth

max_depth对模型的收敛效果很明显, 刚开始我在调参过程中max_depth的值设置的比较小([0-6]之间选取), test-merror下降比较慢, 就算num_boost_round设置很大test-error也下降的很慢, 而且到一定程度就不下降了,值也比较大. 后来将max_depth设置到[20-30]之间后, train-error和test-error的值衰减的很快.所以在设置max_depth的时候不要局限在某一个范围之内.

learning_rate

有的人为了提高训练进度, 刚开始就将learning_rate设置的比较小0.001,或者更小. 刚开始我在使用的过程也是, 但是训练的非常慢, 主要是对收敛效果没有很大的作用, 所以就暂时将这个参数去掉. 训练完成之后,将mlogloss-mean曲线和merror—mean曲线画出来之后发现一个问题, 如下图所示, 我们只看test loss 和test merror, 你会发现test loss的曲线开始上翘, 而test merror的曲线还是在减小的, 理论上从train和test loss来看模型可能出现过拟合了, 但是为什么error会一致变小呢, 后面我尝试调整learning_rate的大小, 速率往小了调, 这时候我发现 test merror下降的速度变快, 而且可以更小

xgboost-1

在我调整learning_rate之后, 训练结果如下: 图像上可以看出,设定learning_rate起到了效果, 而且设定在其他参数不变的情况的, 模型并没有过拟合.

xgboost-2

参考文献

贝叶斯优化调参实战(随机森林,lgbm波士顿房价)

Bayesian Optimization of XGBoost Parameters

BayesBoost

贝叶斯优化在XGBoost及随机森林中的使用

Hyperparameter tuning

sklearn、XGBoost、LightGBM的文档阅读小记(转载)

xgboost使用技巧

XGBoost-Python完全调参指南-介绍篇

XGBoost-Python完全调参指南-参数解释篇

XGboost数据比赛实战之调参篇(完整流程)

XGBoost python调参示例

XGBoost参数调优完全指南(附Python代码)

xgboost原理及应用--转

xgboost 调参经验

xgboost使用调参

XGBoost 与 Boosted Tree

机器学习系列(11)_Python中Gradient Boosting Machine(GBM)调参方法详解

机器学习时代的三大神器

xgboost原理及应用--转

GBDT、XGBoost、LightGBM 的使用及参数调优

机器学习---xgboost与lightgbm效果比较(2)

XGBoost调参demo(Python)

lightgbm,xgboost,gbdt的区别与联系

Python超参数自动搜索模块GridSearchCV上手
Sklearn中的CV与KFold详解

史上最详细的XGBoost实战

XGBoost特征重要性以及CV

XGBoost 核心数据结构和API(速查表)

XGBoost和LightGBM的参数以及调参

实战微博互动预测之三_xgboost答疑解惑