GridSearchCV:如何指定测试集?

GridSearchCV: How to specify test set?

我有一个关于 GridSearchCV 的问题:

通过使用这个:

gs_clf = GridSearchCV(pipeline, parameters, n_jobs=-1, cv=6, scoring="f1")

我指定 k 折交叉验证应该使用 6 折对吗?

这意味着我的语料库分为训练集和 tet 集 6 次。

这是否意味着 GridSearchCV 我需要使用我的整个语料库,就像这样:

gs_clf = gs_clf.fit(corpus.data, corpus.target)

如果是这样,我将如何从那里获得用于预测方法的训练集?

predictions = gs_clf.predict(??)

我看到代码使用 train_test_split 将语料库分成测试集和训练集,然后将 X_trainY_train 传递给 gs_clf.fit

但这对我来说没有意义:如果我事先将它拆分为语料库,为什么还要在 GridSearchCV 中再次使用交叉验证?

感谢您的澄清!!

交叉验证和测试百分位数是衡量算法准确性的不同方法。交叉验证会按照您所说的进行。然后,您必须将所有数据提供给分类器。使用交叉验证时拆分数据根本没有意义。

如果您想使用 GridSearchCV 测量精确度或召回率,您必须创建一个 scorer 并将其分配给 GridSearchCV 的评分参数,如本例所示:

>>> from sklearn.metrics import fbeta_score, make_scorer
>>> ftwo_scorer = make_scorer(fbeta_score, beta=2)
>>> from sklearn.model_selection import GridSearchCV
>>> from sklearn.svm import LinearSVC
>>> grid = GridSearchCV(LinearSVC(), param_grid={'C': [1, 10]}, scoring=ftwo_scorer)
  1. GridSearchCV 不是为了衡量模型的性能而设计的,而是为了在训练时优化分类器的超参数。当你写 gs_clf.fit 时,你实际上是在对你的整个数据(但不同的折叠)尝试不同的模型,以追求最好的超参数。例如,如果一个 SVM 模型有 n 个不同的 c 和 m 个不同的 gamma,那么你有 n X m 个模型并且你正在搜索(网格搜索)它们以查看哪一个最适合您的数据。
  2. 当您使用 gs_clf.best_params_ 找到最佳模型后,您就可以使用测试数据来获得模型的实际性能(例如准确度、精度等)。
  3. 当然,只有到那时才能测试模型。您的测试数据不得与您训练模型所依据的数据有任何重叠。例如,你应该有类似 corpus.traincorpus.test 的东西,你应该只为最后一轮保留 corpus.test 当你完成训练并且你只想测试最终模型时。

众所周知,在训练模型(应该使用训练数据的地方)或调整超参数(应该使用验证数据的地方)的过程中,任何使用测试数据的行为都被认为是作弊和结果在不切实际的表现中。