我对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_train
和Y_train
传递给gs_clf.fit
的代码。
但这对我没有意义:如果事先将语料库拆分,为什么要在GridSearchCV
中再次使用交叉验证?
感谢您的澄清!!
答案 0 :(得分:2)
GridSearchCV
并非用于衡量模型的性能,而是在训练时优化分类器的超参数。而且,当您编写gs_clf.fit
时,实际上是在为寻求最佳超参数而对整个数据尝试不同的模型(但折痕不同)。例如,如果一个SVM模型有n个不同的c
和m个gamma
,则您有n X m个模型,并且正在搜索(网格搜索)它们以查看哪种方法最适合您的数据。gs_clf.best_params_
找到最佳模型时,便可以使用测试数据来获取模型的实际性能(例如,准确性,精度等)。corpus.train
和corpus.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)