Hyperopt: оптимальное изменение параметров при повторном запуске
Я пытаюсь использовать байесовскую оптимизацию (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, 'гамма': 1.447360198193232}
лучше всего: {'C': 0,23621788050791617, 'гамма': 1,2467882092108042}
лучшее: {'C': 0,3134163250819116, 'гамма': 1,0984778155489887}
1 ответ
Это потому, что во время исполнения fmin
, hyperopt
вытягивает различные значения 'C'
а также 'gamma'
из определенного пространства поиска space4cvm
случайно во время каждого запуска программы.
Чтобы это исправить и получить детерминированные результаты, вам нужно использовать 'rstate'
параметр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)