如何将 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