Hyperopt TypeError из-за передачи параметров в функцию - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть функция со многими параметрами, я хочу оптимизировать свою модель с помощью гиперопции, используя эту функцию

def optifunc(model_class, data, init_a, init_k, train_a, train_k, pred_a, pred_k):
    print(model_class, data, init_a, init_k, train_a, train_k, pred_a, pred_k)
    model = model_class(*init_a, **init_k)
    return estimate_model(model, data, 
                          train_args=train_a, train_kwargs=train_k, predict_args=pred_a, predict_kwargs=pred_k)

Там мой код с пробелом и вызовом fmin:

from hyperopt import fmin, hp, tpe
space4mean = ({'model_class': func_model,
             'data': small_df,
             'init_a': [],
             'init_k': {hp.choice('winsize', np.arange(100))},
             'train_a': [],
             'train_k': {},
             'pred_a': [],
             'pred_k': {hp.choice('use_new_points', [True, False])}
              })
best = fmin(
    optifunc,
    space4mean,
    algo=tpe.suggest,
    max_evals=100)

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

      0%|          | 0/100 [00:00<?, ?trial/s, best loss=?]
job exception: optifunc() missing 7 required positional arguments: 'data', 'init_a', 'init_k', 'train_a', 'train_k', 'pred_a', and 'pred_k'

  0%|          | 0/100 [00:00<?, ?trial/s, best loss=?]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-239-b5684be19c47> in <module>
      3     space4mean,
      4     algo=tpe.suggest,
----> 5     max_evals=100)
      6 hp.choice(label, options)

~/miniconda3/lib/python3.7/site-packages/hyperopt/fmin.py in fmin(fn, space, algo, max_evals, timeout, loss_threshold, trials, rstate, allow_trials_fmin, pass_expr_memo_ctrl, catch_eval_exceptions, verbose, return_argmin, points_to_evaluate, max_queue_len, show_progressbar)
    507 
    508     # next line is where the fmin is actually executed
--> 509     rval.exhaust()
    510 
    511     if return_argmin:

~/miniconda3/lib/python3.7/site-packages/hyperopt/fmin.py in exhaust(self)
    328     def exhaust(self):
    329         n_done = len(self.trials)
--> 330         self.run(self.max_evals - n_done, block_until_done=self.asynchronous)
    331         self.trials.refresh()
    332         return self

~/miniconda3/lib/python3.7/site-packages/hyperopt/fmin.py in run(self, N, block_until_done)
    284                 else:
    285                     # -- loop over trials and do the jobs directly
--> 286                     self.serial_evaluate()
    287 
    288                 self.trials.refresh()

~/miniconda3/lib/python3.7/site-packages/hyperopt/fmin.py in serial_evaluate(self, N)
    163                 ctrl = base.Ctrl(self.trials, current_trial=trial)
    164                 try:
--> 165                     result = self.domain.evaluate(spec, ctrl)
    166                 except Exception as e:
    167                     logger.error("job exception: %s" % str(e))

~/miniconda3/lib/python3.7/site-packages/hyperopt/base.py in evaluate(self, config, ctrl, attach_attachments)
    892                 print_node_on_error=self.rec_eval_print_node_on_error,
    893             )
--> 894             rval = self.fn(pyll_rval)
    895 
    896         if isinstance(rval, (float, int, np.number)):

TypeError: optifunc() missing 7 required positional arguments: 'data', 'init_a', 'init_k', 'train_a', 'train_k', 'pred_a', and 'pred_k'

Что я делаю не так?

1 Ответ

0 голосов
/ 19 апреля 2020

Большое спасибо моему другу, @Gushchin_D, за ответ: HyperOpt передает только один аргумент оптимизированной функции: словарь со значениями аргументов, поэтому в этой ситуации правильное решение для optifun c:

def optifunc(par):

model = par['model_class'](*par['init_a'], **par['init_k'])
return estimate_model(model, data, 
                      train_args=par['train_a'], train_kwargs=par['train_k'], 
                      predict_args=par['pred_a'], predict_kwargs=par['pred_k'])

В зависимости, мой пробел также был неверным, есть правильный код:

space4mean = ({'model_class': FuncModel,
         'data': df,
         'init_a': [mean_of_df, small_df],
         'init_k': {'winsize': hp.choice('winsize', np.arange(500))},
         'train_a': [],
         'train_k': {},
         'pred_a': [],
         'pred_k': {'use_new_points': hp.choice('use_new_points', [True, False])}
          })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...