4

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

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)上进行验证

但是,当阅读有关 Kerasfit功能时,该文档又引入了 2 个术语:

validation_split:在 0 和 1 之间浮动。要用作验证数据的训练数据的一部分。该模型将分离这部分训练数据,不会对其进行训练,并将在每个 epoch 结束时评估该数据的损失和任何模型指标。在改组之前,从提供的 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和无吗?

    grid_result = validator.fit(train_images, train_labels, validation_data=None, validation_split=0)
    
  • 问题 3:如果我这样做了,在训练过程中会发生什么,Keras 会直接忽略验证步骤吗?

  • 问题 4:属于还是,或者它会被视为“测试集”(如 的情况),永远不会用于训练模型。validation_splitk-1 foldshold-out foldcross validation

4

1 回答 1

4

执行验证以确保模型不会在数据集上过度拟合,并且可以推广到新数据。由于在参数网格搜索中您也在进行验证,因此在训练期间无需通过 Keras 模型本身执行验证步骤。因此,回答您的问题:

是否有必要使用validation_split 或validation_data,因为我已经进行了交叉验证?

不,正如我上面提到的。

如果没有必要,那么我应该将validation_split 和validation_data 分别设置为0 和None 吗?

不,因为默认情况下在 Keras 中不进行验证(即默认情况下我们有validation_split=0.0, validation_data=None方法fit())。

如果我这样做了,训练期间会发生什么,Keras 会简单地忽略验证步骤吗?

是的,Keras 在训练模型时不会执行验证。但是请注意,正如我上面提到的,网格搜索过程将执行验证,以更好地估计具有特定参数集的模型的性能。

于 2018-11-07T13:41:45.097 回答