将验证/测试数据与训练数据混合是个好主意吗?

Posted

技术标签:

【中文标题】将验证/测试数据与训练数据混合是个好主意吗?【英文标题】:Is it a good idea to mix the validation / testing data with the training data? 【发布时间】:2020-11-08 08:04:34 【问题描述】:

我正在处理一个大型数据集(例如,对于单台机器来说很大)- 包含 1,000,000 个示例。

我将我的数据集拆分如下:(80% 训练数据,10% 验证数据,10% 测试数据)。每次我重新训练模型时,我都会先对数据进行洗牌 - 这样验证/测试集中的一些数据最终会进入训练集,反之亦然。)

我的想法是这样的:

    理想情况下,我希望模型能够学习所有可能的可用数据。越多越好 - 以提高准确性。 尽管 20% 的数据专用于验证和测试,但仍然是每件 100,000 个示例 - (即我可能会错过验证或测试集中存在的一些关键数据,而之前的训练集可能没有考虑。) 洗牌可防止训练集学习不重要的顺序(至少在我的特定数据集中)。

这是我的工作流程:

测试准确度或多或少等同于验证准确度(正负 0.5%)

每次再训练,结果通常会是这样:准确度不断提高(直到用完总时期),但验证准确度最终停留在特定百分比。然后我保存该模型。再次开始再培训过程。随机播放数据。训练准确率下降,但验证准确率上升。训练精度提高到总时期。验证准确度,向下收敛(仍高于前一次运行)。

参见示例:

我计划这样做,直到训练准确度数据达到 99%。 (注意:我使用 Keras-Tuner 为我的特定问题找到了最佳架构/模型)

我不禁想,我这样做是做错了什么。从我的角度来看,这只是最终学习所有 1,000,000 个示例的模型。感觉就像“轻度过度拟合”,因为每次重新训练都会改组。

我这样做有错吗?如果是这样,为什么我不应该使用这种方法?有没有更好的方法来解决这个问题?

【问题讨论】:

【参考方案1】:

如果您将测试/验证数据与训练数据混合在一起,则无法根据该数据评估您的模型,因为您的模型已经看到了该数据。模型评估的基础是它能够对您的模型未见过的数据进行预测/分类(假设您用于评估模型的数据来自与您的训练数据相同的分布)。如果您还将测试集数据与训练集数据混合,您最终将获得非常好的测试集准确性,因为您的模型已经看到了该数据,但它可能无法很好地处理来自同一分布的新的不可见数据。

如果您担心测试/验证数据的大小,我建议您进一步减小测试/验证数据的大小。使用 99.9% 而不是 99%。此外,随机洗牌将负责学习数据的几乎所有特征。

毕竟,我的观点是,永远不要根据之前看到的数据评估您的模型。它总是会给你更好的结果(假设你已经很好地训练了你的模型,直到它记住训练数据)。当您有多个算法/模型并且您需要从所有这些可用模型中选择一种算法/模型时,将使用验证数据。在这里,验证数据用于选择模型。选择在验证数据上提供良好结果的算法/模型(同样,您不会根据验证集准确性评估模型,它仅用于模型的选择。)一旦您根据验证集准确性选择了模型,然后您在新的未见数据(称为测试数据)上对其进行评估,并将测试数据的预测/分类准确度报告为您的模型准确度。

【讨论】:

以上是关于将验证/测试数据与训练数据混合是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

(何时)使用 FluentAssertions 是个好主意吗? [关闭]

软删除是个好主意吗? [复制]

直接在数据库上处理大量数据是个好主意吗?

将 Couchbase 与 Rails 一起使用是个好主意吗?

将一个更大的数据库表分成更多表是个好主意吗

将 mongodb 集合中的文档副本存储在字典列表中,并使用此数据而不是查询数据库是个好主意吗?