在GridSearchCV中避免特定参数组合

18
我正在使用scikit-learn的GridSearchCV来迭代一个参数空间,以调整模型。具体来说,我正在使用它来测试神经网络中的不同超参数。网格如下:
params = {'num_hidden_layers': [0,1,2],
          'hidden_layer_size': [64,128,256],
          'activation': ['sigmoid', 'relu', 'tanh']}

问题在于,当隐藏的num_hidden_layers设置为0时,我最终会运行冗余模型。它将会运行一个没有隐藏层的具有64个单元的模型,另一个具有128个单元的模型,以及另一个具有256个单元的模型。由于没有隐藏层,所有这些模型都是等价的。这非常低效,这意味着我需要编写更多的代码来消除结果中的冗余部分。
是否有一种方法可以防止这种参数组合的出现,例如通过传递参数的元组?

1
我应该补充说明,这个问题与此处提到的问题不同,用户想要跳过会生成错误的“禁止”组合:https://dev59.com/algQ5IYBdhLWcg3wSh91 - Tom Davidson
2个回答

29
sklearn文档建议使用两个参数网格。 因此,您可以执行以下操作:
param_grid = [
    {'num_hidden_layers': [1,2],
      'hidden_layer_size': [64,128,256],
      'activation': ['sigmoid', 'relu', 'tanh']},
    {'num_hidden_layers': [0],
      'hidden_layer_size': [64],
      'activation': ['sigmoid', 'relu', 'tanh']}
    ]

15

GridSearchCV可以让您将字典列表传递给params参数:

param_grid: 字典或字典列表

字典的键为参数名称(字符串),其值为要尝试的参数设置列表,或者这样的字典列表, 在此情况下,探索列表中每个字典跨越的网格。这使得可以搜索任何参数设置的序列。

因此,您可以指定这些字典为原始字典的某些子字典。这样,您可以避免无关的组合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接