Как исправить ошибку "объект '_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.

Другие вопросы по тегам