0

在这个简化的示例中,我正在使用 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

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

4

2 回答 2

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 等)或不同类型的参数的测试结果。

于 2016-03-23T20:39:07.087 回答
0

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

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

但是,有一个实用程序可以在交叉验证下获得所有保留测试集的测试集预测:cross_val_predict. 同样,如果没有记忆,这将浪费地重新训练模型。还要注意,假设交叉验证的测试集.XX

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

于 2016-03-23T23:55:03.113 回答