【问题标题】:GridSearchCV: How to specify test set?GridSearchCV:如何指定测试集?
【发布时间】:2017-03-25 13:51:56
【问题描述】:

我有一个关于GridSearchCV的问题:

通过使用这个:

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

我指定k-fold交叉验证应该用6折对吧?

这意味着我的语料库被分为训练集和测试集 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 中再次使用交叉验证?

感谢您的澄清!

【问题讨论】:

  • 这是一个很好的问题;谢谢你把它放在那里!

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


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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 但这不是这里发生的事情吗? civisanalytics.com/blog/data-science/2016/01/06/…。如果我把所有的数据都给分类器,我用什么来预测函数?
    • 是的,似乎是这样,并且在他们创建报告以通过精确度和召回率查看准确性时使用。顺便说一句,如果他们以这种方式进行测量,那么使用交叉验证是没有意义的。是某种教育混合,但在现实世界中毫无意义。当你有一个没有标签的新输入并且你想预测这个输入的标签时,你必须使用预测函数,我说,当你想进行预测时。
    • 好的,所以使用整个语料库并对新数据使用预测。我如何从 GridSearchCV 获得精度、准确度和召回率?我不知道如何从 sklearn 文档中执行此操作。
    • 你必须创建一个 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)
    • 基本上我想要一个分类报告,但使用 GridSearchCV 而不是之后的预测。
    猜你喜欢
    • 2018-07-01
    • 1970-01-01
    • 2013-06-16
    • 2017-04-06
    • 2019-05-19
    • 2018-09-12
    • 2019-09-18
    • 2019-09-05
    • 2021-12-03
    相关资源
    最近更新 更多