【问题标题】:Is there any equivalent of hyperopts lognormal in Optuna?Optuna 中是否有任何等效的 hyperopts lognormal?
【发布时间】:2021-04-22 17:38:18
【问题描述】:

我正在尝试使用 Optuna 对我的模型进行超参数调整。

我被困在一个地方,我想定义一个具有对数正态/正态分布的搜索空间。在hyperopt 中可以使用hp.lognormal。是否可以使用Optuna的现有suggest_ api的组合来定义这样的空间?

【问题讨论】:

  • 您或许可以利用来自suggest_float(..., 0, 1) 的逆变换(即U(0, 1))。我没有彻底测试它,因此发表评论,但这里有一个最小的例子,它可能是一个起点gist.github.com/hvy/4ef02ee2945fe50718c71953e1d6381d
  • 这真的很有帮助。您可以将其发布为答案,以便我接受吗
  • 太棒了。我只是将其转发为答案。

标签: python-3.x machine-learning hyperparameters optuna


【解决方案1】:

您也许可以使用来自 suggest_float(..., 0, 1)(即 U(0, 1))的逆变换,因为 Optuna 目前不直接为这两个分布提供 suggest_ 变体。这个例子可能是一个起点https://gist.github.com/hvy/4ef02ee2945fe50718c71953e1d6381d 请在下面找到代码

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm
from scipy.special import erfcinv

import optuna


def objective(trial):
    # Suggest from U(0, 1) with Optuna.
    x = trial.suggest_float("x", 0, 1)

    # Inverse transform into normal.
    y0 = norm.ppf(x, loc=0, scale=1)

    # Inverse transform into lognormal.
    y1 = np.exp(-np.sqrt(2) * erfcinv(2 * x))

    return y0, y1


if __name__ == "__main__":
    n_objectives = 2  # Normal and lognormal.

    study = optuna.create_study(
        sampler=optuna.samplers.RandomSampler(),
        # Could be "maximize". Does not matter for this demonstration.
        directions=["minimize"] * n_objectives,
    )
    study.optimize(objective, n_trials=10000)

    fig, axs = plt.subplots(n_objectives)
    for i in range(n_objectives):
        axs[i].hist(list(t.values[i] for t in study.trials), bins=100)
    plt.show()

【讨论】:

  • 当 mu=0.01 和 sigma=10 时如何实现对数正态。在上面的代码中,如果我使用 mu 和 sigma 作为 0.01 和 10,那么大多数试验都失败了。可以吗?
  • 逆补误差函数erfcinvnorminv的关系是norminv(p)=(-sqrt(2))*erfcinv(2p)。使用 scipy,您可以使用 scipy.stats.norm 对象的 ppf 方法计算 norminv。首字母缩略词 ppf 代表百分比点函数,它是分位数函数的另一个名称。因此你也可以写y1 = np.exp(y0)
猜你喜欢
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2013-02-02
  • 2011-05-31
  • 1970-01-01
相关资源
最近更新 更多