-1

我有很多参数的功能,我想用 hyperopt 优化我的模型,使用这个功能

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)

我路径空列表和字典,因为我现在不使用这些参数(我会很感激帮助找到更简洁的方法来做到这一点)。当我运行此代码时,会出现以下错误:

      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'

我究竟做错了什么?

4

1 回答 1

0

非常感谢我的朋友@Gushchin_D 的回答:HyperOpt 只将一个参数传递给优化函数:带有参数值的字典,所以在这种情况下, optifunc 的正确解决方案是:

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'])

上瘾,我的空间 arg 也是错误的,有正确的代码:

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])}
          })
于 2020-04-19T05:40:39.357 回答