Keras的fit函数的validation_split参数是如何工作的?

数据挖掘 喀拉斯 数据 交叉验证
2021-10-06 21:16:09

Keras Sequential 模型拟合函数中的验证拆分在https://keras.io/models/sequential/上记录如下:

validation_split:在 0 和 1 之间浮动。要用作验证数据的训练数据的一部分。该模型将分离这部分训练数据,不会对其进行训练,并将在每个 epoch 结束时评估该数据的损失和任何模型指标。在改组之前,从提供的 x 和 y 数据中的最后一个样本中选择验证数据。

请注意最后一行:

在改组之前,从提供的 x 和 y 数据中的最后一个样本中选择验证数据。

这是否意味着验证数据始终是固定的并取自主数据集的底部?

有什么方法可以从主数据集中随机选择给定的数据部分?

2个回答

您实际上不想在每个 epoch 之后重新采样您的验证集。如果您这样做,您的模型将在数据集中的每个样本上进行训练,因此这将导致过度拟合。您希望始终在训练过程之前拆分数据,然后只应使用数据子集对算法进行训练以进行训练。

设计的功能确保数据以这样一种方式分离,即它始终在每个时期的数据的相同部分上进行训练。如果选择了该选项,则所有改组都在 epoch 之间的训练样本内完成。

但是,对于某些数据集,获取最后几个实例是没有用的,特别是如果数据集是基于类重新组合的。那么你的班级分布就会出现偏差。因此,您将需要某种随机方式来提取数据的子集,以在训练和验证集中获得平衡的类分布。为此,我总是喜欢使用 sklearn 函数,如下所示

from sklearn.model_selection import train_test_split

# Split the data
x_train, x_valid, y_train, y_valid = train_test_split(data, labels, test_size=0.33, shuffle= True)

这是一个很好的易于使用的功能,可以满足您的需求。变量datalabels是标准的 numpy 矩阵,第一维是实例。

按照 JahKnows 的回答,我应该指出,如果您想要一个改组后选择的固定验证数据集,您可以使用该train_test_split方法获取单独的验证数据集,然后使用方法validation_data中的参数fit而不是validation_split,并指向x 和 y 的验证数据。

如果您想要验证和测试数据集,您可以使用该train_test_split方法两次,如下所示:

from sklearn.model_selection import train_test_split

# Separate the test data
x, x_test, y, y_test = train_test_split(x, y, test_size=0.15, shuffle=True)

# Split the remaining data to train and validation
x_train, x_val, y_train, y_val = train_test_split(x, y, test_size=0.15, shuffle=True)

...

# Training the Keras model
the_model.fit(x=x_train, y=y_train, batch_size=64, epochs=100, validation_data=(x_val, y_val))