GridSearchCV是否执行交叉验证?

25

我目前正在解决一个问题,比较三种不同的机器学习算法在相同数据集上的表现。我将数据集分为70/30的训练/测试集,然后使用GridSearchCV和X_train, y_train寻找每个算法的最佳参数。

第一个问题是,我应该在训练集上执行网格搜索,还是整个数据集上执行?

第二个问题是,我知道GridSearchCV在其实现中使用K-fold,如果我在GridSearchCV中对比了三种算法并使用相同的X_train, y_train,那么这是否意味着我进行了交叉验证?

非常感谢您的回答。

2个回答

52

scikit中所有名称以CV结尾的估计器都执行交叉验证。 但您需要保留一个单独的测试集来衡量性能。

因此,您需要将整个数据分成训练集和测试集。暂时忘记这个测试数据。

然后仅将此训练数据传递给GridSearch。 GridSearch将进一步将此训练数据分成训练集和测试集,以调整传递给它的超参数。最后,在找到的最佳参数下在整个训练数据上拟合模型。

现在,您需要在一开始保留的测试数据上测试此模型。这将为您提供模型的近似实际性能。

如果您将整个数据用于GridSearchCV,则会将测试数据泄漏到参数调整中,那么最终模型可能在新的未见数据上表现不佳。

您可以查看我的其他回答,其中更详细地描述了GridSearch:


GridSearchCV有一个参数cv,你可以在其中指定要使用的CV折叠数。这是否意味着例如当我有10个可能的超参数组合要测试时,GridSearchCV通过使用5倍交叉验证测试所有这些组合(因此基本上是10x 5倍交叉验证)? - Psychotechnopath
2
@Psychotechnopath 是的。这将在网格搜索开始时打印出来。您可以在GridSearchCV中使用verbose参数获取更多详细信息。 - Vivek Kumar
假设我想使用2个折叠,并且我正在处理时间序列。首先,我需要拆分我的数据集,例如,使用tscv = TimeSeriesSplit()TimeSeriesSplit()已经为这两个折叠(我们称之为train1/test1和train2/test2)提供了训练/测试集。然后,我可以将此参数tscv传递给GridSearchCV(..., cv=tscv, ...),它将再次将我从TimeSeriesSplit中获得的训练部分(train1和train2)拆分为“较小”的训练/验证集(smalltrain1/validation1和smalltrain2/validation2)来训练和评估我的模型? - Murilo
@MuriloAraujoSouza 不会,它将使用tscv给出的相同拆分。或者您是说首先将数据分成训练集和测试集,然后仅将训练数据与tscv一起传递到gridsearch中?如果是的话,那么它将把您的原始训练数据集分成更小的训练集和验证集。 - Vivek Kumar
我正在使用tscv = TimeSeriesSplit(n_splits = 2),然后进行grid_search_RF = GridSearchCV(estimator=RandomForestClassifier(), param_grid=param_RF, cv = tscv),最后在整个数据集上拟合我的模型grid_search_RF.fit(x, y)。不太确定这些是否是正确的步骤。 - Murilo
@MuriloAraujoSouza 在这种情况下,您的数据集根据gridsearchCV中的tscv进行了拆分。 - Vivek Kumar

7

是的,GridSearchCV执行交叉验证。如果我正确理解这个概念 - 您希望将数据集的一部分保留给模型以进行测试。

因此,您将在训练数据集上训练您的模型,然后在测试数据集上测试它们。

这里我几乎做了同样的事情 - 您可能想要检查一下...


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