HyperOpt 揭秘

如何使用 HyperOpt 自动调整模型

你喜欢调整模型吗? 如果你的回答是“是”,那么这篇文章就是 不能 为你。

Hyperparameter hyper parameter tuning model tuning 机器学习 data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
我爷爷的漫画—— 官网.

在这篇博客中,我们将介绍非常流行的自动超参数调整算法,称为 基于树的 Parzen 估计器 (热塑性弹性体)。 TPE 由开源软件包 HyperOpt 提供支持。 通过利用 HyperOpt 和 TPE,机器学习工程师可以 无需任何手动调整即可快速开发高度优化的模型.

事不宜迟,让我们潜入!

HyperOpt 是一个开源 python 包,它使用一种称为基于树的 Parzen Esimtors (TPE) 的算法来选择模型超参数,从而优化用户定义的目标函数。 通过简单地定义每个超参数的函数形式和边界,TPE 可以彻底而有效地搜索复杂的超空间以达到最佳效果。

TPE 是一种顺序算法,它利用贝叶斯更新并遵循以下顺序。

  1. 使用多组随机选择的超参数训练模型,返回目标函数值。
  2. 根据一些阈值伽玛 (γ),将我们观察到的目标函数值分成“好”和“坏”组。
  3. 计算“promisingness”分数,这只是 P(x|好) / P(x|坏).
  4. 通过混合模型确定最大化前景的超参数。
  5. 使用第 4 步中的超参数拟合我们的模型。
  6. 重复步骤 2-5 直到停止标准。

这里有一个 快速代码示例.

好吧,这是很多大话。 让我们放慢脚步,真正了解发生了什么。

1.1 — 我们的目标

数据科学家很忙。 我们想制作出非常好的模型,但要以一种高效且理想的不干涉方式进行。

但是,ML 建模生命周期中的某些步骤很难自动化。 例如,探索性数据分析 (EDA) 和特征工程通常是特定于主题的,需要人类的直觉。 另一方面,模型调整是一个迭代过程,计算机可以在其中表现出色。

我们在这篇文章中的目标是了解如何利用算法来自动化模型调整过程。

为了帮助我们思考这个目标,让我们打个比方:我们是寻找埋藏宝藏的海盗。 同样重要的是要注意我们是非常有效率的海盗,他们希望尽量减少我们寻找埋藏宝藏的时间。 那么,我们应该如何最大限度地减少搜索时间呢? 答案是 使用地图!

Hyperparameter hyper parameter tuning model tuning 机器学习 data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
数字 1:示例 3D 超参数搜索空间。 宝箱的位置是全局最优的。 图片由作者提供。

在图 1 中,我们有一张虚构的地图,显示了我们的宝藏所在的位置。 经过大量的攀爬和挖掘,找到那个宝藏并不难,因为我们知道它的确切位置。

但是当我们没有地图时会发生什么?

不幸的是,当负责调整模型时,我们没有得到一张地图。 我们的地形对应于超参数搜索空间,是未知的。 此外,对应于最佳超参数集的我们宝藏的位置也是未知的。

有了这个设置,让我们谈谈一些有效探索这个空间并找到宝藏的潜在方法!

1.2 — 潜在的解决方案

模型调优的原始方法是“手动”——工程师实际上会手动测试许多不同的配置,并查看哪种超参数组合会产生最佳模型。 虽然信息丰富,但这个过程效率低下。 一定会有更好的办法…

1.2.1 — 网格搜索(最差)

我们的第一个优化算法是网格搜索。 网格搜索在用户指定的网格中迭代测试超参数的所有可能组合。

Hyperparameter hyper parameter tuning model tuning 机器学习 data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
图 2:网格搜索布局示例。 图片由作者提供

例如,在图 2 中,您看到红点的地方就是我们将重新训练和评估我们的模型的地方。 这个框架效率低下,因为它 重用错误的超参数. 例如,如果超参数 2 对我们的目标函数影响不大,我们仍将测试其值的所有组合,从而将所需的迭代次数增加 10 倍(在本例中)。

但在继续之前,重要的是要注意网格搜索仍然相当流行,因为它保证在给定正确指定的网格的情况下找到最佳结果。 如果您决定使用该方法, 确保转换网格以反映超参数的函数形式。 例如,max_depth 对于 随机森林分类器 是一个整数——不要让它搜索连续的空间。 它也不太可能具有均匀分布——如果您知道超参数的函数形式,请转换网格以反映它。

