在使用GridSearchCV时,我是否需要拆分数据?

16

GridSearchCV使用StratifiedKFold或KFold。所以我的问题是,在使用GridSearch之前,是否应该将数据分成训练集和测试集,然后仅对测试数据进行拟合?我不确定是否有必要这样做,因为cv方法已经分割了数据,但我看到一些例子事先切分了数据。

谢谢。

1个回答

29

GridSearchCV会接受您提供的数据,将其分为训练集和CV集,并使用CV集搜索最佳超参数来训练算法。您可以指定不同的拆分策略(例如拆分比例)。

但是,在进行超参数调整时,数据集的信息仍然会“泄漏”到算法中。

因此,我建议采取以下方法:

1)将原始数据集保留一部分作为测试集(例如10%)

2)在剩余的90%上使用网格搜索。这里的拆分将由算法自行完成。

3)在#1中使用测试集测试得到最佳超参数后,可对新数据的性能进行最终估计。


2
既然GridSearchCV已经做了交叉验证,那么在整个训练数据集上执行GridSearchCV不是更好吗?一旦搜索完成,就可以使用找到的分类器来拟合和预测训练测试数据集分裂。 - fjsj
4
@fjsj 的观点是合理的,但在进行网格搜索过程中,一些关于数据集的信息会泄漏到超参数中。为了获得最终的、无偏的性能评估结果,需要保留一部分从未被拟合分类器看到的数据样本,无论是直接还是间接地。如果你正在对时间序列数据进行预测,这一点尤其重要——最好在1月至11月的数据上进行搜索,然后在12月的数据上进行最终测试,以获得真实的性能评估结果。 - Maksim Khaitovich
1
@MaksimKhaitovich - 在某些地方我看到了你答案的一个变种:人们从gs中获取best_params,然后使用它们对整个数据集(包括测试部分)调用fit(),然后再调用predict(); 基本上,在gs的一次配合下,调用fit()两次,之后再在gs的外部进行一次。你认为这样做有意义吗? - Jack Fleeting
2
@JackFleeting 不确定问题的性质。我的意思是,如果您将fit作为GS的一部分进行调用,则使用您使用的数据子集找到最佳超参数(或者如果您正在对大量子集进行Kfold以获取最佳超参数的估计)。第二次调用fit时,您将覆盖整个训练数据集。 - Maksim Khaitovich

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