首先,我将数据集分为训练集和测试集,例如:
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.4, random_state=999)
然后,我使用GridSearchCV
进行交叉验证以找到性能最佳的模型:
validator = GridSearchCV(estimator=clf, param_grid=param_grid, scoring="accuracy", cv=cv)
通过这种方式,我得到了:
模型使用k-1个折叠作为训练数据进行训练;所得模型在剩余数据上进行验证(scikit-learn.org)
但是,当阅读关于Keras的fit
函数的文档时,文档介绍了两个新的术语:
validation_split:介于0和1之间的浮点数。训练数据中用作验证数据的比例。模型会将训练数据中的这一部分分离出来,不在其上进行训练,并在每个周期结束时评估该数据上的损失和任何模型指标。验证数据是从提供的x和y数据的最后几个样本中选取的,在洗牌之前。
validation_data:元组(x_val, y_val)或元组(x_val, y_val, val_sample_weights),用于在每个周期结束时评估损失和任何模型指标。模型不会在这些数据上进行训练。validation_data将覆盖validation_split。
据我所知,validation_split
(将被validation_data
覆盖)将被用作一个不变的验证数据集,而交叉验证中的保留集在每个交叉验证步骤中会发生变化。
- 第一个问题:既然我已经在做交叉验证,是否有必要使用
validation_split
或validation_data
? -
第二个问题:如果没有必要,那么我应该将
validation_split
和validation_data
分别设置为0和None吗?grid_result = validator.fit(train_images, train_labels, validation_data=None, validation_split=0)
-
第三个问题:如果我这样做,训练过程中会发生什么,Keras会简单地忽略验证步骤吗?
-
第四个问题:
validation_split
是属于k-1折叠
还是保留折叠
,或者它会被视为“测试集”(如交叉验证
的情况),永远不会用于训练模型。
回答:
验证是为了确保模型不会在数据集上过拟合,并且能够泛化到新数据。由于在参数网格搜索中你也在进行验证,因此没有必要让Keras模型在训练期间自己执行验证步骤。因此,回答你的问题:
既然我已经在做交叉验证,是否有必要使用validation_split或validation_data?
不需要,正如我上面提到的。
如果没有必要,那么我应该将validation_split和validation_data分别设置为0和None吗?
不需要,因为在Keras中默认情况下不进行验证(即在fit()
方法中默认我们有validation_split=0.0, validation_data=None
)。
如果我这样做,训练过程中会发生什么,Keras会简单地忽略验证步骤吗?
是的,Keras在训练模型时不会执行验证。然而请注意,正如我上面提到的,网格搜索过程会进行验证,以更好地估计模型在特定参数集下的性能。