作者 Bunmi Akinremi
我清楚地记得两年前参加的一次机器学习黑客马拉松,当时我正处于数据科学职业生涯的初期。这是由尼日利亚数据科学组织的训练营的资格预审黑客马拉松。
该数据集包含有关某些员工的信息。我必须预测员工是否应该升职。在尝试改进和设计功能几天后,该模型的准确率似乎在 80% 左右波动。
我需要做点什么来提高我在排行榜上的分数。我开始手动调整模型——得到了更好的结果。通过更改参数,移动的准确度提高到 82%(这一移动非常重要,任何参加过黑客马拉松的人都会证明这一点!)。很兴奋,我开始调整其他超参数,但结果并非都那么好。我已经筋疲力尽了,想象一下连续工作 7 个小时来改进模型。挺累的。
我知道GridSearchCV和RandomSearchCV。我尝试了 GridSearchCV 并花了 3 个多小时从我提供的值范围内给我结果。更糟糕的是,GridSearchCV 的结果也不是更好。沮丧,我决定尝试 RandomSearchCV。这带来了一点快乐,我的准确率从 82% 上升到了 86%。
经过大量的试验,没有任何改善,我回到手动调整,看看我能得到什么。到黑客马拉松结束时,我的准确率达到了大约 90%。我希望我知道更快地优化超参数的工具!幸运的是,即使我没有进入前 50 名,我仍然有资格参加训练营。
那是过去。现在,我知道我可以使用一些很好的超参数调整工具,我很高兴与您分享它们。
在开始超调之前,请确保已完成以下操作:
获取基线。您可以使用更小的模型、更少的迭代、默认参数或手动调整的模型来实现这一点。
将您的数据分成训练集、验证集和测试集。
使用大时期的早期停止轮来防止过度拟合。
在训练之前设置完整的模型管道。
现在,我想讨论一些我将在文章中使用的术语:
模型参数——模型参数是您的模型从数据中学习的参数,例如特征、关系等,您无法手动调整(不是特征工程)。
模型超参数——超参数是您可以从模型本身手动调整的那些值,例如学习率、估计器数量、正则化类型等。
优化– 调整超参数以通过使用其中一种优化技术来最小化成本函数的过程。
超参数优化——超参数优化只是搜索以获得最佳超参数集,从而在特定数据集上提供模型的最佳版本。
贝叶斯优化——基于序列模型的优化 (SMBO) 算法的一部分,用于使用前一个实验的结果来改进下一个实验。
超参数采样——只需指定要在超参数空间上使用的参数采样方法。
我不反对使用 GridSearchCV。这是一个不错的选择,只是它确实非常耗时且计算成本高。如果您像我一样,日程繁忙,您一定会找到更好的选择。
更好的选择是 RandomSearch CV,它使用随机超参数值来选择最佳超参数。它比 GridSearchCV 快得多。这里的缺点是,由于它采用随机值,我们不能确定这些值是最佳组合。
但实际上,我什么时候知道我需要进行超参数优化?
作为数据科学家,我们经常犯的错误之一是使用模型的默认参数。根据您使用的默认参数,您可能没有使用模型的最佳版本。
有时,当您的模型过度拟合(在训练集上表现良好而在测试数据集上表现不佳)或欠拟合(在训练数据集上表现不佳而在测试数据集上表现良好)时,优化您的超参数确实会有所帮助。一点点调整就可以产生很大的不同,从 60% 的准确度到 80% 的准确度,甚至更多!
好了,介绍完毕。在本文结束时,您将了解:
顶级的超参数调优工具,
各种开源服务(免费使用)和付费服务,
他们的特点和优势,
他们支持的框架,
如何为您的项目选择最佳工具,
如何将它们添加到您的项目中。
我们将从 TL;DR 下面讨论的所有工具的比较开始。
接下来,我将从一些开源工具开始。每个工具将按以下方式描述:
工具简介,
该工具的核心功能/优势,
关于如何使用该工具的步骤,
有关如何在项目中使用该工具的其他链接。
Ray为构建分布式应用程序提供了一个简单、通用的 API。Tune
是一个 Python 库,用于任意规模的实验执行和超参数调整。Tune 是 Ray 的众多软件包之一。Ray Tune 是一个 Python 库,它通过大规模利用尖端优化算法来加速超参数调整。
为什么要使用 RayTune?
这里有一些特点:
它可以轻松地与许多优化库集成,例如Ax/Botorch和HyperOpt。
可以在不更改代码的情况下进行缩放。
Tune 利用各种尖端优化算法,例如Ax/Botorch、HyperOpt和贝叶斯优化,使您能够透明地扩展它们。
Tune 跨多个 GPU 和多个节点进行并行处理,因此您不必构建自己的分布式系统来加快训练速度。
您可以使用 Tensorboard 等工具自动可视化结果。
它为优化算法提供了一个灵活的接口,您可以用几行代码轻松实现和扩展新的优化算法。
它支持任何机器学习框架,包括 Pytorch、Tensorflow、XGBoost、LIghtGBM、Scikit-Learn 和 Keras。
使用它需要五个简单的步骤(我假设您已经对数据进行了预处理):
安装Tune
pip install tune
选择搜索算法。有很多可供选择。AxSearch、DragonflySearch、HyperOptSearch、OptunaSearch、BayesOptSearch等等。这是可用搜索算法的完整列表。
设置并训练您的模型。
定义搜索空间。
运行并评估您的模型。
无论您是想使用 Tensorflow、Pytorch 还是任何其他框架在您的 ML 项目中实现Tune,都可以使用大量教程。以下是一些要检查的内容:
Ray 的机器学习和强化学习项目。
“超参数调优”来实现上面在 Tensorflow 中列出的步骤。
使用 Keras 和 Ray Tune 进行超参数调整。
Optuna专为机器学习而设计。它是一个黑盒优化器,所以它需要一个目标函数。这个目标函数决定在接下来的试验中在哪里采样,并返回数值(超参数的性能)。它使用不同的算法,例如网格搜索、随机搜索、贝叶斯和进化算法来找到最佳的超参数值。
Optuna其中一些特点是:
高效的采样和修剪算法。
安装简单,要求少。
比 Hyperopt 更易于使用。
使用分布式优化。
您可以使用 Python 语法定义搜索空间,包括条件和循环。
您可以直观地分析优化结果。
只需对代码进行少量更改或无需更改即可轻松扩展。
Optuna 使用修剪算法。修剪是机器学习和搜索算法中使用的一种技术,通过删除树中非关键和冗余的部分来对实例进行分类,从而减小决策树的大小。
Optuna 中的修剪会在训练的早期阶段自动停止没有希望的试验,您也可以将其称为自动早期停止。Optuna 提供以下修剪算法:
异步连续减半算法。
超频带算法。
使用中值停止规则的中值修剪算法。
阈值修剪算法,用于检测试验的异常指标。
我将重点介绍使用 Optuna 所需的简单步骤:
首先,如果尚未安装 Optuna,请使用 pip install optuna
安装。
定义您的模型。
选择要优化的参数。
创建一个研究。
定义目标函数。
优化。
检查试验结果。
从官方文档来看,Hyperopt是一个 Python 库,用于在搜索空间上进行串行和并行优化,其中可能包括实值、离散和条件维度。
Hyperopt使用贝叶斯优化算法进行超参数调整,为给定模型选择最佳参数。它可以优化具有数百个超参数的大规模模型。
Hyperopt 目前实现了三种算法:
随机搜索,
Parzen 估计器树,
自适应 TPE。
Hyperopt 旨在适应基于高斯过程和回归树的贝叶斯优化算法,但遗憾的是它们目前尚未实现。
Hyperopt 的特点:
HyperOpt 需要 4 个基本组件来优化超参数:
搜索空间,
损失函数,
优化算法,
用于存储历史记录(分数、配置)的数据库
在项目中使用 Hyperopt 的步骤:
初始化要搜索的空间。
定义目标函数。
选择要使用的搜索算法。
运行hyperopt功能。
分析存储在试验对象中的评估输出。
Scikit-Optimize是 Python 中用于超参数优化的开源库。它是由 Scikit-learn 背后的团队开发的。与其他超参数优化库相比,它相对容易使用。
它具有基于顺序模型的优化库,称为贝叶斯超参数优化 (BHO)。BHO 的优势在于它们在更少的迭代中找到比随机搜索更好的模型设置。
贝叶斯优化究竟是什么?
贝叶斯优化是一种顺序设计策略,用于对不采用任何函数形式的黑盒函数进行全局优化。它通常用于优化计算量大的函数。至少维基百科是这么说的。
但是,用简单的英语来说,BO 评估从过去的结果中看起来更有希望的超参数,并找到更好的设置,而不是使用迭代次数较少的随机搜索。过去超参数的性能会影响未来的决策。
Scikit-Optimize 的特点:
基于序列模型的优化,
建立在 NumPy、SciPy 和 Scikit-Learn 之上,
开源、商业可用、BSD 许可证。
使用高斯 过程的 Scikit-Optimize 贝叶斯优化基于称为gp_optimize 的算法。您可以在此处了解更多信息。如果您对如何从头开始构建自己的贝叶斯优化器感兴趣,还可以查看本教程:“如何在 Python 中从头开始实现贝叶斯优化”。
以下是使用 Scikit-Optimize 需要遵循的简单步骤:
如果尚未安装,首先使用 pip install skopt 安装 skopt。
定义模型。
决定要优化的参数。
定义搜索空间。
定义目标函数。
运行优化。
我希望我能够教你一两件关于超参数工具的事情。不要只是让它呆在你的脑海里,试试看!并随时与我联系,我很想了解您的意见和偏好。谢谢阅读!