如果分别对测试数据和训练数据进行归一化,为什么模型表现更好?

数据挖掘 机器学习 神经网络 监督学习 正常化
2021-09-21 00:32:01

许多线程(和课程),例如thisthis one建议您应该使用训练集中使用的参数对测试数据进行标准化。但是我发现的其他一些讨论,比如这个这个,表明对测试集应用归一化并不是真正需要的,它可能取决于许多因素,例如用于训练的模型或测试数据的性质。

现在,就个人而言,我更倾向于对测试数据应用归一化。但问题是这样的:我正在研究一个神经网络模型,其中:

  • 如果我使用推荐的方式应用归一化,我将获得 79% 的准确率,(老实说,这对我来说并不有趣)
  • 如果以单独的方式对训练和测试应用归一化,我会得到 85%(有时甚至更多)的非常好的结果,并且我尝试将下一步工作做得更好的进一步步骤。

所以,如果我使用第二种方法,我不知道我的神经网络在测试看不见的数据上表现更好。我真的很想继续对这个特定模型使用第二种方法,但我对此感觉不太好,感觉它是错误的或作弊

现在,我有最后一个论点。我提供的最后一个链接有一个答案是这样的:

“..这完全取决于数据集的大小以及训练和测试是否同样代表您尝试建模的领域。如果您有数千个数据点并且测试集完全代表训练集(很难来证明)那么任何一种方法都可以……”

我使用的数据集是其前身(NSL-KDD 数据集)的改进版本。作者说“在提议的测试集中没有重复的记录”并且他们已经删除了任何冗余值。所以我觉得,这个数据集是统一的,根据作者的说法,测试集实际上是有代表性的。那么我可以使用第二种方法吗?

Ps:对不起,如果这很长,这是一个研究伦理问题。我会按照你们推荐的方法。

3个回答

如果以单独的方式对训练和测试应用归一化,我会得到 85%(有时甚至更多)的非常好的结果,并且我尝试将下一步工作做得更好的进一步步骤。

单独在测试集上跨实例应用规范化的问题是测试集代表任何新数据。因此,原则上,模型应该能够独立于任何其他实例对单个实例进行预测,在这种情况下,没有一组实例可以从中获得均值/标准差。更重要的是,模型对给定实例的预测应该始终相同。对测试集进行规范化违反了这一原则,因为它使特定实例的预测依赖于测试集中的其他实例。

我不认为“单独的标准化”严格来说是不道德的,因为它并不意味着在训练阶段使用任何测试数据(而在拆分训练/测试集之前进行标准化会)。然而,由于我上面提到的原因,它在理论上是不正确的。

通过“单独”标准化获得如此大的性能差异这一事实表明训练和测试集之间的数据分布非常不同(或过程中的某个地方存在错误)。我建议调查一下,也许数据中有一些错误?

您需要使用训练集中的参数对测试集进行归一化。
模型评估的目的是回答这个问题,“如果要在实际问题上使用这个模型,我们应该期望它有什么性能?”

考虑到这一点,考虑如何在实际应用程序中训练和使用您的模型:您将使用所有可用数据训练模型并保存规范化参数。当一个新的、未标记的示例出现时,您将使用保存的规范化参数来转换示例,将其输入您的模型并生成结果。要模拟此过程,您需要使用在训练集中找到的参数对测试集进行归一化。这是评估模型的诚实和准确的方法。

关于你提到的报价:

这完全取决于数据集的大小以及训练和测试是否同样代表您尝试建模的领域。如果您有数千个数据点并且测试集完全代表训练集(难以证明),那么任何一种方法都可以......

来自 reddit 线程的类似引用:

如果您的训练集和测试集是从同一分布 (iid) 统一抽取的,并且您的数据集很大,那么训练集和测试集的均值/标准差应该非常相似。

这些陈述是真实的,但没有帮助。如果测试集“完全代表”训练集,那么训练集和测试集将具有几乎相同的均值和标准差。所以归一化的结果几乎是相同的。我认为您的数据集中不满足此条件,因为您发现两种标准化方法的结果存在很大差异。

作者说“建议的测试集中没有重复的记录”并且他们已经删除了任何冗余值。所以我觉得,这个数据集是统一的,根据作者的说法,测试集实际上是有代表性的。那么我可以使用第二种方法吗?

数据集的作者仅表示已删除重复值。他们没有声称测试集代表了训练集。所以我不认为你可以安全地使用第二种方法。

归一化有两种。

通常的类型是在数据集中缩放某些列,通常基于最小值和最大值或使用平均值和标准差。在这些情况下,您确实应该使用训练期间使用的完全相同的参数。事实上,您会希望将您的测试集视为 N 个集合,每个集合包含 1 个对象。

另一种常见于图像处理中,您可以在其中增强图像甚至图像块的对比度。在整个过程都是本地的这种情况下——总是一次只使用一个样本,那么你只需要在训练和测试中使用相同的程序。

确保您不会通过标准化将任何信息从测试泄漏到训练。首先规范化,然后拆分数据是一个非常常见的错误......