综上所述, 网格搜索受到维数灾难的影响,并在评估之间重新计算信息,但仍被广泛使用。

1.2.2 — 随机搜索(好)

我们的第二个算法是随机搜索。 随机搜索在用户指定的网格中尝试随机值。 与网格搜索不同,我们不必测试每一种可能的超参数组合,这样可以提高效率。

Hyperparameter hyper parameter tuning model tuning 机器学习 data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
图 3:随机搜索示例。 图片由作者提供。

这是一个很酷的事实:随机搜索会(平均)在其中找到前 5% 的超参数配置 60次迭代. 也就是说,与网格搜索一样,您必须转换搜索空间以反映每个超参数的函数形式。

随机搜索是超参数优化的良好基线。

1.2.3 — 贝叶斯优化(更好)

我们的第三个候选算法是我们的​​第一个基于模型的顺序优化 (SMBO) 算法。 与现有技术的关键概念差异是我们 反复使用先前的运行来确定未来的探索点。

Hyperparameter hyper parameter tuning model tuning 机器学习 data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
图 4:贝叶斯优化示例 — SRC. 图片由作者提供。

贝叶斯超参数优化旨在开发超参数搜索空间的概率分布。 从那里,它使用获取功能,例如预期的预期改进,将我们的超空间转换为更“可搜索”。 最后,它使用一种优化算法,例如随机梯度下降,来找到使我们的采集函数最大化的超参数。 这些超参数用于拟合我们的模型,并重复该过程直到收敛。

贝叶斯优化通常优于随机搜索,但它有一些核心限制,例如需要数字超参数。

1.2.4 — 基于树的 Parzen 估计器(最佳)

最后,让我们谈谈这个节目的明星:基于树的 Parzen Estimators (TPE)。 TPE 是另一种 SMBO 算法,通常优于基本贝叶斯优化,但主要卖点是它通过树结构处理复杂的超参数关系。

Hyperparameter hyper parameter tuning model tuning 机器学习 data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
图 5:TPE 层次结构示例 — SRC. 图片由作者提供。

让我们用图 5 来理解这一点 树状结构. 我们在这里训练支持向量机 (SVM) 分类器。 我们将测试两个内核: linearRBF。 一个 linear 内核不采用宽度参数,但 RBF 确实如此,所以通过使用嵌套字典,我们能够对这种结构进行编码,从而限制搜索空间。

TPE 还支持传统贝叶斯优化不支持的分类变量。

继续之前的快速免责声明,有 许多其他超参数调整包. 每个都支持多种算法,其中一些包括随机森林、高斯过程和遗传算法。 TPE 是一种非常流行的通用算法,但不一定是最好的。

总的来说,TPE 是一种真正强大且高效的超参数优化解决方案。

现在我们对一些流行的超参数优化算法有了大致的了解,让我们深入了解 TPE 的工作原理。

回到我们的类比,我们是海盗寻找埋藏的宝藏 但没有地图. 我们的船长需要尽快找到宝藏,所以我们需要在很有可能有宝藏的战略位置进行挖掘,利用之前的挖掘来确定未来挖掘的位置。

2.1 — 初始化

首先,我们 定义对我们空间的限制. 如上所述,我们的超参数通常具有函数形式、最大/最小值以及与其他超参数的层次关系。 利用我们对 ML 算法和数据的了解,我们可以定义我们的搜索空间。

接下来,我们必须 定义我们的目标函数,用于评估我们的超参数组合有多“好”。 一些示例包括经典的 ML 损失函数,例如 RMSE 或 AUC。

伟大的! 既然我们有了有限的搜索空间和衡量成功的方法,我们就可以开始搜索了……

2.2 — 迭代贝叶斯优化

贝叶斯优化是一种顺序算法,它根据目标函数在超空间中找到“成功”概率很高的点。 TPE 利用贝叶斯优化,但使用一些聪明的技巧来提高性能和处理搜索空间的复杂性……

2.2.0 — 概念设置

第一个技巧是建模 P(x|y) 而不是 P(y|x)…

Hyperparameter hyper parameter tuning model tuning 机器学习 data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
图 6:TPE 希望解决的条件概率。 图片由作者提供。

贝叶斯优化通常着眼于建模 P(y|x), 这是目标函数值的概率 (y), 给定超参数 (x). TPE 恰恰相反——它看起来像模型 P(x|y), 这是超参数的概率(x), 给定目标函数值(y).

