GridSearchCV:如何指定测试集?

8

我有一个关于GridSearchCV的问题:

通过使用以下代码:

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

我指定要使用6折交叉验证,对吗?

这意味着我的语料库会被分成训练集和测试集,共进行6次。

那么这是否意味着在GridSearchCV中我需要使用整个语料库,如下所示:

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

如果是这样,我该如何使用训练集进行预测方法呢?请保留HTML标签。
predictions = gs_clf.predict(??)

我曾经见过的一些代码,将语料库使用train_test_split分成测试集和训练集,然后将X_trainY_train传递给gs_clf.fit

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

谢谢帮助澄清!!


2
这是一个非常好的问题,谢谢你提出来! - semblable
2个回答

17
  1. GridSearchCV 并非用于衡量模型表现,而是用于在训练过程中优化分类器的超参数。当你写下 gs_clf.fit 时,你实际上是在对整个数据集(但不同的折叠)尝试不同的模型,以寻求最佳的超参数。例如,如果你有n个不同的c和m个不同的gamma作为SVM模型的超参数,那么你就有n X m个模型,并且你正在通过它们进行网格搜索以查找哪一个在你的数据上效果最好。
  2. 当你使用 gs_clf.best_params_ 找到最佳模型后,就可以使用测试数据来获得模型的实际性能(例如准确率、精度等)。
  3. 当然,只有在这时才是测试模型的时间。你的测试数据不能与你训练模型所使用的数据有任何重叠。例如,你应该拥有像 corpus.traincorpus.test 这样的东西,并且应该将 corpus.test 保留到最后一轮,当你完成训练并且只想测试最终模型时再使用。

众所周知,在训练模型(应使用训练数据)或调整超参数(应使用验证数据)的过程中,任何对测试数据的使用都被认为是作弊行为,并导致不真实的性能表现。


-1

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

如果你想使用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)

但这不就是正在发生的事情吗?https://civisanalytics.com/blog/data-science/2016/01/06/workflows-python-using-pipeline-gridsearchcv-for-compact-code/. 如果我把所有数据都给分类器,那么我用什么来进行预测函数呢? - user3629892
是的,这似乎是在创建报告时使用的,在其中通过查准率和召回率来看准确性。顺便说一句,如果他们以这种方式进行测量,使用交叉验证就没有意义了。这是一种教育上的混合,但在现实世界中没有意义。当您拥有一个没有标签的新输入并且想要预测此输入的标签时,必须使用预测函数,我的意思是,当您想要进行预测时。 - Jose F. Gomez
好的,所以使用整个语料库并对新数据使用预测。我该如何从GridSearchCV中获取精确度、准确度和召回率?我无法从sklearn文档中找到如何做到这一点。 - user3629892
你必须创建一个评分器并将其分配给GridSearchCV的scoring参数,就像这个例子中一样:>>> 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) - Jose F. Gomez
我正在使用f1参数,就像这里所描述的那样http://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter。但这只是为了定义评分,对吧?我如何获得准确率、召回率和精度的实际值呢? - user3629892
1
基本上我想要一个classification_report,但是使用GridSearchCV而不是之后的预测。 - user3629892

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接