-1

我试图实现多维超参数优化。我有一个有很多参数的函数,但只有 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)

但是该函数试图以某种方式比较我的字符串并引发 Error: TypeError: unsupported operand type(s) for -: 'tuple' and 'float'

我究竟做错了什么?

4

1 回答 1

1

好的,你应该在这里处理一些事情。最基本的是,如果您仔细查看您的定义space,前三个值(abc实际上包含在一个三元组中。这就是导致你的错误的原因,x[0]是那个元组,你不能x[1]在这里以任何明智的方式减去浮点数。

为避免此类问题,我建议您在映射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)

Ps:使用trials你在fmin.

编辑:虽然我不太明白这一点,因为你不直接调用你的优化函数,这里是你如何传递更多没有得到优化的参数:

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)
于 2019-11-21T18:46:51.800 回答