2021-02-10 Xgboost超参调整

引言:

在前期数据分析和特征处理过程中,采用逻辑回归可以得到较为稳定的模型(详见 数据分析思路和代码实现)。但考虑到对变量分箱方法影响效果,其次变量未必都是线性化(采用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环境
步骤:

  1. 安装Anaconda
    1.1. 考虑到Python虚拟环境配置较为麻烦,用Anaconda安装和资料方便且打包,对用户友好这一点还是很吸引人
    1.2. 下载地址:anaconda,当前选择版本Anaconda Navigator 1.10.0
  2. 安装JupyterLab
    2.1. 默认Anaconda安装后,已有jupyterlab,版本2.2.6
    2.2. 额外升级版本(pip install jupyterlab==3),版本3.0.7
    2.3. 相关文档:jupyterlab
  3. 安装sklearn
    3.1. 基础包-sklearn:pip3 install scikit-learn,版本0.24.1
  4. 安装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. 测试验证
    5.1. 在conda环境中执行 python
    5.2. import xgboost


    安装成功后验证

参数调整方案

  1. 单参逐步调整:
    1.1. n_estimators > learning_rate > max_depth > min_child_weight > gamma > subsample > colsample_bytree > reg_lambda/reg_alpha
  2. 组合式参数调整:
    2.1. 存在 n_estimators / max_depth 有明显的相关性好像影响
  3. 其他解决方案:

参数调整结论

Q&A

  1. 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,保持模型最佳效果。
  1. xgboost提供DMatrix数据结构,是否能提高性能,提高程度如何?
  • 测试方案:
    1.对比sklearn下的GridSearchCV和xgboost.cv的耗时情况;
  • 测试结果:
    xgboost.cv VS sklearn.GridSearchCV
  • 测试结论:
    使用xgboost.DMatrix数据结构确实能提速,大约20%左右。而GridSearchCV有并行能力,开启4线程时反而提速70%。
    建议,使用GridSearchCV执行寻参任务。

参数含义说明(注明自我理解)

你可能感兴趣的:(2021-02-10 Xgboost超参调整)