Skip to content

Latest commit

 

History

History
205 lines (103 loc) · 10.9 KB

mlops-with-optuna-b7c52d931b4b.md

File metadata and controls

205 lines (103 loc) · 10.9 KB

Optuna 下的 MLOps

原文:towardsdatascience.com/mlops-with-optuna-b7c52d931b4b

不要浪费时间,使用 Optuna

Zachary WarnesTowards Data Science Zachary Warnes

·发表于 Towards Data Science ·阅读时间 7 分钟·2023 年 3 月 1 日

--

使用 DALLE-2 生成,超参数优化(作者照片)

对于那些熟悉繁琐的超参数调优过程的人来说,Optuna 无疑是救星。

使用不同的超参数优化技术调整多种模型的能力真是令人惊叹。

如果你仍在通过网格搜索来调优模型,你需要改变你的方法——你正在损失性能。

这篇文章包含了可以立即实施的现成代码。如果你想自己进行实验,可以快速浏览到文章末尾。不要忘记在整个文章中加载函数。本文将在深入探讨 Optuna 之前,讨论超参数调优的高层次内容。

  • 本文将概述如何使用自定义参数网格和度量标准创建新的研究。

  • 它将展示如何保存和加载研究,并收集最佳的试验和模型。

  • 最后,它将展示如何分叉研究以在更新的搜索空间中继续搜索。

超参数调优

在学习机器学习时,你将面临超参数调优问题,它决定了你优化的模型结构。最常见的方法是网格搜索,即使用参数的排列组合来训练和测试模型。

网格搜索极其低效。无论是在浪费时间还是探索较少的超参数空间方面。

结果是性能更差的模型。

有多种方法可以改善蛮力网格搜索。我详细说明了为什么包括随机在内的不同搜索方法会优于网格搜索。

## 超参数调优 — 总是调整你的模型

不要将免费的性能提升搁置一旁。

towardsdatascience.com

实质上不要使用网格搜索。它分析超参数搜索空间所需的时间太长。

更重要的是如何使用更有效的贝叶斯技术管理你创建的不同模型,例如 ‘树结构 Parzen 估计器’

但你会很快发现你正在迅速创建和保存越来越多的模型。因此,你会发现自己需要跟踪、存储和监控你优化过的不同模型。

Optuna

Optuna 是一个用于调整模型的超参数优化框架。它让你了解超参数如何影响你的模型,并提高你的模型性能。

我之前写过关于如何使用这个库来快速优化具有非常大超参数空间的模型。

## 使用 Optuna 进行超参数优化

如何生成模型的最佳版本。

towardsdatascience.com

有许多采样器可用于调整你的模型。它仍然包含标准的网格搜索和随机搜索模型。但此外,你还可以选择:

  • 树结构 Parzen 估计器(本文使用)

  • 一个准蒙特卡洛采样器

  • 一个交集搜索空间采样器

以及其他六个选项,所有这些选项都更系统地搜索你的超参数空间。

Optuna 中的每个优化都以学习的形式存在。这些学习跟踪超参数优化过程的许多不同组件。它们让你在不同步骤查看性能,查看某些超参数的效果,或从最佳试验中选择模型。

学习模板

模型参数

一个关于研究的问题是固定的参数网格。这是进行研究所需的优化函数的限制。在 Optuna 教程中,你会看到这个函数必须遵循标准格式以跟踪试验。

优化函数不允许用户动态传入不同的模型。它也不允许将不同的参数网格传递给优化函数。

,有一个解决方案允许使用可变的参数网格和模型。这里就引入了 lambda 函数。

通过将我们的优化函数定义为 lambda,我们可以传入多个值。这个 lambda 然后调用一个底层函数。结果是一个更强大、更灵活的学习设置。

动态模型优化

下面我定义了一些函数,这些函数作为底层 Optuna 函数的包装器。这些包装器允许你快速传入不同的模型和参数网格,而无需每次都定义全新的优化函数。

现在,你可以简单地在 python 字典中为不同实验创建不同的参数网格,并传入你可能喜欢的任何模型。

动态 Optuna 学习初始化(作者代码)

在这里,你还可以看到当模型名称未明确传入时,模型将被唯一保存。

由于你可以快速更新搜索空间和模型,研究数量迅速增加。因此,加载、重命名、分叉及其他追踪模型变得更加棘手。

加载模型

Optuna 研究存储在一个 db 文件中,可以使用他们的 load_study 函数加载。这个函数还提供了更改基础优化中使用的采样器的机会。

从本地数据库加载 Optuna 研究(作者代码)

分析研究

在从超参数样本生成大量模型之后,接下来是分析你的结果。

以下是我定义的一些额外功能来帮助你。

