我有一个大型数据集,分成了三个部分(训练-验证-测试)。我想进行交叉验证(CV),由于数据集很大,在整个数据集上进行CV会花费很长时间。应该在哪个分区上进行CV呢?我看到一些教程只使用训练集,另一些只使用验证集,还有一些使用整个数据集。
感谢任何澄清或帮助。
回答:
为了简化问题,我们假设你只有一个超参数。如果你想进行交叉验证,你会选择N
个不同的超参数值,并在训练集上训练N
个不同的模型。然后,你会在验证集上选择表现最佳的超参数。接着,你会使用选定的超参数,在训练集和验证集上重新训练模型。然后在测试集上评估模型的表现。
如果你的数据集非常大,你可以选择一个小子集,找到最优的超参数,并继续增加子集大小,直到你能推断出在完整数据集大小下的最优超参数。在实践中,你通常可以选择尽可能大的子集,并使用该子集的最优超参数。
编辑:
如果你使用scikit-learn,以下是一个假设的model
和超参数C
的伪代码:
from sklearn.model_selection import GridSearchCV# X_train, X_test是训练和测试特征# Y_train, Y_test是相应的标签/值需要预测的。# model是某个scikit-learn回归或分类模型# 创建参数网格param_grid = {'C': [0.1, 1, 5, 15, 100]}# 执行二折CV。你可以通过传递# 一个交叉验证生成器来执行其他类型的CVestimator = GridSearchCV(model, cv=2, param_grid=param_grid)# 执行下面的交叉验证过程estimator.fit(X_train, Y_train)
当你运行fit方法时,会将你的训练集(X_train, Y_train)
分为两部分。然后,你使用数据的前半部分训练模型,设置C=0.1
,并在后半部分评估性能。在这种情况下,前半部分是训练集,后半部分是验证集。之后,你重复这个过程,但使用后半部分作为训练集,前半部分作为验证集。然后,性能会被平均并存储起来。
然后,你对C
的剩余值重复这个过程。然后,你检查哪个C
值能提供最佳的预测准确率。该值随后被用来在整个训练集(X_train, Y_train)
上训练最终模型。模型的性能可以通过以下方式在留出的测试集上评估:
score = estimator.score(X_test, Y_test)