在训练数据被 fit_transform()-ed 之后不转换() 测试数据是否可以接受

数据挖掘 机器学习 Python 数据 预处理
2021-09-17 09:08:35

我们知道数据预处理(例如标准化、规范化等)的最佳实践是,在我们fit_trasform()对训练数据执行的同时,我们应用transform()测试数据,以便将通过缩放训练数据获得的学习参数应用于测试数据. 与此类似:

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform (X_test)

fit_transform()问题是:在训练数据上执行但根本不测试数据是否也有意义,transform()以便我们可以在根本没有转换的实际真实数据上测试模型性能?

谢谢

2个回答

不,这样做没有意义

您的模型已经学会了如何将一个输入空间映射到另一个输入空间,也就是说它本身就是函数逼近,并且可能不知道如何处理看不见的数据。

通过不对测试数据执行相同的缩放,您将在模型中引入系统误差。nanoman 在评论中指出了这一点 - 请参阅该评论以获得简单的转换示例。

夸大其词,假设您有一个语言模型,将文本从英语翻译成法语。您对英语数据应用单一转换:首先将其翻译成西班牙语。现在,该模型经过训练,可以将西班牙语翻译成法语,并且具有一定的准确性。现在您继续使用测试数据 - 仍然是英语 - 您不会像对训练数据应用相同的转换。您要求模型直接从英语翻译成法语,而不是从西班牙语翻译成法语,显然结果不会很好。

原则上,这个想法与任何其他模型和转换相同,只是影响可能并不总是那么明显,即您可能真的很幸运并且没有注意到很大的影响。

语言模型可能已经学习了所有三种语言共有的一些基本语言学(例如重叠词汇或句子结构),但我们不能指望模型表现良好,将英语翻译成法语。

实用说明

您应该只计算训练数据的转换统计数据(例如,标准化的均值和方差),然后使用这些值来转换训练数据本身,然后使用相同的值来转换测试数据。

在转换计算中包含测试数据集将允许信息从测试数据流向训练数据,从而流向从中学习的模型,从而允许模型作弊(引入偏差)。

此外,重要的是不要将转换与增强混淆。一些“转换”可能用于综合创建更多训练数据,但不必在测试时使用。例如,在计算机视觉中,删除图像的区域。测试时间增加是您可以阅读的内容。

额外讨论

更复杂的模型(具有更多参数的模型)可能能够执行某种插值,特别是如果您的数据集的 N 维具有较大的 N(例如 > 10)。

最近在超大型模型中看到了这一点,例如Open AI 的 GPT-3,它有1750 亿个参数,因此甚至能够在完全不同的任务上表现得相当好,更不用说训练集范围内的给定问题了。

这个问题只有一个答案,不可以,不能接受。无论您对训练数据应用什么转换(PCA、缩放、编码等),都必须对测试数据应用。