【问题标题】:Scikit: Is there a way to get back all the untrained items (the test set) from the best estimator when using GridSearchCV?Scikit:在使用 GridSearchCV 时,有没有办法从最佳估计器中取回所有未经训练的项目(测试集)?
【发布时间】:2016-07-11 01:12:34
【问题描述】:

在这个简化的示例中,我正在使用 GridSearchCV 训练逻辑回归。与往常一样,我希望模型能够很好地泛化,因此我想仔细查看 测试集 结果。使用 GridSearchCV 时,我找不到简单的方法。

lr_pipeline = Pipeline([('clf', LogisticRegression())])
lr_parameters = {'clf__fit_intercept':[True,False]}

lr_gs = GridSearchCV(lr_pipeline, lr_parameters)
lr_gs = lr_gs.fit(X,y)
lr_gs.best_estimator_.test_set # would like to be able to do something like this

我想进一步分析模型未训练的示例(例如查看他们的混淆矩阵),但由于交叉验证透明地发生,我无法选择这些示例。我可以进行新的训练测试拆分并重新训练,但这似乎很浪费。

【问题讨论】:

    标签: python scikit-learn cross-validation grid-search


    【解决方案1】:

    这样做的问题是当你实例化一个GridSearchCV 对象时,它有一个名为refit=True 的默认参数。根据文档 (http://scikit-learn.org/stable/modules/generated/sklearn.grid_search.GridSearchCV.html#sklearn.grid_search.GridSearchCV),此参数意味着模型会在您的整个数据集上自动重新训练(X,正如您在此处定义的那样)。因此,根据定义,模型在所有数据上进行训练,并且没有保留的测试数据。

    如果您想要保留测试数据但仍想使用 GridSearchCV,您可以做的是首先创建一个训练测试拆分 (http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html#sklearn.cross_validation.train_test_split),然后在拆分的训练部分调用 GridSearchCV .然后,您可以比较不同类型搜索(如 RandomSearchCV 等)或不同类型参数的测试结果。

    【讨论】:

      【解决方案2】:

      您的措辞有点难以理解。但我怀疑您想要检查最佳参数,每个模型的预测拟合在相应测试部分的交叉验证下的训练数据的某些部分。

      无论好坏,GridSearchCV 实现都会丢弃拟合模型以及用于对其进行评分的测试结果(尽管您可以将估算器包装在一个类中,如果您真的想要这样做)。

      但是,有一个实用程序可以获取交叉验证下所有保留测试集的测试集预测:cross_val_predict。同样,如果没有记忆,这将浪费地重新训练模型。另请注意,假设交叉验证的测试集是X 的一个分区,这将返回X每个 实例的预测。

      您可以简单地使用cross_val_predict(lr_gs.best_estimator_, X, y, cv=lr_gs.cv, n_jobs=lr_gs.n_jobs)

      【讨论】:

        猜你喜欢
        • 2019-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-22
        • 2018-07-01
        • 2021-07-26
        相关资源
        最近更新 更多