Python : Hypteropt - 函数输入
Python : Hypteropt - Function input
我正在尝试实施多维超参数优化。我有一个函数有很多参数,但只有 4 个参数需要优化。
我想知道如何将它传递给 hypteropt。
我认为像这样的东西应该在测试函数中起作用:
from hyperopt import hp, fmin, tpe, Trials
def testFuntion(x,arg1='arg1',arg2='arg2',arg3='arg3'):
print(arg1,arg2,arg3)
#args1,arg2,arg3 = args
return x[0]-x[1]-x[2]+x[3]
space = ((hp.uniform('a', 0.0, 1.0),hp.uniform('b', 0.0, 1.0),hp.uniform('c', 0.0, 1.0)),hp.uniform('d', 0.0, 1.0),'blub1','blub2','blub3')
trials = Trials()
best = fmin(testFuntion, space, algo=tpe.suggest, max_evals=100)
但是该函数试图以某种方式比较我的字符串并引发错误:TypeError:不支持的操作数类型 -:'tuple' 和 'float'
我做错了什么?
好的,你应该注意这里的一些事情。最基本的是,如果仔细查看 space
的定义,前三个值(a
、b
和 c
)实际上包含在一个 3 -元组。这就是导致错误的原因,x[0]
是那个元组,您不能在这里以任何明智的方式减去浮点数 x[1]
。
为避免此类问题,我建议您在为函数参数映射 space
时使用更好的命名约定。另外,根据我对您的设置的理解,我认为您应该从函数签名中删除常量,因为这有点令人困惑并且不必要地使您的搜索膨胀 space。这是您想要的完整示例:
from hyperopt import hp, fmin, tpe, Trials
def test_function(x):
arg1='arg1'
arg2='arg2'
arg3='arg3'
return x[0]-x[1]-x[2]+x[3]
space = [
hp.uniform('x0', 0.0, 1.0),
hp.uniform('x1', 0.0, 1.0),
hp.uniform('x2', 0.0, 1.0),
hp.uniform('x3', 0.0, 1.0)
]
trials = Trials()
best = fmin(test_function, space, algo=tpe.suggest, max_evals=100, trials=tials)
P.s.: 使用你在fmin
中定义的trials
。
编辑:虽然我不太明白这一点,但由于您没有直接调用优化函数,因此您可以通过以下方式传入更多未优化的参数:
from hyperopt import hp, fmin, tpe, Trials
def test_function(x):
# x[4] is 'foo'
return x[0]-x[1]-x[2]+x[3]
space = [
hp.uniform('x0', 0.0, 1.0),
hp.uniform('x1', 0.0, 1.0),
hp.uniform('x2', 0.0, 1.0),
hp.uniform('x3', 0.0, 1.0),
'foo'
]
trials = Trials()
best = fmin(test_function, space, algo=tpe.suggest, max_evals=100, trials=trials)
我正在尝试实施多维超参数优化。我有一个函数有很多参数,但只有 4 个参数需要优化。
我想知道如何将它传递给 hypteropt。
我认为像这样的东西应该在测试函数中起作用:
from hyperopt import hp, fmin, tpe, Trials
def testFuntion(x,arg1='arg1',arg2='arg2',arg3='arg3'):
print(arg1,arg2,arg3)
#args1,arg2,arg3 = args
return x[0]-x[1]-x[2]+x[3]
space = ((hp.uniform('a', 0.0, 1.0),hp.uniform('b', 0.0, 1.0),hp.uniform('c', 0.0, 1.0)),hp.uniform('d', 0.0, 1.0),'blub1','blub2','blub3')
trials = Trials()
best = fmin(testFuntion, space, algo=tpe.suggest, max_evals=100)
但是该函数试图以某种方式比较我的字符串并引发错误:TypeError:不支持的操作数类型 -:'tuple' 和 'float'
我做错了什么?
好的,你应该注意这里的一些事情。最基本的是,如果仔细查看 space
的定义,前三个值(a
、b
和 c
)实际上包含在一个 3 -元组。这就是导致错误的原因,x[0]
是那个元组,您不能在这里以任何明智的方式减去浮点数 x[1]
。
为避免此类问题,我建议您在为函数参数映射 space
时使用更好的命名约定。另外,根据我对您的设置的理解,我认为您应该从函数签名中删除常量,因为这有点令人困惑并且不必要地使您的搜索膨胀 space。这是您想要的完整示例:
from hyperopt import hp, fmin, tpe, Trials
def test_function(x):
arg1='arg1'
arg2='arg2'
arg3='arg3'
return x[0]-x[1]-x[2]+x[3]
space = [
hp.uniform('x0', 0.0, 1.0),
hp.uniform('x1', 0.0, 1.0),
hp.uniform('x2', 0.0, 1.0),
hp.uniform('x3', 0.0, 1.0)
]
trials = Trials()
best = fmin(test_function, space, algo=tpe.suggest, max_evals=100, trials=tials)
P.s.: 使用你在fmin
中定义的trials
。
编辑:虽然我不太明白这一点,但由于您没有直接调用优化函数,因此您可以通过以下方式传入更多未优化的参数:
from hyperopt import hp, fmin, tpe, Trials
def test_function(x):
# x[4] is 'foo'
return x[0]-x[1]-x[2]+x[3]
space = [
hp.uniform('x0', 0.0, 1.0),
hp.uniform('x1', 0.0, 1.0),
hp.uniform('x2', 0.0, 1.0),
hp.uniform('x3', 0.0, 1.0),
'foo'
]
trials = Trials()
best = fmin(test_function, space, algo=tpe.suggest, max_evals=100, trials=trials)