有时,最佳模型并不总是表现最好的。由于各种原因,你的目标指标和目标问题可能会增加需要处理的复杂性。

使用下面的函数,你可以获取前 n 个模型进行审查。

从 Optuna 研究中获取最佳试验(作者代码)

在运行研究并确定你的最佳模型之后,你需要将模型投入生产。

为了实现这一点,你可以识别你的理想研究并使用以下函数检索最佳基础模型的参数。

从 Optuna 研究中获取最佳参数(作者代码)

这些最佳试验参数是参数的字典。然后可以使用双星号 '**' python 运算符将其加载到你使用的模型中。

分叉研究

有时你的模型在取得进展,但你可能还没有运行足够长的时间。这对于模型优化来说很简单。但是,对于超参数优化来说,这是一个更困难的问题。

幸运的是,通过有限的调整,你可以加载旧的研究并继续你的搜索。此外,在分析后,你可能会发现你的最佳模型在某个超参数范围内。

使用分叉函数,你可以将你的研究拆分并探索不同的超参数网格。

认为你的学习率还不够低?调整参数网格并继续运行。在继续研究时,基础目标模型会继续优化。

分叉现有的 Optuna 研究(作者代码)

重命名研究

为了整理一些可能会派上用场的其他实用工具,我还创建了一个研究重命名函数。由于有这么多研究,最佳模型可能会在混合中丢失。

使用上面定义的解析研究函数以及下面的重命名研究函数,你可以轻松地在不同模型和参数网格中进行批量搜索。

然后一旦找到一个出色的模型,你可以快速重命名这些模型及其基础数据存储,以跟踪你的进展。

重命名现有的 Optuna 研究和本地数据库(作者代码)

实验

为了展示这种动态优化,我设置了一个简短的实验,你可以重新运行并使用你的数据集进行更改。这个代码旨在通过修改数据集直接使用。之后,你可以调整模型及其各自的超参数。这里的目标是使用这些代码支持我自己的 MLOps 流水线,构建、优化和跟踪许多不同的模型。

使用的数据

使用的数据集是来自 scikit-learn 的开源糖尿病玩具数据集。这个数据集是你安装时自带的。这是一个回归数据集,包含数值变量和数值目标。非常适合展示如何设置这些 Optuna 研究。

设置

你需要为研究指定一个名称和你想要优化的试验数量。在我的简要示例中,我展示了一个轻量级梯度提升模型。这些模型有很多超参数,使得调整变得困难。

花时间审查所使用的参数分布,因为它们突显了你可以在超参数空间中搜索的不同方式。你可以使用各种分布来微调新候选值的采样方式。

运行动态 Optuna 研究(作者代码)

完成超参数搜索后,你可以查看结果。除了我定义的函数,你还可以发现*trails_dataframe()*函数很有用。这个函数简单地将所有研究细节返回为数据框。

下一步是从最佳试验中加载最佳参数,或者从顶级试验中选择这些参数用于模型。

这是一个简单的过程,使用你模型的*set_params()*函数。

动态 Optuna 研究的结果展示(作者代码)

持续研究

Optuna 被设置为创建研究的参数网格,并在一系列试验中进行优化。

你可能也做过重新加载你的研究并继续优化它们。但是,如果你已经耗尽了搜索空间,你的结果可能不会有太大改进。

然而,借助我的动态研究设置,你可以加载现有试验,分叉试验,更改参数网格,并继续超参数优化搜索。

不幸的是,你只能更新数值参数分布进行超参数优化。这个问题似乎是 Optuna 当前的一个限制。

但你可以将超参数设置调整到一个完全不同的范围。因此,你可以从中断的地方继续,或完全探索一个新的分布。

分叉并继续优化 Optuna 研究(作者代码)

最终想法

Optuna 是一个强大的工具。顶级数据科学家纷纷使用它,理由充分。

这节省了时间,并且生成了更好的模型。

我写这篇文章的目标是创建一些实用函数,以支持数据科学团队更好的 MLOps。不同模型和不同设置的管理往往容易被忽视。

通过将模型跟踪的任务交给现有工具,你可以为你的团队节省宝贵的时间和精力。

如果你对阅读有关新型数据科学工具和理解机器学习算法的文章感兴趣,可以考虑在 Medium 上关注我。我在文章中总是包含可以应用于你的工作的代码!

如果你对我的写作感兴趣并想直接支持我,请通过以下链接订阅。这个链接确保我会收到你会员费用的一部分。

[## 使用我的推荐链接加入 Medium - Zachary Warnes

阅读 Zachary Warnes 的每一个故事(以及 Medium 上成千上万其他作家的作品)。你的会员费用直接支持…

zjwarnes.medium.com](https://zjwarnes.medium.com/membership?source=post_page-----b7c52d931b4b--------------------------------)