1

我正在尝试在 sklearn 中执行类似于 GridSearch 的操作:我想获取三个模型的列表,其中所有参数都是固定的,除了对应于每个模型中的 1、10 和 100 的 C。我有以下两个功能。

def params_GridSearch(dic_params):
    keys, values = dic_params.keys(), dic_params.values()
    lst_params = []
    for vs in itertools.product(*values):
        lst_params.append( {k:v for k,v in zip(keys,vs)} )
    return lst_params

def models_GridSearch(model, dic_params):
    models = [ model.set_params(**params) for params in params_GridSearch(dic_params) ]
    return models

然后我建立一个模型并指定一个参数字典。

from sklearn.svm import SVC
model = SVC()
dic = {'C': [1,10,100]}

并使用我刚刚定义的函数生成模型。

models = models_GridSearch(model, dic)

然而,结果是相同的模型(使用最后一个参数,即 100)被重复 3 次。似乎发生了一些混叠。

4

1 回答 1

3

model在 中的列表理解的每次迭代中都引用同一个对象model_GridSearch,因此您只需C为同一个对象分配一个值 3 次。您可以做一些不同的事情来解决这个问题:您可以使用copy模块复制对象,或者将类传入models_GridSearch函数而不是实例,并在每次迭代时实例化一个对象。您还可以通过各种方式重构您的代码来修复问题。这一切都取决于你的目标。

复制方法:

import copy

def models_GridSearch(model, dic_params):
    models = [ copy.deepcopy(model).set_params(**params) for params in params_GridSearch(dic_params) ]
    return models

上课通过:

def models_GridSearch(Model, dic_params):
    models = [ Model().set_params(**params) for params in params_GridSearch(dic_params) ]
    return models


from sklearn.svm import SVC
Model = SVC
dic = {'C': [1,10,100]}

models = models_GridSearch(Model, dic)
print models
于 2016-08-28T05:12:22.057 回答