在训练数据中,我进行了特征工程并清理了我的数据。是否有必要对测试数据也进行同样的处理?我知道一些基本的修改,如标签编码、依赖/独立特征分割等,也需要在测试数据中进行。但是,我们真的需要在进行预测之前清理测试数据吗?
回答:
我不能简单地回答是或不是,让我先从你所有的训练/测试/开发集的数据分布说起。根据Andrew Ng教授的说法,测试和开发集应该来自相同的分布(Youtube),但训练集可以来自不同的分布(点击此处查看),而且这样做通常是有益的。有时清理训练集非常有用,同时应用一些基本操作来加速训练过程(如归一化,这不属于清理),但我们讨论的是训练数据,它应该有成千上万的例子,有时你无法手动检查和清理数据,因为这可能完全不值得。什么意思呢?让我给你举个例子:
假设你在构建一个猫分类器(猫或非猫),准确率为90%,这意味着你有10%的错误。经过错误分析(点击此处查看)后,你发现:
- 6%的错误是由标记错误的图像引起的(非猫图像标记为猫,反之亦然)。
- 44%是由模糊图像引起的。
- 50%是由标记为猫的大猫图像引起的。在这种情况下,你花在修正标记错误图像上的所有时间将在最佳情况下提高你的性能(0.6%),因为它只占总10%错误的6%,所以不值得修正标记错误的数据。
我举了一个标记错误数据的例子,但总的来说,我指的是任何类型的清理和修正。
但是清理测试集中的数据可能会更容易,如果可能的话,应该同时对测试/开发集进行清理,因为你的测试集将反映你的系统在实时数据上的表现。你在问题中提到的操作并不完全是清理,而是用于加速学习过程或使数据适合算法的,应用这些操作取决于数据的形状和类型(图像、语音记录、文字等),以及你试图解决的问题。
最后,作为回答,我可以告诉你:
- 数据的形式和形状在所有三个集合中应该是一致的(因此,应用标签编码应该针对所有数据,而不仅仅是训练数据,以及用于预测的输入数据,因为它会改变输出标签的形状)。
- 特征的数量始终应保持一致。
- 任何改变数据的操作(形状、形式、特征数量等)都应该应用于你将在系统中使用的每一个样本。