Как исправить ошибку "У объекта '_BaseUniformDistribution' нет атрибута 'to_internal_repr'" - странное поведение в optuna - PullRequest
2 голосов
/ 01 октября 2019

Я пытаюсь использовать optuna lib в Python для оптимизации параметров моделей рекомендательных систем. Эти модели являются пользовательскими и выглядят как стандартные модели sklearn с предсказанием соответствия (с методами get / set params).

Что я делаю: простая целевая функция, которая выбирает два параметра из равномерного распределения int, задает эти параметры для модели, прогнозирует модель (нет стадии подгонки, поскольку это простая модель, которая использует параметры только на этапе прогнозирования) и вычисляетнекоторая метрика.

Что я получаю: первая пробная версия работает нормально, она отбирает параметры и выводит результаты в журнал. Но во втором и следующем испытании у меня есть некоторые странные ошибки (смотрите код ниже), которые я не могу решить или погуглить. Когда я провожу исследование только на 1 испытании, все в порядке.

То, что я пытался: переставить части целевой функции, поместить стадию подгонки внутрь, попытаться вычислить более простые метрики - ничего не помогает.

Вот моя целевая функция:

# 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 Ответ

4 голосов
/ 02 октября 2019

Кажется, у вашего кода нет проблем.

Я запустил упрощенную версию вашего кода (см. Ниже), и она хорошо работала в моей среде:

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 / samples / tpe / sampler.py # 558 , и эта строка выполняется только тогда, когда количество завершенных испытаний в исследовании больше нуля.

Кстати, выможно было бы избежать этой проблемы, используя RandomSampler следующим образом:

sampler = optuna.samplers.RandomSampler()
study = optuna.create_study(direction='maximize', sampler=sampler)

Обратите внимание, что производительность оптимизации RandomSampler, как правило, хуже, чем TPESampler, который является сэмплером Optuna по умолчанию.

...