GridSearchCV:如何指定测试集?

时间:2016-11-11 10:37:57

标签: python scikit-learn cross-validation text-classification

我对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中再次使用交叉验证?

感谢您的澄清!!

2 个答案:

答案 0 :(得分:2)

  1. GridSearchCV并非用于衡量模型的性能,而是在训练时优化分类器的超参数。而且,当您编写gs_clf.fit时,实际上是在为寻求最佳超参数而对整个数据尝试不同的模型(但折痕不同)。例如,如果一个SVM模型有n个不同的c和m个gamma,则您有n X m个模型,并且正在搜索(网格搜索)它们以查看哪种方法最适合您的数据。
  2. 当您使用gs_clf.best_params_找到最佳模型时,便可以使用测试数据来获取模型的实际性能(例如,准确性,精度等)。
  3. 当然,只有到那时,才是测试模型的时候了。您的测试数据不得与训练模型所依据的数据有任何重叠。例如,您应该拥有corpus.traincorpus.test之类的东西,并且在完成训练并且只想测试最终模型时,应该仅在最后一轮保留corpus.test

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

答案 1 :(得分:-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)