简而言之,TPE 试图找到最佳目标函数值,然后确定关联的超参数。

有了这个非常重要的设置,让我们进入实际的算法。

2.2.1 — 将我们的数据分成“好”和“坏”组

请记住,我们的目标是根据某些目标函数找到最佳超参数值。 那么,我们如何利用 P(x|y) 要做到这一点?

首先,TPE 将我们观察到的数据点分成两组: 非常好, 表示 克(x), , 表示 l(x). 好与坏之间的界限由用户定义的参数伽玛 (γ) 决定,该参数对应于将我们的观察结果分开的目标函数百分位数 (y*).

因此,当 γ = 0.5 时,我们的目标函数值将我们的观察结果分开(y*) 将是我们观察到的点的中值。

Hyperparameter hyper parameter tuning model tuning 机器学习 data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
图 7:将 p(x|y) 分解为两组。 图片由作者提供。

如图 7 所示,我们可以形式化 p(x|y) 使用上面的框架。 而且,用海盗类比来滚动......

海盗视角:看看我们已经探索过的地方,l(x) 列出了宝藏很少的地方,g(x) 列出了宝藏很多的地方。

2.2.32— 计算“有前途”分数

其次,TPE 定义了我们应该如何通过 “有前途”得分.

Hyperparameter hyper parameter tuning model tuning 机器学习 data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
图 8:前景评分定义。 图片由作者提供。

图 8 定义了我们的前景分数 (P), 这只是与以下组件的比率......

  • 分子:观察一组超参数的概率(x), 给定相应的目标函数值为“非常好设立的区域办事处外,我们在美国也开设了办事处,以便我们为当地客户提供更多的支持。“
  • 分母:观察一组超参数的概率(x), 给定相应的目标函数值为“设立的区域办事处外,我们在美国也开设了办事处,以便我们为当地客户提供更多的支持。“

“promisingness”值越大,我们的超参数越有可能 x 将产生一个“好的”目标函数。

海盗视角:有希望显示我们地形中的给定位置拥有大量宝藏的可能性。

在继续之前快速抛开,如果您熟悉贝叶斯优化,这个等式充当采集函数并且与 预期改进 (EI).

2.2.3—创建概率密度估计

第三,TPE 希望通过以下方式评估“有前途”分数 混合模型. 混合模型的思想是采用多个概率分布并使用线性组合将它们组合在一起—— SRC. 然后使用这些组合的概率分布来开发概率密度估计。

一般来说,混合建模过程是……

  1. 定义我们点的分布类型。 在我们的例子中,如果我们的变量是分类的,我们使用重新加权的分类分布,如果它是数字的,我们使用高斯(即正态)或均匀分布。
  2. 遍历每个点并在该点插入一个分布。
  3. 将所有分布的质量相加以获得概率密度估计。

请注意,此过程针对两组单独运行 l(x)g(x)。

让我们看一下图 9 中的示例……

Hyperparameter hyper parameter tuning model tuning 机器学习 data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
图 9:适合 3 个超参数观测值的截断高斯分布示例。 图片由作者提供。

对于每个观察值(x 轴上的蓝点),我们创建一个正态分布 ~N(μ, σ),其中……

  • μ(亩) 是我们正态分布的均值。 它的值是我们的点沿 x 轴的位置。
  • σ(西格玛) 是我们正态分布的标准差。 它的值是到最近邻点的距离.

如果点靠得很近,则标准偏差会很小,因此分布会很高,相反,如果点分散开,则分布会很平坦(图 10)……

Hyperparameter hyper parameter tuning model tuning 机器学习 data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
图 10:标准偏差对正态分布形状的影响示例。 图片由作者提供。

海盗观点:不适用——海盗不擅长混合模型。

在继续之前的另一个快速旁白:如果您正在阅读文献,您会注意到 TPE 使用“截断的”高斯,这仅仅意味着高斯受我们在超参数配置中指定的范围的限制,而不是扩展到 +/- 无穷大.

2.2.4 — 确定下一个探索点!

让我们把这些部分放在一起。 到目前为止,我们已经 1) 获得了目标函数观察值,2) 定义了我们的“有前途”公式,以及 3) 通过基于先验值的混合模型创建了概率密度估计。 我们拥有评估给定点的所有部分!

我们的第一步是为两者创建一个平均概率密度函数 (PDF) 克(x) l(x).

Hyperparameter hyper parameter tuning model tuning 机器学习 data science sklearn model mllib spark hyperopt tree parzen estimator tpe tree based parzen esimtator mlflow databricks
图 11:给定 3 个观察点的平均概率密度的叠加。 图片由作者提供。

