在这个简化的例子中,我正在用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
我想进一步分析模型没有训练的例子(例如,查看他们的混淆矩阵),但由于交叉验证是透明的,我无法选择这些例子。我可以做一个新的火车测试,分开再培训,但这似乎很浪费。
这个问题是,当实例化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_testrongplit.html#sklearn.cross_validation.train_testrongplit)然后在你分开的火车部分呼叫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)