Sklearn调优之网格搜索与随机搜索原理详细分析

 更新时间:2023年02月11日 15:12:27   作者:Laurence Geng  
这篇文章主要介绍了Sklearn调优之网格搜索与随机搜索原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

前言

超参调优是“模型调优”(Model Tuning)阶段最主要的工作,是直接影响模型最终效果的关键步骤,然而,超参调优本身却是一项非常低级且枯燥的工作,因为它的策略就是:不断变换参数值,一轮一轮地去“试”,直到找出结果最好的一组参数。显然,这个过程是可以通过编程封装成自动化的工作,而不是靠蛮力手动去一遍一遍的测试。为此,Sklearn提供了多种(自动化)超参调优方法(官方文档),其中网格搜索(Grid Search)和随机搜索(Randomized Search)是最基础也是最常用的两个:

方法名称对应类/函数官方文档
网格搜索(Grid Search)sklearn.model_selection.GridSearchCV文档链接
随机搜索(Randomized Search)sklearn.model_selection.RandomizedSearchCV文档链接

对应类/函数的后缀CV是Cross-Validation的意思,因为它们每尝试一种超参组合时,都会使用Cross-Validation进行效果评估,所以调用它们时也都需要显式指定cv参数,即:验证的轮次(K-Fold的份数)。

网格搜索(Grid Search)

网格搜索(Grid Search)的逻辑其实非常简单,就是由开发者针对每个超参设定多个值去尝试,找出效果最好的那个,由于超参会有很多个,而每一个超参又有多个尝试值,所以就变成了一个“排列组合”问题。例如我们想针对两个超参进行调优,第一个超参设置了2个尝试值,第二个超参设置了3个尝试值,则超参设置总共会有 2 × 3 = 6 种组合,理论上模型要被训练6次,如果再加上交叉验证的轮次参数cv,假设cv=3,则总得的训练次数将变为:6 × 3 = 18 次。以下是《Hands-On ML, 2nd Edition》一书中提供的GridSearchCV示例代码:

from sklearn.model_selection import GridSearchCV
param_grid = [
    {'n_estimators': [3, 10, 30], 'max_features': [2, 4, 6, 8]},
    {'bootstrap': [False], 'n_estimators': [3, 10], 'max_features': [2, 3, 4]},
]
forest_reg = RandomForestRegressor()
grid_search = GridSearchCV(forest_reg, param_grid, cv=5,
                           scoring='neg_mean_squared_error',
                           return_train_score=True)
grid_search.fit(housing_prepared, housing_labels)

在这份示例代码中,作者提供针对bootstrap、n_estimators和max_features三个超参,给出了两套参数设定:

第一套:{'n_estimators': [3, 10, 30], 'max_features': [2, 4, 6, 8]} 总计:3 × 4 = 12 种组合

第二套:{'bootstrap': [False], 'n_estimators': [3, 10], 'max_features': [2, 3, 4]} 总计:1 × 2 × 3 = 6 种组合

合在一起一共:12 + 6 = 18 种组合,加上交叉验证设定cv=5,所以最终将训练 18 × 5 = 90 次!这里我们可以看到param_grid是一个list,里面每一个元素是一个dict,一个dict就代表了一套参数设定,每套参数设定根据赋值情况又会产生多种参数组合。其实上面两套组合也可以用下面的一套设定覆盖:

param_grid = [
    {'bootstrap': [True, False], 'n_estimators': [3, 10, 30], 'max_features': [2, 3, 4, 6, 8]}
]

但在此情况下,总的训练次数将会变为:(2 × 3 × 5) × 5 = 150 次。由此可见,Sklearn这种允许设定多套参数的设计(即一个list下可配置多个dict)还是有可取之处,会方便开发人员更具经验设定最有希望的取值集合,减少训练次数。

随机搜索(Randomized Search)

