Hyperopt参数空间:TypeError:int()参数必须是字符串或数字,而不是'Apply'



在我更新几个软件包(包括scikit-learn(之前,这运行得很好。现在,下面的代码给了我一个类型错误。

from hyperopt import fmin, tpe, hp, STATUS_OK, Trials
def para_space():
    space_paras = {'model_type': hp.choice('model_type', ['f1', 'f2', 'f3', 'f4']),
                    'output_units': hp.uniform('output_units', 1, 10)}
    return space_paras
if __name__=='__main__':
    params = para_space()
    if params['model_type'] == 'f1':
            include_hours = True
            include_features = False
    else:   
            include_hours = True
            include_features = True
    out = int(params['output_units'])

我使用的是python 2.7.12,hyperopt版本0.1和sklearn版本0.18.1。完整回溯:

Traceback (most recent call last):
  File "testJan25.py", line 26, in <module>
    out = int(params['output_units'])
TypeError: int() argument must be a string or a number, not 'Apply'

知道如何将hp.uniform的结果转换为整数吗?

编辑:

假设我改用hp.randint

def para_space():
        space_paras = {'model_type': hp.choice('model_type', ['f1', 'f2', 'f3', 'f4']),
                        'output_units': hp.randint('output_units', 10)}
        return space_paras

后来:

    print params['output_units']

那么这是输出:

0 hyperopt_param
1   Literal{output_units}
2   randint
3     Literal{10}

但 Hyperopt 的全部意义在于为您提供用于超参数优化的随机值。当然有办法从中提取价值吗?

hyperopt包允许您定义参数空间。要对该参数空间的值进行采样以在模型中使用的,您需要一个 Trials(( 对象。

def model_1(params):
        #model definition here....
    return 0
params = para_space()
#model_1(params) #THIS IS A PROBLEM! YOU CAN'T CALL THIS. YOU NEED A TRIALS() OBJECT.
trials = Trials()
best = fmin(model_1, params, algo=tpe.suggest, max_evals=1, trials=trials)

最新更新