接下来介绍下一位参赛选手——GridSearchCV(),它要做的事情就跟其名字一样,进行网络搜索,也就是一个一个地遍历,不能放过任何一个可能的参数组合。就像之前说的组合有多少种,就全部走一遍,使用方法与 RandomizedSearchCV()基本一致,只不过名字不同罢了。

from sklearn.model_selection import GridSearchCV# 网络搜索
param_grid = {'bootstrap': [True],'max_depth': [8,10,12],'max_features': ['auto'],'min_samples_leaf': [2,3, 4, 5,6],'min_samples_split': [3, 5, 7],'n_estimators': [800, 900, 1000, 1200]
}# 选择基本算法模型
rf = RandomForestRegressor()# 网络搜索
grid_search = GridSearchCV(estimator = rf, param_grid = param_grid, scoring = 'neg_mean_absolute_error', cv = 3, n_jobs = -1, verbose = 2)
# 执行搜索
grid_search.fit(train_features, train_labels)

大数据预测实战-随机森林预测实战(四)-模型微调-编程知识网

grid_search.best_params_

大数据预测实战-随机森林预测实战(四)-模型微调-编程知识网

在使用网络搜索的时候,值得注意的就是参数空间的选择,是按照经验值还是猜测选择参数呢?之前已经有了一组随机参数选择的结果,相当于已经在大范围的参数空间中得到了大致的方向,接下来的网络搜索也应当基于前面的实验继续进行,把随机参数选择的结果当作接下来进行网络搜索的依据。相当于此时已经掌握了犯罪嫌疑人(最佳模型参数)的大致活动区域,要展开地毯式的抓捕了。

当数据量较大,没办法直接进行网络搜索调参时,也可以考虑交替使用随机和网络搜索策略来简化所需对比实验的次数。

best_grid = grid_search.best_estimator_
evaluate(best_grid, test_features, test_labels)平均气温误差. 3.6838716214
Accuracy = 93.78%

另一组参赛选手 Grid Search

经过再调整之后,算法模型的效果又有了一点提升,虽然只是一小点,但是把每一小步累计在一起就是一个大成绩。在用网络搜索的时候,如果参数空间较大,则遍历的次数太多,通常并不把所有的可能性都放进去,而是分成不同的小组分别执行,就像是抓捕工作很难地毯式全部搜索到,但是分成几个小组守在重要路口也是可以的。

下面再来看看另外一组网络搜索的参赛选手,相当于每一组候选参数的侧重点会略微有些不同∶

param_grid = {'bootstrap': [True],'max_depth': [12, 15, None],'max_features': [3, 4,'auto'],'min_samples_leaf': [5, 6, 7],'min_samples_split': [7,10,13],'n_estimators': [900, 1000, 1200]
}# 选择算法模型
rf = RandomForestRegressor()# 继续寻找
grid_search_ad = GridSearchCV(estimator = rf, param_grid = param_grid, scoring = 'neg_mean_absolute_error', cv = 3, n_jobs = -1, verbose = 2)grid_search_ad.fit(train_features, train_labels)

大数据预测实战-随机森林预测实战(四)-模型微调-编程知识网

grid_search_ad.best_params_

大数据预测实战-随机森林预测实战(四)-模型微调-编程知识网

best_grid_ad = grid_search_ad.best_estimator_
evaluate(best_grid_ad, test_features, test_labels)平均气温误差. 3.6540146079078952
Accuracy = 93.83%

看起来第二组选手要比第一组强一些,经过了这一番折腾之后我们可以把最终选定的所有参数都列出来了,93.83%相当于我们到此最优的一个结果了

最终模型

print('最终模型参数:\n')
pprint(best_grid_ad.get_params())

大数据预测实战-随机森林预测实战(四)-模型微调-编程知识网
来总结一下我们的调参任务吧:

  1. 参数空间是非常重要的,它会对结果产生决定性影响,所以在开始任务之前,得选择大致一个合适区间,可以参考一些相同任务论文的经验值。
  2. 随机搜索可以更节约时间,尤其是在任务开始阶段,我们并不知道哪一个参数在哪一个位置效果能更好,这样我们可以把参数间隔设置的更大一些,先用随机搜索确定一些大致位置。
  3. 网络搜索相当于地毯式搜索了,当我们得到了大致位置之后,想在这里寻找到最优参数的时候就派上用场了,可以把随机和网络搜索当做一套组合拳,搭配使用。
  4. 最后调参的方法其实还有很多的,比如贝叶斯优化,这个还是蛮有意思的,跟大家简单说一下,想一想我们之前的调参方式,是不是每一个都是独立的进行不会对之后的结果产生任何影响,贝叶斯优化的基本思想在于每一个优化都是在不断积累经验,这样我会慢慢得到最终的解应当在的位置,相当于前一步结果会对后面产生影响了,如果大家对贝叶斯优化感兴趣,可以参考下Hyperopt工具包,用起来也很简便:
    大数据预测实战-随机森林预测实战(四)-模型微调-编程知识网

项目总结

在基于随机森林的气温预测实战任务中,将整体模块分为3部分进行解读,首先讲解了基本随机森林模型构建与可视化方法。然后,对比数据量和特征个数对结果的影响,建议在任务开始阶段就尽可能多地选择数据特征和处理方案,方便后续进行对比实验和分析。最后,调参过程也是机器学习中必不可少的一部分,可以根据业务需求和实际数据量选择合适的策略。接下来趁热打铁,拿起Notebook代码,自己动手实战一番吧。