在我更新几个软件包(包括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)