网格搜索适用于参数组合数比较少的情况,当参数组合大到一定程度后,模型训练所占用的资源和持续时间将会超用户的可接受范围,此时往往就要改用随机搜索(Randomized Search)了。随机搜索的工作原理和网格搜索其实差不多,都是“暴力尝试”,不同之处在于:网格搜索的参数取值集合是用户设定的,而随机搜索的参数取值则是指定好区间(最大值和最小值)由随机数发生器随机生成的,而想要生成多少种组合是可以设置的。以下是《Hands-On ML, 2nd Edition》一书中提供的RandomizedSearchCV示例代码:

from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
param_distribs = {
        'n_estimators': randint(low=1, high=200),
        'max_features': randint(low=1, high=8),
    }
forest_reg = RandomForestRegressor(random_state=42)
rnd_search = RandomizedSearchCV(forest_reg, param_distributions=param_distribs,
                                n_iter=10, cv=5, scoring='neg_mean_squared_error', random_state=42)
rnd_search.fit(housing_prepared, housing_labels)

在这份代码中,作者针对n_estimators和max_features两个超参分别设定了 1 ~ 200 和 1 ~ 8 的取值区间,然后通过设定参数n_iter=10将参数组合数设定为10,当然,叠加上交叉验证cv=5后,实际的训练就是 5 × 10 = 50 次了。

到此这篇关于Sklearn调优之网格搜索与随机搜索原理详细分析的文章就介绍到这了,更多相关Sklearn网格搜索与随机搜索内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现的防DDoS脚本

    python实现的防DDoS脚本

    实现原理是,查询netstat的连接数,同IP超过一定连接的用iptables封禁一定时间,自动封禁,自动解封。
    2011-02-02
  • python (logging) 日志按日期、大小回滚的操作

    python (logging) 日志按日期、大小回滚的操作

    这篇文章主要介绍了python (logging) 日志按日期、大小回滚的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • python异常的传递知识点总结

    python异常的传递知识点总结

    在本篇文章里小编给大家整理的是一篇关于python异常的传递知识点总结,有兴趣的朋友们可以学习下。
    2021-06-06
  • 日常整理python执行系统命令的常见方法(全)

    日常整理python执行系统命令的常见方法(全)

    本文是小编日常整理的些关于python执行系统命令常见的方法,比较全面,特此通过脚本之家这个平台把此篇文章分享给大家供大家参考
    2015-10-10
  • Python报错TypeError: ‘dict‘ object is not iterable的解决方法

    Python报错TypeError: ‘dict‘ object is not&

    在Python开发的旅程中,报错信息就像是一个个路障,阻碍着我们前进的步伐,而“TypeError: ‘dict’ object is not iterable”这个报错,常常让开发者们陷入困惑,那么,这个报错究竟是怎么产生的呢?又该如何有效地解决它呢?让我们一起深入探讨,找到解决问题的方法
    2024-10-10
  • python实现翻转棋游戏(othello)

    python实现翻转棋游戏(othello)

    这篇文章主要为大家详细介绍了python实现翻转棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Python导入父文件夹中模块并读取当前文件夹内的资源

    Python导入父文件夹中模块并读取当前文件夹内的资源

    这篇文章主要给大家介绍了关于Python导入父文件夹中模块并读取当前文件夹内资源的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Python 自制简单版《我的世界》的详细过程

    Python 自制简单版《我的世界》的详细过程

    这篇文章主要介绍了教你用 Python 自制简单版《我的世界》,接下来,我们就带你运行这个项目,并对这个开源的小游戏做一下简单的更改,让它变成“你的”世界
    2021-11-11
  • Python实现的特征提取操作示例

    Python实现的特征提取操作示例

    这篇文章主要介绍了Python实现的特征提取操作,涉及Python基于sklearn库的变量特征提取相关操作技巧,需要的朋友可以参考下
    2018-12-12
  • Python中的一些陷阱与技巧小结

    Python中的一些陷阱与技巧小结

    这篇文章主要介绍了Python中的一些陷阱与技巧小结,包括生成器等高级用法,和Python2.x与3版本换代带来的兼容性问题等,需要的朋友可以参考下
    2015-07-07

最新评论