是否需要将数据一分为三;训练、验证和测试?

Posted

技术标签:

【中文标题】是否需要将数据一分为三;训练、验证和测试?【英文标题】:Is it necessary to split data into three; train, val and test? 【发布时间】:2020-04-26 22:22:46 【问题描述】:

Here 描述了测试集、训练集和验证集的区别。在大多数关于训练神经网络的文档中,我发现使用了这三个集合,但它们通常是预定义的。

我有一个相对较小的数据集(总共 906 张 3D 图像,分布是平衡的)。我正在使用sklearn.model_selection.train_test_split 函数来拆分训练和测试集中的数据,并在我的模型中使用 X_test 和 y_test 作为验证数据。

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=1)
...
history = AD_model.fit(
    X_train, 
    y_train, 
    batch_size=batch_size,
    epochs=100,
    verbose=1,
    validation_data=(X_test, y_test))

训练后,我在测试集上评估模型:

test_loss, test_acc = AD_model.evaluate(X_test,  y_test, verbose=2)

我见过其他人也采用这种方法,但由于模型已经看到了这些数据,我不确定这种方法的后果是什么。有人能告诉我使用同一组进行验证和测试的后果是什么吗?而且由于我已经有一个小数据集(导致过度拟合),是否有必要将数据分成 3 组?

【问题讨论】:

结果是你的准确率会比“未知”数据更高,因为模型会“识别”数据并以更大的概率正确分类。 【参考方案1】:

您可以使用 train, validate, test = np.split(df.sample(frac=1), [int(.6*len(df)), int(.8*len(df))]) 它为训练、验证和测试集生成 60%、20%、20% 的拆分。

希望对您有帮助 感谢您的阅读!!

【讨论】:

【参考方案2】:

验证集可用于以下方面:

监控正在进行的训练模型在不属于训练集的数据上的性能。这可以帮助您验证您的模型是否正确训练并且没有过度拟合。 选择可提供最佳性能的超参数。 根据验证指标选择最佳快照/权重或停止时期。

验证和测试使用相同的集合将阻止您以不偏不倚的方式将您的模型与相同数据上的任何其他方法进行比较,因为选择了模型的超参数(和停止标准)以最大限度地提高该集合的性能.它还会使您的结果有点乐观,因为验证集(在其上选择模型)可能比看不见的测试集更容易。

【讨论】:

【参考方案3】:

这就是我的工作:

    将数据拆分为 %80 train 和 %20 test 集 使用训练数据,进行 5 折交叉验证。请注意,train 集也将再次拆分 %80-20,因为每个折叠中的交叉验证,但 CV 模块自己完成(例如 sklearn 的交叉验证)。这样您就不必手动再次拆分它了 每次折叠后,使用测试集评估模型 5 次折叠后,通过 CV 分数的均值和标准差,决定模型的准确度。您还可以添加分类报告、混淆矩阵、损失和准确度图等。

使用训练集、验证集和测试集的原因是一方面,模型使用训练数据训练自己,使用验证数据优化自己,在训练结束时我使用测试数据测试模型。

这就是为什么使用完整的单独测试集可以很好地确定模型的准确性是否足够令人满意:模型通过评估验证数据的误差来优化自身。如果您再次使用验证数据对其进行评估,那是不公平的,因为模型以前见过它。

对于您的情况,如果您可以设法平均拆分数据(test 集中每个类的数量相同),是的,拆分为 3 组仍然很好。

【讨论】:

以上是关于是否需要将数据一分为三;训练、验证和测试?的主要内容,如果未能解决你的问题,请参考以下文章

matlab怎么把数据集均匀分为训练,验证,测试数据集

机器学习之交叉验证和网格搜索

正确拆分数据集

如何将数据分成 3 组(训练、验证和测试)?

如何将数据分成 3 组(训练、验证和测试)?

如何将数据分成 3 组(训练、验证和测试)?