图 11 显示了一个示例过程——红线是我们的平均 PDF,它只是所有 PDF 的总和除以 PDF 的数量。

使用平均 PDF,我们可以得到任何超参数值的概率 (x) 在 克(x) or l(x).

例如,假设图 11 中的观察值属于“好”集, 克(x). 根据我们的平均 PDF,3.9 或 0.05 的超参数值不太可能属于“好”集。 相反,~1.2 的超参数值似乎很可能属于“好”集。

现在这只是图片的一半。 我们对“坏”集应用相同的方法, l(x)。 因为我们要最大化 g(x) / l(x), 有希望的点应该位于 克(x) 是高和 l(x).

很酷,对吧?

有了这些概率分布,我们可以从我们的树结构超参数中抽样,找到一组最大化“有前途”的超参数,因此值得探索。

海盗视角:我们挖掘的下一个位置是最大化(拥有大量宝藏的概率)/(拥有少量宝藏的概率)的位置。

现在您已经知道它是如何工作的,下面是一些通过开源包 HyperOpt 实施 TPE 的实用技巧。

3.1 — HyperOpt 应用程序的结构

通常,利用 HyperOpt 时有三个主要步骤……

  1. 定义搜索空间, 这只是您要优化的超参数的范围和函数形式。
  2. 定义拟合函数, 这叫你 model.fit() 在给定的火车/测试拆分上运行。
  3. 定义目标函数, 这是任何经典的准确性指标,例如 RMSE 或 AUC。

不幸的是,这些自动调整方法仍然需要数据科学家的设计输入——这不是完全免费的午餐。 然而,有趣的是,TPE 对超参数错误指定非常稳健(在合理范围内)。

3.2— 提示和技巧

  • HyperOpt 可通过两者并行化 Apache SparkMongoDB的. 如果您使用多个内核,无论是在云端还是在您的本地机器上,这都可以显着减少运行时间。
  • 如果您通过 Apache Spark 并行化调整过程,请使用 SparkTrials单节点 ML 模型 (sklearn) 的对象和 Trails 并行 ML 模型 (MLlib) 的对象。 代码如下。
  • 流量 是一种用于跟踪模型运行的开源方法。 它很容易与 HyperOpt 集成。
  • 不要过早缩小搜索范围。 超参数的某些组合可能会出奇地有效。
  • 定义搜索空间可能很棘手,尤其是当您不知道 超参数的函数形式. 然而,根据个人经验,TPE 对这些功能形式的错误指定非常稳健。
  • 选择一个好的目标函数有很长的路要走。 在大多数情况下,错误并非生而平等。 如果某种类型的错误问题更大,请确保将该逻辑构建到您的函数中。

3.3— 代码示例

下面是一些以分布式方式运行 HyperOpt 的代码。 它是根据书中的代码改编的, 机器学习工程实践 - 这是 git 仓库.

此代码段的一些不错的功能包括并行化 Apache Spark 和模型记录通过 流量. 另请注意,此代码段优化了 sklearn RandomForestRegressor——您必须更改模型和拟合函数以满足您的需求。

这就是您拥有的 — HyperOpt 的所有荣耀!

为了敲定重点,让我们快速回顾一下。

超参数调整是 ML 模型生命周期的必要部分,但非常耗时。 基于模型的顺序优化 (SMBO) 算法擅长在复杂的超空间中搜索最优值,并且它们可以应用于超参数调整。 基于树的 Parzen 估计器 (TPE) 是一种非常高效的 SMBO,其性能优于贝叶斯优化和随机搜索。

TPE 重复以下步骤直到停止标准:

  1. 根据一些超参数 gamma,将观察到的点分为“好”和“坏”集。
  2. 将混合模型拟合到“好”和“坏”集合以开发平均概率密度估计。
  3. 选择优化“有前途”分数的点,它利用步骤 2 来估计处于“好”和“坏”集合中的概率。

最后,我们有一个非常酷的代码片段,展示了如何通过 SparkTrials 并行化 HyperOpt。 它还将我们所有的迭代记录到 MLflow。

HyperOpt Demystified 从源头重新发布 https://towardsdatascience.com/hyperopt-demystified-3e14006eb6fa?source=rss—-7f60cf5620c9—4 通过 https://towardsdatascience.com/feed

–>

时间戳记:

更多来自 区块链顾问