Hyperopt: оптимальное изменение параметров при повторном запуске - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь использовать байесовскую оптимизацию (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)

Ниже приведены некоторые оптимальные значения.

best: {'C': 0.08776548401545513, 'gamma': 1.447360198193232}

лучшее: {'C': 0,23621788050791617, 'гамма': 1,2467882092108042}

лучшее: {'C': 0,3134163250819116, 'гамма': 1,0984778155489887}

1 Ответ

0 голосов
/ 18 декабря 2018

Это потому, что во время выполнения 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)
...