Как исправить ошибку "объект '_BaseUniformDistribution' не имеет атрибута 'to_internal_repr'" - странное поведение в optuna
Я пытаюсь использовать optuna lib в Python для оптимизации параметров моделей рекомендательных систем. Эти модели являются настраиваемыми и выглядят как стандартные модели sk learn с прогнозированием соответствия (с методами get/set params).
Что я делаю: простая целевая функция, которая выбирает два параметра из равномерного распределения int, устанавливает эти параметры для модели, предсказывает модель (нет стадии соответствия, поскольку это простая модель, которая использует параметры только на стадии предсказания) и вычисляет некоторую метрику.
Что я получаю: первая пробная версия проходит нормально, она проверяет параметры и выводит результаты в журнал. Но во втором и следующем испытании у меня возникли странные ошибки (смотрите код ниже), которые я не могу решить или погуглить. Когда я провожу исследование только на одном испытании, все в порядке.
Что я пробовал: переставить части целевой функции, поместить внутрь стадию подходящей, попробовать посчитать более простые метрики - ничего не помогает.
Вот моя целевая функция:
# getting train, test
# fitting model
self.model = SomeRecommender()
self.model.fit(train, some_other_params)
def objective(trial: optuna.Trial):
# save study
if path is not None:
joblib.dump(study, some_path)
# sampling params
alpha = trial.suggest_uniform('alpha', 0, 100)
beta = trial.suggest_uniform('beta', 0, 100)
# setting params to model
params = {'alpha': alpha,
'beta': beta}
self.model.set_params(**params)
# getting predict
recs = self.model.predict(some_other_params)
# metric computing
metric_result = Metrics.hit_rate_at_k(recs, test, k=k)
return metric_result
# starting study
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=3, n_jobs=1)
Вот что я получил в трех испытаниях:
[I 2019-10-01 12:53:59,019] Finished trial#0 resulted in value: 0.1. Current best value is 0.1 with parameters: {'alpha': 59.6135986324444, 'beta': 40.714559720597585}.
[W 2019-10-01 13:39:58,140] Setting status of trial#1 as TrialState.FAIL because of the following error: AttributeError("'_BaseUniformDistribution' object has no attribute 'to_internal_repr'")
Traceback (most recent call last):
File "/Users/roseaysina/anaconda3/envs/sauvage/lib/python3.7/site-packages/optuna/study.py", line 448, in _run_trial
result = func(trial)
File "/Users/roseaysina/code/project/model.py", line 100, in objective
'alpha', 0, 100)
File "/Users/roseaysina/anaconda3/envs/sauvage/lib/python3.7/site-packages/optuna/trial.py", line 180, in suggest_uniform
return self._suggest(name, distribution)
File "/Users/roseaysina/anaconda3/envs/sauvage/lib/python3.7/site-packages/optuna/trial.py", line 453, in _suggest
self.study, trial, name, distribution)
File "/Users/roseaysina/anaconda3/envs/sauvage/lib/python3.7/site-packages/optuna/samplers/tpe/sampler.py", line 127, in sample_independent
values, scores = _get_observation_pairs(study, param_name)
File "/Users/roseaysina/anaconda3/envs/sauvage/lib/python3.7/site-packages/optuna/samplers/tpe/sampler.py", line 558, in _get_observation_pairs
param_value = distribution.to_internal_repr(trial.params[param_name])
AttributeError: '_BaseUniformDistribution' object has no attribute 'to_internal_repr'
[W 2019-10-01 13:39:58,206] Setting status of trial#2 as TrialState.FAIL because of the following error: AttributeError("'_BaseUniformDistribution' object has no attribute 'to_internal_repr'")
Traceback (most recent call last):
File "/Users/roseaysina/anaconda3/envs/sauvage/lib/python3.7/site-packages/optuna/study.py", line 448, in _run_trial
result = func(trial)
File "/Users/roseaysina/code/project/model.py", line 100, in objective
'alpha', 0, 100)
File "/Users/roseaysina/anaconda3/envs/sauvage/lib/python3.7/site-packages/optuna/trial.py", line 180, in suggest_uniform
return self._suggest(name, distribution)
File "/Users/roseaysina/anaconda3/envs/sauvage/lib/python3.7/site-packages/optuna/trial.py", line 453, in _suggest
self.study, trial, name, distribution)
File "/Users/roseaysina/anaconda3/envs/sauvage/lib/python3.7/site-packages/optuna/samplers/tpe/sampler.py", line 127, in sample_independent
values, scores = _get_observation_pairs(study, param_name)
File "/Users/roseaysina/anaconda3/envs/sauvage/lib/python3.7/site-packages/optuna/samplers/tpe/sampler.py", line 558, in _get_observation_pairs
param_value = distribution.to_internal_repr(trial.params[param_name])
AttributeError: '_BaseUniformDistribution' object has no attribute 'to_internal_repr'
Я не могу понять, в чем проблема и почему первая проба работает. Пожалуйста помоги.
Спасибо!
1 ответ
Кажется, у вашего кода нет проблем.
Я запустил упрощенную версию вашего кода (см. Ниже), и она хорошо работала в моей среде:
import optuna
def objective(trial: optuna.Trial):
# sampling params
alpha = trial.suggest_uniform('alpha', 0, 100)
beta = trial.suggest_uniform('beta', 0, 100)
# evaluating params
return alpha + beta
# starting study
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=3, n_jobs=1)
Не могли бы вы рассказать мне о вашей среде, чтобы исследовать проблему? (например, ОС, версия Python, интерпретатор Python (CPython, PyPy, IronPython или Jython), версия Optuna)
почему первая проба работает.
Эта ошибка возникает из-за optuna / samplers / tpe / sampler.py #558, и эта строка выполняется только тогда, когда количество завершенных испытаний в исследовании больше нуля.
Кстати, вы можете избежать этой проблемы, используя RandomSampler
следующим образом:
sampler = optuna.samplers.RandomSampler()
study = optuna.create_study(direction='maximize', sampler=sampler)
Обратите внимание, что производительность оптимизации RandomSampler
имеет тенденцию быть хуже чем TPESampler
это семплер по умолчанию Optuna.