在 python 中无法从 sklearn 重现 GridSearch
Failure to reproduce GridSearch from sklearn in python
我正在尝试做一些类似于 sklearn 中的 GridSearch 的事情:我想获得三个模型的列表,其中所有参数都是固定的,除了 C 对应于每个模型中的 1、10 和 100。我有以下两个功能。
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 次。似乎正在发生一些混叠。
model
在 model_GridSearch
中的列表理解的每次迭代中都指代同一个对象,因此您只需将 C
值分配给同一个对象 3 次。你可以做一些不同的事情来解决这个问题:你可以使用 copy
模块复制对象,或者将 class 传递给 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
传入class:
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
我正在尝试做一些类似于 sklearn 中的 GridSearch 的事情:我想获得三个模型的列表,其中所有参数都是固定的,除了 C 对应于每个模型中的 1、10 和 100。我有以下两个功能。
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 次。似乎正在发生一些混叠。
model
在 model_GridSearch
中的列表理解的每次迭代中都指代同一个对象,因此您只需将 C
值分配给同一个对象 3 次。你可以做一些不同的事情来解决这个问题:你可以使用 copy
模块复制对象,或者将 class 传递给 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
传入class:
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