如何修复optun中的错误“\u BaseUniformDistribution”对象没有属性“to\u internal\u repr”

2024-09-30 18:24:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在Python中使用optuna lib来优化推荐系统模型的参数。这些模型是定制的,看起来像标准的fit-learn模型(带有get/set参数的方法)。你知道吗

我做的是:从均匀整数分布中选择两个参数的简单目标函数,将这些参数设置为模型,预测模型(没有拟合阶段,因为它是在预测阶段只使用参数的简单模型)并计算一些度量。你知道吗

我得到的是:第一次测试运行正常,它对参数进行采样,并将结果打印到日志中。但在第二次和下一次试验中,我有一些奇怪的错误(请看下面的代码),我无法解决或谷歌。当我在一次试验中进行研究时,一切都很好。你知道吗

我尝试的是:重新安排目标函数的各个部分,将fit阶段放进去,尝试计算更简单的度量——没有任何帮助。你知道吗

这是我的目标函数:

# 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'

我不明白问题出在哪里,也不明白为什么一审能奏效。拜托,救命啊。你知道吗

谢谢你!你知道吗


Tags: inpylibpackageslinesiteusersfile
1条回答
网友
1楼 · 发布于 2024-09-30 18:24:46

你的代码似乎没有问题。你知道吗

我运行了您的代码的简化版本(见下文),它在我的环境中运行良好:

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、pypypy、IronPython或Jython)、Optuna版本)

why the first trial is working.

这个错误是由optuna/samplers/tpe/sampler.py#558引起的,只有当研究中完成的试验数大于零时才执行这一行。你知道吗

顺便说一句,您可以通过使用RandomSampler来避免这个问题,如下所示:

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

注意,RandomSampler的优化性能往往比Optuna的默认采样器TPESampler差。你知道吗

相关问题 更多 >