【问题标题】:Failure to reproduce GridSearch from sklearn in python无法从 python 中的 sklearn 重现 GridSearch
【发布时间】:2017-01-04 08:26:28
【问题描述】:

我正在尝试在 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 次。似乎发生了一些混叠。

【问题讨论】:

    标签: python scikit-learn grid-search


    【解决方案1】:

    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
    

    【讨论】:

    • 嗨,仅作为附加信息:我使用了randomizedSearchCV,并且执行grid.predict() 相当于执行grid.best_estimator_.predict()。这是因为 sklearn 假设当 .best_estimator_ 属性存在时,模型就会被训练。否则它没有经过训练,所以用它进行预测是毫无意义的。因此,grid.predict() 直接实例化为.best_estimator_ 对象。真的我不知道gridSearchCV 是否也会发生这种逻辑。
    猜你喜欢
    • 2017-11-22
    • 2018-12-11
    • 2016-09-19
    • 2019-06-02
    • 2018-02-17
    • 2018-05-15
    • 2020-02-20
    • 2016-05-12
    • 1970-01-01
    相关资源
    最近更新 更多