Hyperopt:重新运行时更改最佳参数

Posted

技术标签:

【中文标题】Hyperopt:重新运行时更改最佳参数【英文标题】:Hyperopt: Optimal parameter changing with rerun 【发布时间】:2019-05-16 13:51:45 【问题描述】:

我正在尝试使用贝叶斯优化 (Hyperopt) 来获得 SVM 算法的最佳参数。但是,我发现每次运行时最佳参数都会发生变化。

下面提供了一个简单的可重现案例。你能解释一下吗?

import numpy as np 
from hyperopt import fmin, tpe, hp, STATUS_OK, Trials

from sklearn.svm import SVC
from sklearn import svm, datasets
from sklearn.metrics import accuracy_score
from sklearn.model_selection import GridSearchCV, cross_val_score
from sklearn.model_selection import StratifiedShuffleSplit

iris = datasets.load_iris()
X = iris.data[:, :2] 
y = iris.target

def hyperopt_train_test(params):
    clf = svm.SVC(**params)
    return cross_val_score(clf, X, y).mean()

space4svm = 
    'C': hp.loguniform('C', -3, 3),
    'gamma': hp.loguniform('gamma', -3, 3),


def f(params):
    acc = hyperopt_train_test(params)
    return 'loss': -acc, 'status': STATUS_OK

trials = Trials()

best = fmin(f, space4svm, algo=tpe.suggest, max_evals=1000, trials=trials)

print ('best:')
print (best)

以下是一些最佳值。

最佳:'C':0.08776548401545513,'gamma':1.447360198193232

最佳:'C':0.23621788050791617,'gamma':1.2467882092108042

最佳:'C':0.3134163250819116,'gamma':1.0984778155489887

【问题讨论】:

【参考方案1】:

那是因为在fmin的执行过程中,hyperopt在程序的每次运行期间从定义的搜索空间space4cvm中随机抽取出'C''gamma'的不同值。

要解决此问题并产生确定性结果,您需要使用'rstate' param of fmin

rstate

    numpy.RandomState, default numpy.random or `$HYPEROPT_FMIN_SEED`

    Each call to `algo` requires a seed value, which should be different
    on each call. This object is used to draw these seeds via `randint`.
    The default rstate is numpy.random.RandomState(int(env['HYPEROPT_FMIN_SEED']))
    if the 'HYPEROPT_FMIN_SEED' environment variable is set to a non-empty
    string, otherwise np.random is used in whatever state it is in.

所以如果没有明确设置,默认情况下它会检查环境变量'HYPEROPT_FMIN_SEED'是否设置。如果没有,那么每次都会使用一个随机数。

您可以通过以下方式使用它:

rstate = np.random.RandomState(42)   #<== Use any number here but fixed

best = fmin(f, space4svm, algo=tpe.suggest, max_evals=100, trials=trials, rstate=rstate)

【讨论】:

我更改了代码“rstate = np.random.default_rng(42)”以使其正常工作。这可能是一个版本控制的事情(hyperopt==0.2.7)。

以上是关于Hyperopt:重新运行时更改最佳参数的主要内容,如果未能解决你的问题,请参考以下文章

最佳实践:方向更改期间的 AsyncTask

在运行时更改AngularJs中背景图像的最佳方法

在运行时更改 Material UI 反应主题的最佳方式

如何保存最佳 hyperopt 优化的 keras 模型及其权重?

如何使用hyperopt进行Keras深度学习网络的超参数优化?

Hyperopt 中的 qloguniform 搜索空间设置问题