如何将 Enum 传递给 ParameterGrid?
How to pass Enum to ParameterGrid?
我想将几个参数传递给一个应该通过超参数和 multiprocessing
优化的函数。
如果将 Enum
作为参数传递,则会失败。请参阅下面的代码。
在这种情况下如何传递 Enum
?
from sklearn.model_selection import ParameterGrid
from multiprocessing import Pool
from enum import Enum
class MyStrategy(Enum):
var1 = 1
var2 = 2
var1 = MyStrategy(1)
var2 = MyStrategy(2)
abc = [1, 2]
xyz = [3, 4]
if True:
pg = [{'variant': var1,
'abc': abc,
'xyz': xyz, },
{'variant': var2,
'abc': abc, }]
else:
pg = [{'variant': '1',
'abc': abc,
'xyz': xyz, },
{'variant': '2',
'abc': abc, }]
parameterGrid = ParameterGrid(pg)
def myFunc(myParam):
print(myParam)
pool = Pool(1)
myList = pool.map(myFunc, parameterGrid)
如果 False
:
有效
{'abc': 1, 'variant': '1', 'xyz': 3}
{'abc': 1, 'variant': '1', 'xyz': 4}
{'abc': 2, 'variant': '1', 'xyz': 3}
{'abc': 2, 'variant': '1', 'xyz': 4}
{'abc': 1, 'variant': '2'}
{'abc': 2, 'variant': '2'}
并失败 True
:
TypeError: object of type 'MyStrategy' has no len()
在 True
示例中,在 pg
词典列表中, 值 和 'variant'
键是类型<enum 'MyStrategy'>
。在 False
示例中输入 str
.
要使用枚举器复制 False
变体,您必须更改以下内容:
class MyStrategy(Enum):
var1 = '1'
var2 = '2'
pg = [{'variant': MyStrategy('1').value, # Or MyStrategy.var1.value
'abc': abc,
'xyz': xyz, },
{'variant': MyStrategy('2').value, # Or MyStrategy.var2.value
'abc': abc, }]
首先,您需要将枚举中的值更改为字符串,因为这与您在 False
块中用于 variant
键的数据类型相同。像这样
from sklearn.model_selection import ParameterGrid
from multiprocessing import Pool
from enum import Enum
class MyStrategy(Enum):
var1 = '1' #<--------Notice the value is string not int
var2 = '2'
接下来,使用这样的值:
var1 = MyStrategy.var1.value
var2 = MyStrategy.var2.value
我想将几个参数传递给一个应该通过超参数和 multiprocessing
优化的函数。
如果将 Enum
作为参数传递,则会失败。请参阅下面的代码。
在这种情况下如何传递 Enum
?
from sklearn.model_selection import ParameterGrid
from multiprocessing import Pool
from enum import Enum
class MyStrategy(Enum):
var1 = 1
var2 = 2
var1 = MyStrategy(1)
var2 = MyStrategy(2)
abc = [1, 2]
xyz = [3, 4]
if True:
pg = [{'variant': var1,
'abc': abc,
'xyz': xyz, },
{'variant': var2,
'abc': abc, }]
else:
pg = [{'variant': '1',
'abc': abc,
'xyz': xyz, },
{'variant': '2',
'abc': abc, }]
parameterGrid = ParameterGrid(pg)
def myFunc(myParam):
print(myParam)
pool = Pool(1)
myList = pool.map(myFunc, parameterGrid)
如果 False
:
{'abc': 1, 'variant': '1', 'xyz': 3}
{'abc': 1, 'variant': '1', 'xyz': 4}
{'abc': 2, 'variant': '1', 'xyz': 3}
{'abc': 2, 'variant': '1', 'xyz': 4}
{'abc': 1, 'variant': '2'}
{'abc': 2, 'variant': '2'}
并失败 True
:
TypeError: object of type 'MyStrategy' has no len()
在 True
示例中,在 pg
词典列表中, 值 和 'variant'
键是类型<enum 'MyStrategy'>
。在 False
示例中输入 str
.
要使用枚举器复制 False
变体,您必须更改以下内容:
class MyStrategy(Enum):
var1 = '1'
var2 = '2'
pg = [{'variant': MyStrategy('1').value, # Or MyStrategy.var1.value
'abc': abc,
'xyz': xyz, },
{'variant': MyStrategy('2').value, # Or MyStrategy.var2.value
'abc': abc, }]
首先,您需要将枚举中的值更改为字符串,因为这与您在 False
块中用于 variant
键的数据类型相同。像这样
from sklearn.model_selection import ParameterGrid
from multiprocessing import Pool
from enum import Enum
class MyStrategy(Enum):
var1 = '1' #<--------Notice the value is string not int
var2 = '2'
接下来,使用这样的值:
var1 = MyStrategy.var1.value
var2 = MyStrategy.var2.value