2021-02-10 Xgboost超参调整
2021-02-10 本文已影响0人
春生阁
引言:
在前期数据分析和特征处理过程中,采用逻辑回归可以得到较为稳定的模型(详见 数据分析思路和代码实现)。但考虑到对变量分箱方法影响效果,其次变量未必都是线性化(采用WOE替换可以消化),最后线性模型的上限未知。在决策树的升级版本Xgboost,在Kaggle比赛中曾经屡战奇功的模型工具提上议程。
Xgboost是以树的形式进行计算,比较容易过拟合,而且除了像线性模型一些比较好用的参数可以调整之外,树木的个数、叶子节点、树深度、学习率等等都会影响模型的最终效果,听起来就超级复杂,就称它们为超参吧。
sklearn中有GridSearchCV来实现逐步调参测试最佳效果,就因为又困难(理论)又简单(代码),从而让自己没有前行,期望寻找到自己的搜索方式。
基础环境
恰巧前两天MacBook Pro主板出现问题,修理主板后Python环境重新更新,更新的过程记录下:
机器配置:MacBook Pro(13-inch,2019,1.4 GHz 四核 Intel Core i5)
系统配置:macOS Big Sur 版本 11.2
目标:搭建基础xgboost环境
步骤:
- 安装Anaconda
1.1. 考虑到Python虚拟环境配置较为麻烦,用Anaconda安装和资料方便且打包,对用户友好这一点还是很吸引人
1.2. 下载地址:anaconda,当前选择版本Anaconda Navigator 1.10.0- 安装JupyterLab
2.1. 默认Anaconda安装后,已有jupyterlab,版本2.2.6
2.2. 额外升级版本(pip install jupyterlab==3),版本3.0.7
2.3. 相关文档:jupyterlab- 安装sklearn
3.1. 基础包-sklearn:pip3 install scikit-learn,版本0.24.1- 安装xgboost
4.1. 基础包-xgboost:pip3 install xgboost,版本 1.3.3
4.2. 安装mac安装环境-brew:/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
4.2.1. 在我的环境中无法访问地址,从而从github下载包手工安装:
4.2.2. git clone https://github.com/Homebrew/install.git
4.2.3. cd install
4.2.4. /bin/bash install.sh
4.3. 安装依赖包-libomp:brew install libomp测试验证
5.1. 在conda环境中执行 python
5.2. import xgboost
安装成功后验证
参数调整方案
- 单参逐步调整:
1.1. n_estimators > learning_rate > max_depth > min_child_weight > gamma > subsample > colsample_bytree > reg_lambda/reg_alpha - 组合式参数调整:
2.1. 存在 n_estimators / max_depth 有明显的相关性好像影响 - 其他解决方案:
参数调整结论
Q&A
- xgboost提供的n_estimators,通过fit后的模型是否会继承,如何产生效果?(参数early_stopping_rounds存在更好结果的可能性)
-
测试方案:
1.early_stopping_rounds不设置,对比n_estimators=100和120的区别;
2.early_stopping_rounds设置为30,对比n_estimators=100和120的区别 - 测试结果:
n_estinators | ||
---|---|---|
early_stopping_rounds | 100 | 120 |
None | Train: 0.9699 Test : 0.5917 |
Train: 0.9794 Test : 0.5920 |
30 | Train: 0.7865 Test : 0.5963 |
Train: 0.7865 Test : 0.5963 |
-
测试结论:
当【n_estimators】大于最佳取值时,使用参数【early_stopping_rounds】模型会在最佳点停止(观察early_stopping_rounds=30的两个数据可得)。
当【early_stopping_rounds】未设置,模型会持续跑完【n_estimators】对应的值后,跑批时间长且效果会下降(观察early_stopping_rounds=None的两个数据可得)。
建议,设置较大【n_estimators】同时配置【early_stopping_rounds】=30,保持模型最佳效果。
- xgboost提供DMatrix数据结构,是否能提高性能,提高程度如何?
-
测试方案:
1.对比sklearn下的GridSearchCV和xgboost.cv的耗时情况; -
测试结果:
xgboost.cv VS sklearn.GridSearchCV -
测试结论:
使用xgboost.DMatrix数据结构确实能提速,大约20%左右。而GridSearchCV有并行能力,开启4线程时反而提速70%。
建议,使用GridSearchCV执行寻参任务。