4种主流超参数调优技术

Wesley13
• 阅读 1077

点击上方“机器学习与生成对抗网络”,关注"星标"

获取有趣、好玩的前沿干货!

4种主流超参数调优技术

作者丨Sivasai Yadav Mudugandla

编辑丨Python遇见机器学习

引言


维基百科上说“超参数优化(optimization)或调优(tuning)是为学习算法选择一组最优超参数的问题”

机器学习工作流中最难的部分之一是为模型寻找最佳的超参数。机器学习模型的性能与超参数直接相关。超参数调优越多,得到的模型就越好。调整超参数真的很难又乏味,更是一门艺术而不是科学。

超参数(Hyper-parameter)

超参数是在建立模型时用来控制算法行为的参数。这些参数不能从正常的训练过程中学习。他们需要在训练模型之前被分配。

4种主流超参数调优技术

Dr.Mukesh Rao的超参数样本清单

目录


1. 传统或手动调参

2. 网格搜索

3. 随机搜索

4. 贝叶斯搜索

1. 传统或手动调参

在传统的调优中,我们通过手动检查随机超参数集来训练算法,并选择最适合我们目标的参数集。

让我们看看代码:

#importing required libraries

缺点:

1. 不能保证得到最佳的参数组合。

2. 这是一种反复试验的方法,因此会消耗更多的时间。

2. 网格搜索

网格搜索是一种基本的超参数调整技术。它类似于手动调优,为网格中指定的所有给定超参数值的每个排列建立模型,并评估和选择最佳模型。考虑上面的例子,它有两个超参数 k_value =[2,3,4,5,6,7,8,9,10] 和 algorithm = [‘auto’ , ’ball_tree’ , ’kd_tree’ , ’brute’],在这种情况下,它总共构建了9 * 4 = 36个不同的模型。

4种主流超参数调优技术

让我们来了解一下 sklearn 的  GridSearchCV 是如何工作的,

from sklearn.model_selection import GridSearchCV

缺点:

由于它尝试每一种超参数组合,并根据交叉验证分数选择最佳组合,这使得 GridsearchCV 极其缓慢。

3. 随机搜索

使用随机搜索代替网格搜索的动机是,在许多情况下,所有的超参数可能并非同等重要。随机搜索从超参数空间中随机选择参数组合,参数按 n_iter 给定的迭代次数进行选择。随机搜索已经被实践证明比网格搜索得到的结果更好。

4种主流超参数调优技术

让我们了解一下 sklearn 的 RandomizedSearchCV 是如何工作的,

from sklearn.model_selection import RandomizedSearchCV

缺点:

随机搜索的问题是它不能保证给出最佳的参数组合。

4. 贝叶斯优化

贝叶斯优化属于一类被称为_sequential model-based optimization_(SMBO)的优化算法。这些算法使用先前对损失 f 的观测,来确定下一个(最佳)点来取样 f。该算法大致可以概括如下。

  1. 使用先前计算过的点 X1: n,计算损失 f 的后验期望值。

  2. 在一个新的点 Xnew取样损失 f ,它最大化了 f 的期望的某些效用函数。该函数指定 f 域的哪些区域是最适合采样的。

重复这些步骤,直到达到某种收敛准则。

4种主流超参数调优技术

让我们用 scikit-optimize 的BayesSearchCV来理解这一点

安装: pip install scikit-optimize

from skopt import BayesSearchCV

实现贝叶斯搜索的另一个类似的库是 bayesian-optimization

安装 : pip install bayesian-optimization

缺点:

在2维或3维搜索空间中,需要十几个样本才能得到一个良好的替代曲面(surrogate surface); 增加搜索空间的维数需要更多的样本。


总结

在找到参数的最佳组合的保证和计算时间之间总是有一个权衡。如果你的超参数空间(超参数个数)非常大,那么使用随机搜索找到超参数的潜在组合,然后使用该局部的网格搜索(超参数的潜在组合)来选择最优特征。

References

1. https://thuijskens.github.io/2016/12/29/bayesian-optimisation/

2. https://scikit-optimize.github.io/stable/modules/generated/skopt.BayesSearchCV.html

3. https://github.com/fmfn/BayesianOptimization

原文:https://medium.com/swlh/4-hyper-parameter-tuning-techniques-924cb188d199

猜您喜欢:附下载 | 《Python进阶》中文版附下载 | 经典《Think Python》中文版附下载 | 《Pytorch模型训练实用教程》附下载 | 最新2020李沐《动手学深度学习》附下载 | 《可解释的机器学习》中文版附下载 |《TensorFlow 2.0 深度学习算法实战》附下载 | 超100篇!CVPR 2020最全GAN论文梳理汇总!附下载 |《计算机视觉中的数学方法》分享

本文分享自微信公众号 - 机器学习与生成对抗网络(AI_bryant8)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Stella981 Stella981
2年前
200的大额人民币即将面世?央行:Yes!
点击上方蓝字关注我们!(https://oscimg.oschina.net/oscnet/2a1c2ac00bf54458a78c48a6c2e547d5.png)点击上方“印象python”,选择“星标”公众号重磅干货,第一时间送达!!(
Stella981 Stella981
2年前
CVPR2020之多码先验GAN:预训练模型如何使用?
点击上方“机器学习与生成对抗网络”,关注"星标"获取有趣、好玩的前沿干货!!(https://oscimg.oschina.net/oscnet/116fcfc73c348e1268768195687e7eead9d.jpg)今天分享一篇港中文周博磊老师组的工作。!(https://oscimg.oschina.net/o
可莉 可莉
2年前
200的大额人民币即将面世?央行:Yes!
点击上方蓝字关注我们!(https://oscimg.oschina.net/oscnet/2a1c2ac00bf54458a78c48a6c2e547d5.png)点击上方“印象python”,选择“星标”公众号重磅干货,第一时间送达!!(
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这