Python 3.x 每个hyperparameter的值的Hyperopt列表

Python 3.x 每个hyperparameter的值的Hyperopt列表,python-3.x,mathematical-optimization,hyperopt,Python 3.x,Mathematical Optimization,Hyperopt,我试图在一个回归模型上使用,这样它的一个超参数是为每个变量定义的,并且需要作为列表传递。例如,如果我有一个包含3个自变量(不包括常数)的回归,我将传递hyperparameter=[x,y,z](其中x,y,z是浮点数) 无论应用于哪个变量,此超参数的值都具有相同的边界。如果这个超参数应用于所有变量,我可以简单地使用hp.uniform('hyperparameter',a,b)。我希望搜索空间是长度n的hp.uniform('hyperparameter',a,b)的笛卡尔积,其中n是回归中的

我试图在一个回归模型上使用,这样它的一个超参数是为每个变量定义的,并且需要作为列表传递。例如,如果我有一个包含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中是否可行。如果没有,欢迎对可能的优化器提出任何建议。

您好,所以我用optuna实现了这个解决方案。optuna的优点是,它将为所有单个值创建一个超空间,但会以更智能的方式优化这些值,并且只使用一个超参数优化。例如,我用批量大小、学习率和辍学率优化了一个神经网络:

搜索空间比实际使用的值大得多。这比网格搜索节省了很多时间

实现的伪代码是:

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

有关更详细的源代码,请访问。这为我节省了很多时间,而且效果非常好。

正如我在评论中所指出的,我不能100%确定您在寻找什么,但下面是一个使用hyperopt优化3个变量组合的示例:

随机导入
#定义目标函数
def目标(args):
v1=args['v1']
v2=args['v2']
v3=args['v3']
结果=随机、均匀(v2、v3)/v1
返回结果
#定义搜索空间
从hyperopt导入hp
空格={
“v1”:惠普统一标准('v1',0.5,1.5),
“v2”:马力均匀('v2',0.5,1.5),
“v3”:hp.uniform('v3',0.5,1.5),
}
#最小化空间上的目标
从hyperopt导入fmin、tpe、空间评估
最佳=fmin(目标,空间,算法=tpe.suggest,最大评估=100)
打印(最佳)

在这种情况下,它们都有相同的搜索空间(据我所知,这是您的问题定义)。Hyperopt的目标是最小化目标函数,因此运行它将使v2和v3接近最小值,而v1接近最大值。因为这通常会最小化目标函数的结果。

您可以使用此函数创建空间:

def get_spaces(a、b、num_spaces=9):
return_set={}
对于范围(9)中的set_num:
name=str(set_num)
返回_集={
**返回集合,
**{name:hp.uniform(name,a,b)}
}
返回集

那么你想进行网格搜索,或者你对笛卡尔积的意思是什么?网格搜索只是搜索空间的众多优化方法之一,所以我不知道你为什么要特别询问它。你让它听起来像是搜索空间的选择取决于优化方法。对不起,我有点困惑,你想要实现什么。你想要一个动态的hyperopt搜索空间,你只需要为一个变量定义一个搜索空间,它会自动为你的回归的所有变量实现它?好的,这里有一个例子:假设我们有一个二进制(为了简单)超参数,可以是0或1。如果它应用于所有变量,则搜索空间将为[[0]、[1]]。相反,我想要的是它可以单独应用于每个变量。假设我们有两个变量,那么搜索空间将是[[0,0],[0,1],[1,0],[1,1]]。这在使用gridsearch时很容易实现(您不需要Hyperopt),但评估所有点的成本很高,所以我想使用更有效的方法,如贝叶斯优化(在本例中为Hyperopt.tpe),好吧,我希望我的方法是正确的。我会回答的。