正文
今天来完成任务一的实验九:改变和优化XGBoost模型参数,对比阿里云天池平台线上测试结果。
首先根据实验指导书提供的博客链接进行学习,两个链接中有一个失效了,还有一个可以用:机器学习系列(12)_XGBoost参数调优完全指南(附Python代码)
训练轮数调优
在上一个实验提取的特征所构造的数据集上进行调参,首先调优训练轮数。
1 | def modelfit(alg, dtrain, predictors, useTrainCV=True, cv_folds=5, early_stopping_rounds=50): |
调优的结果为n_estimators=563
,有点出乎我的意料,之前一直都是使用的5000以上的轮次进行训练,没想到调优出来的结果这么低。使用该参数进行训练并提交数据,得到的评测结果为0.7333,在其他参数都不变的情况下相较上一次5000轮训练上升了0.017。
max_depth 和 min_weight 参数调优
接下来对max_depth 和 min_weight 参数调优。
1 | #max_depth 和 min_weight 参数调优 |
输出结果为:1
2
3
4
5
6
7
8
9
10
11
12
13
14[mean: 0.86405, std: 0.01783, params: {'max_depth': 3, 'min_child_weight': 1},
mean: 0.87122, std: 0.00858, params: {'max_depth': 3, 'min_child_weight': 3},
mean: 0.87233, std: 0.00796, params: {'max_depth': 3, 'min_child_weight': 5},
mean: 0.84315, std: 0.04618, params: {'max_depth': 5, 'min_child_weight': 1},
mean: 0.85586, std: 0.02888, params: {'max_depth': 5, 'min_child_weight': 3},
mean: 0.86428, std: 0.01649, params: {'max_depth': 5, 'min_child_weight': 5},
mean: 0.83507, std: 0.04100, params: {'max_depth': 7, 'min_child_weight': 1},
mean: 0.84799, std: 0.02979, params: {'max_depth': 7, 'min_child_weight': 3},
mean: 0.85674, std: 0.02130, params: {'max_depth': 7, 'min_child_weight': 5},
mean: 0.83280, std: 0.03825, params: {'max_depth': 9, 'min_child_weight': 1},
mean: 0.84614, std: 0.02922, params: {'max_depth': 9, 'min_child_weight': 3},
mean: 0.85383, std: 0.02155, params: {'max_depth': 9, 'min_child_weight': 5}]
{'max_depth': 3, 'min_child_weight': 5}
0.8723303890244708
缩小步长和范围继续调参:
1 | param_test2 = { |
输出结果为:
1 | [mean: 0.86872, std: 0.00497, params: {'max_depth': 2, 'min_child_weight': 4}, |
所以max_depth
最优值为3,不过min_child_weight
还要调整范围继续调参:
1 | [mean: 0.87362, std: 0.00682, params: {'min_child_weight': 6}, |
min_child_weight
最优值为14。
再将此值带回原来的模型进行训练,得分下降到了0.7175,此时再次对训练轮数进行优化,结果为2346。
2346轮训练以后,评分又涨到了0.7320。
gamma 参数调优
1 | param_test3 = { |
输出结果为:
1 | [mean: 0.87625, std: 0.00476, params: {'gamma': 0.0}, |
再次调优训练轮数为1916,提交结果为0.7324。
subsample 和 colsample_bytree 参数调优
1 | param_test4 = { |
输出结果为:
1 | [mean: 0.87548, std: 0.00574, params: {'colsample_bytree': 0.6, 'subsample': 0.6}, mean: 0.87438, std: 0.00674, params: {'colsample_bytree': 0.6, 'subsample': 0.7}, |
缩小范围和步长继续优化:
1 | param_test5 = { |
输出结果为:
1 | [mean: 0.87546, std: 0.00545, params: {'colsample_bytree': 0.85, 'subsample': 0.65}, |
从输出结果来看'colsample_bytree': 0.9, 'subsample': 0.7
确实是最好的了。
reg_alpha 参数调优
1 | param_test6 = { |
输出结果为:
1 | [mean: 0.87683, std: 0.00423, params: {'reg_alpha': 1e-05}, |
调整范围继续优化:
1 | [mean: 0.87683, std: 0.00423, params: {'reg_alpha': 1e-06}, |
colsample_bylevel 参数调优
1 | param_test8 = { |
输出结果为:
1 | [mean: 0.87460, std: 0.00497, params: {'colsample_bylevel': 0.6}, |
经过反复测试,得分最高的还是这个参数模型:
1 | params = {'booster': 'gbtree', |
结语
调参实在是一个费心费力的过程,由于电脑配置不是很好跑了整整两天才把所有参数调完。但很多参数调了以后虽然本地auc提高了,但线上测试得分反而降低,得分最高的一个模型参数还是最开始的模型上略微调整得来的。