我有一个大数据集,该数据集分为三个块(训练验证测试)。而且我想执行交叉验证(CV),因为我有一个很大的数据集,所以对整个数据集执行CV将花费很长时间。什么是执行CV的正确分区?我看过一些仅使用训练划分的教程,而另一些仅使用验证划分的教程,而另一些则使用了整个数据集。
感谢您的澄清或帮助。
答案 0 :(得分:0)
为简化起见,我们假设您只有一个超参数。如果要进行交叉验证,则可以选择N
不同的超参数值,并在训练集上训练N
不同的模型。然后,您将选择在验证集上具有最佳性能的超参数。然后,您将使用选定的超参数使用训练集和验证集来重新训练模型。然后在测试集上评估模型性能。
如果数据集很大,则可以选择一个小的子集,找到最佳超参数,然后继续增加该子集,直到可以推断出在整个数据集大小下最佳超参数将是什么。在实践中,您常常会烦恼地选择一个较大的子集,而只为该子集使用最佳超参数。
编辑:
如果您使用scikit-learn,这是一个假设的model
的伪代码,它具有超参数C
:
from sklearn.model_selection import GridSearchCV
# X_train, X_test are the train and test features
# Y_train, Y_test are the corresponding labels/values to predict.
# model is some scikit-learn regression or classification model
# Create a parameter grid
param_grid = {'C': [0.1, 1, 5, 15, 100]}
# Do two fold CV. You can do other types of CV as well by passing
# a cross-validation generator
estimator = GridSearchCV(model, cv=2, param_grid=param_grid)
# Do the cross validation procedure explained below
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)