我尝试在回归模型上使用Hyperopt,这样它的一个超参数是按变量定义的,并且需要以列表的形式传递。例如,如果我有一个具有3个自变量(不包括常量)的回归,我会传递hyperparameter = [x, y, z] (其中x, y, z是浮点数)。
此超参数的值具有相同的边界,无论它们应用于哪个变量。如果这个超参数应用于所有变量,我可以简单地使用hp.uniform('hyperparameter', a, b)。我希望搜索空间是长度为n的hp.uniform('hyperparameter', a, b)的笛卡尔乘积,其中n是回归中的变量数量(所以,基本上是itertools.product(hp.uniform('hyperparameter', a, b), repeat = n))
我想知道这在Hyperopt中是否可能。如果没有,欢迎对可能的优化器提出任何建议。
发布于 2020-08-09 01:45:12
嗨,所以我用optuna实现了这个解决方案。optuna的优点是它将为所有单个值创建一个超空间,但以一种更智能的方式优化这些值,并且只使用一个超参数优化。例如,我使用Batch-SIze,Learning-rate和Dropout-Rate优化了神经网络:

搜索空间比实际使用的值大得多。这节省了大量的时间,而不是网格搜索。
该实现的伪代码为:
def function(trial): #trials is the parameter of optuna, which selects the next hyperparameter
distribution = [0 , 1]
a = trials.uniform("a": distribution) #this is a uniform distribution
b = trials.uniform("a": distribution)
return (a*b)-b
#This above is the function which optuna tries to optimze/minimze有关更详细的源代码,请访问Optuna。这为我节省了很多时间,这真的是一个很好的结果。
发布于 2020-08-15 22:34:10
正如我在评论中提到的,我不是100%确定你在寻找什么,但这里有一个使用hyperopt来优化3个变量组合的例子:
import random
# define an objective function
def objective(args):
v1 = args['v1']
v2 = args['v2']
v3 = args['v3']
result = random.uniform(v2,v3)/v1
return result
# define a search space
from hyperopt import hp
space = {
'v1': hp.uniform('v1', 0.5,1.5),
'v2': hp.uniform('v2', 0.5,1.5),
'v3': hp.uniform('v3', 0.5,1.5),
}
# minimize the objective over the space
from hyperopt import fmin, tpe, space_eval
best = fmin(objective, space, algo=tpe.suggest, max_evals=100)
print(best)在这种情况下,它们都有相同的搜索空间(据我所知,这是您的问题定义)。Hyperopt的目标是最小化目标函数,因此运行该函数将使v2和v3接近最小值,v1接近最大值。因为这通常会最小化目标函数的结果。
发布于 2020-09-12 07:46:35
您可以使用此函数创建空间:
def get_spaces(a, b, num_spaces=9):
return_set = {}
for set_num in range(9):
name = str(set_num)
return_set = {
**return_set,
**{name: hp.uniform(name, a, b)}
}
return return_sethttps://stackoverflow.com/questions/63252552
复制相似问题