0

我正在尝试优化具有 13 个参数的自定义模型(没有任何花哨的 ML),其中 12 个我知道是正态分布的。我使用该hyperopt库获得了不错的结果:

space = {
    'B1': hp.normal('B1', B1['mean'], B1['std']),
    'B2': hp.normal('B2', B2['mean'], B2['std']),
    'C1': hp.normal('C1', C1['mean'], C1['std']),
    'C2': hp.normal('C2', C2['mean'], C2['std']),
    'D1': hp.normal('D1', D1['mean'], D1['std']),
    'D2': hp.normal('D2', D2['mean'], D2['std']),
    'E1': hp.normal('E1', E1['mean'], E1['std']),
    'E2': hp.normal('E2', E2['mean'], E2['std']),
    'F1': hp.normal('F1', F1['mean'], F1['std']),
    'F2': hp.normal('F2', F2['mean'], F2['std'])
}

我可以指定每个参数的搜索空间形状为正态分布。

我有 32 个内核,默认Trials()对象只使用其中一个。 Hyperopt建议了两种并行化搜索过程的方法,这两种方法我都无法在我的 Windows 机器上工作,所以我已经放弃并想尝试不同的框架。

尽管据我所知贝叶斯超参数优化是基于值根据分布分布的想法,并且正态分布非常普遍,以至于它实际上被称为正态分布。我找不到一种方法来指定Optuna我的参数有 amean和 a standard deviation

我如何告诉我Optuna的参数meanstandard deviation

我可以在文档中找到的唯一发行版是suggest_uniform()suggest_loguniform()suggest_discrete_uniform().

请告诉我我是否误解了对数均匀分布(看起来有点相似,但我不能指定标准偏差?)或修剪过程。

正如您可能从我的文字中看出的那样,我花了很多时间试图弄清楚这一点,但一无所获,任何帮助都将不胜感激!

特别感谢 dankal444 提供了这个优雅的解决方案(我将用我自己的值替换平均值和标准):

from scipy.special import erfinv
space = {
    'B1': (erfinv(trial.suggest_float('B1', -1, 1))-mean)*std,
    'B2': ...
}
4

1 回答 1

1

optuna您可以通过使用均匀分布并将其转换为正态分布来作弊。为此,一种方法scipy.

函数从 <-1, 1> 范围内获取均匀分布并将其转换为标准正态分布

import matplotlib.pyplot as plt
import numpy as np
from scipy import special


x = np.linspace(-1, 1)
plt.plot(x, special.erfinv(x))
plt.xlabel('$x$')
plt.ylabel('$erf(x)$')

mean = 2
std = 3
random_uniform_data = np.random.uniform(-1 + 0.00001, 1-0.00001, 1000)
random_gaussianized_data = (special.erfinv(random_uniform_data) - mean) * std
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
axes[0].hist(random_uniform_data, 30)
axes[1].hist(random_gaussianized_data, 30)
axes[0].set_title('uniform distribution samples')
axes[1].set_title('erfinv(uniform distribution samples)')
plt.show()

这是函数的样子:

逆误差函数

下面是使用自定义均值和标准差将均匀分布转换为正态分布的示例(参见上面的代码)

将均匀分布转换为正态分布

于 2021-11-11T22:46:37.220 回答