在Keras中进行交叉验证与使用validation_data/validation_split的区别

首先,我将数据集分为训练集和测试集,例如:

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_splitvalidation_data
  • 第二个问题:如果没有必要,那么我应该将validation_splitvalidation_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在训练模型时不会执行验证。然而请注意,正如我上面提到的,网格搜索过程会进行验证,以更好地估计模型在特定参数集下的性能。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注