作者 Bunmi Akinremi
我清楚地记得两年前参加的一次机器学习黑客马拉松,当时我正处于数据科学职业生涯的初期。这是由尼日利亚数据科学组织的训练营的资格预审黑客马拉松。
该数据集包含有关某些员工的信息。我必须预测员工是否应该升职。在尝试改进和设计功能几天后,该模型的准确率似乎在 80% 左右波动。
我需要做点什么来提高我在排行榜上的分数。我开始手动调整模型——得到了更好的结果。通过更改参数,移动的准确度提高到 82%(这一移动非常重要,任何参加过黑客马拉松的人都会证明这一点!)。很兴奋,我开始调整其他超参数,但结果并非都那么好。我已经筋疲力尽了,想象一下连续工作 7 个小时来改进模型。挺累的。
我知道GridSearchCV和RandomSearchCV。我尝试了 GridSearchCV 并花了 3 个多小时从我提供的值范围内给我结果。更糟糕的是,GridSearchCV 的结果也不是更好。沮丧,我决定尝试 RandomSearchCV。这带来了一点快乐,我的准确率从 82% 上升到了 86%。
经过大量的试验,没有任何改善,我回到手动调整,看看我能得到什么。到黑客马拉松结束时,我的准确率达到了大约 90%。我希望我知道更快地优化超参数的工具!幸运的是,即使我没有进入前 50 名,我仍然有资格参加训练营。
那是过去。现在,我知道我可以使用一些很好的超参数调整工具,我很高兴与您分享它们。
在开始超调之前,请确保已完成以下操作:
  • 获取基线。您可以使用更小的模型、更少的迭代、默认参数或手动调整的模型来实现这一点。
  • 将您的数据分成训练集、验证集和测试集。
  • 使用大时期的早期停止轮来防止过度拟合。
  • 在训练之前设置完整的模型管道。
现在,我想讨论一些我将在文章中使用的术语:
  • 模型参数——模型参数是您的模型从数据中学习的参数,例如特征、关系等,您无法手动调整(不是特征工程)。
  • 模型超参数——超参数是您可以从模型本身手动调整的那些值,例如学习率、估计器数量、正则化类型等。
  • 优化– 调整超参数以通过使用其中一种优化技术来最小化成本函数的过程。
  • 超参数优化——超参数优化只是搜索以获得最佳超参数集,从而在特定数据集上提供模型的最佳版本。
  • 贝叶斯优化——基于序列模型的优化 (SMBO) 算法的一部分,用于使用前一个实验的结果来改进下一个实验。
  • 超参数采样——只需指定要在超参数空间上使用的参数采样方法。
我不反对使用 GridSearchCV。这是一个不错的选择,只是它确实非常耗时且计算成本高。如果您像我一样,日程繁忙,您一定会找到更好的选择。
更好的选择是 RandomSearch CV,它使用随机超参数值来选择最佳超参数。它比 GridSearchCV 快得多。这里的缺点是,由于它采用随机值,我们不能确定这些值是最佳组合。
但实际上,我什么时候知道我需要进行超参数优化?
作为数据科学家,我们经常犯的错误之一是使用模型的默认参数。根据您使用的默认参数,您可能没有使用模型的最佳版本。
有时,当您的模型过度拟合(在训练集上表现良好而在测试数据集上表现不佳)或欠拟合(在训练数据集上表现不佳而在测试数据集上表现良好)时,优化您的超参数确实会有所帮助。一点点调整就可以产生很大的不同,从 60% 的准确度到 80% 的准确度,甚至更多!
好了,介绍完毕。在本文结束时,您将了解:
  • 顶级的超参数调优工具,
  • 各种开源服务(免费使用)和付费服务,
  • 他们的特点和优势,
  • 他们支持的框架,
  • 如何为您的项目选择最佳工具,
  • 如何将它们添加到您的项目中。
  • 我们将从 TL;DR 下面讨论的所有工具的比较开始。
接下来,我将从一些开源工具开始。每个工具将按以下方式描述:
  • 工具简介,
  • 该工具的核心功能/优势,
  • 关于如何使用该工具的步骤,
  • 有关如何在项目中使用该工具的其他链接。

1. Ray Tune(光线调谐)

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 进行超参数调整。

2. Optuna

Optuna专为机器学习而设计。它是一个黑盒优化器,所以它需要一个目标函数。这个目标函数决定在接下来的试验中在哪里采样,并返回数值(超参数的性能)。它使用不同的算法,例如网格搜索、随机搜索、贝叶斯和进化算法来找到最佳的超参数值。
Optuna其中一些特点是:
  • 高效的采样和修剪算法。
  • 安装简单,要求少。
  • 比 Hyperopt 更易于使用。
  • 使用分布式优化。
  • 您可以使用 Python 语法定义搜索空间,包括条件和循环。
  • 您可以直观地分析优化结果。
  • 只需对代码进行少量更改或无需更改即可轻松扩展。
  • Optuna 使用修剪算法。修剪是机器学习和搜索算法中使用的一种技术,通过删除树中非关键和冗余的部分来对实例进行分类,从而减小决策树的大小。
Optuna 中的修剪会在训练的早期阶段自动停止没有希望的试验,您也可以将其称为自动早期停止。Optuna 提供以下修剪算法:
  • 异步连续减半算法。
  • 超频带算法。
  • 使用中值停止规则的中值修剪算法。
  • 阈值修剪算法,用于检测试验的异常指标。
我将重点介绍使用 Optuna 所需的简单步骤:
  • 首先,如果尚未安装 Optuna,请使用 pip install optuna 安装。
  • 定义您的模型。
  • 选择要优化的参数。
  • 创建一个研究。
  • 定义目标函数。
  • 优化。
  • 检查试验结果。

3. HyperOpt

从官方文档来看,Hyperopt是一个 Python 库,用于在搜索空间上进行串行和并行优化,其中可能包括实值、离散和条件维度。
Hyperopt使用贝叶斯优化算法进行超参数调整,为给定模型选择最佳参数。它可以优化具有数百个超参数的大规模模型。
Hyperopt 目前实现了三种算法:
  • 随机搜索,
  • Parzen 估计器树,
  • 自适应 TPE。
Hyperopt 旨在适应基于高斯过程和回归树的贝叶斯优化算法,但遗憾的是它们目前尚未实现。
Hyperopt 的特点:
HyperOpt 需要 4 个基本组件来优化超参数:
  • 搜索空间,
  • 损失函数,
  • 优化算法,
  • 用于存储历史记录(分数、配置)的数据库
在项目中使用 Hyperopt 的步骤:
  • 初始化要搜索的空间。
  • 定义目标函数。
  • 选择要使用的搜索算法。
  • 运行hyperopt功能。
  • 分析存储在试验对象中的评估输出。

4. Scikit-优化

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。
  • 定义模型。
  • 决定要优化的参数。
  • 定义搜索空间。
  • 定义目标函数。
  • 运行优化。

结论

我希望我能够教你一两件关于超参数工具的事情。不要只是让它呆在你的脑海里,试试看!并随时与我联系,我很想了解您的意见和偏好。谢谢阅读!
继续阅读
阅读原文