在这个简化的例子中,我正在使用GridSearchCV训练Logistic回归 . 和往常一样,我希望模型能够很好地概括,所以我想仔细研究测试集的结果 . 使用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
我想进一步分析模型没有训练的例子(例如查看它们的混淆矩阵),但由于交叉验证是透明的,我不能选择那些例子 . 我可以做一个新的火车测试 - 拆分和再培训,但这看起来很浪费 .
2 回答
这个问题是当你实例化
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等)或不同类型的参数的测试结果 .解释你的措辞有点难 . 但我怀疑你想要的是检查最佳参数,在相应测试部分的交叉验证下,在训练数据的某些部分上拟合的每个模型的预测 .
无论好坏,
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)