Простой вариант - использовать способность hyperopt
для вложения параметров. Таким образом, вы можете определить пространство гиперпараметров, как вы хотите:
space = hp.uniform("a", hp.uniform("b", 0, 0.5), 0.5)
Только значение "a"
передается в функцию, которую вы оптимизируете (потому что это пространство гиперпараметров), но hyperopt.fmin()
вернет оба параметра.
Аналогичная опция, но в случае, когда оптимизируемая функция получает оба параметра:
b_var = hp.uniform("b", 0, 0.5)
space = {"b": b_var, "a": hp.uniform("a", b_var, 0.5)}
Наконец, может быть проще изменить входные значения для оптимизированной функции: параметр a
можно заменить на a_fraction
, работающий в диапазоне от 0 до 1 и интерполирующий между b
и 0,5 (т. Е. a_fraction = 0
дает a = b
и a_fraction = 1
дают a = 0.5
внутри модифицированной функции для оптимизации). Таким образом, пространство параметров имеет обычный вид:
space = {"b": hp.uniform("b", 0, 0.5), "a_fraction": hp.uniform("a_fraction", 0, 1)}
Интересная дискуссия: https://github.com/hyperopt/hyperopt/issues/175#issuecomment-29401501.