我可以使用训练和测试数据进行插补吗?

Ana*_*ysa 7 python-2.7 data-science imputation

有趣的是,我在 stackoverflow 和其他网站上看到了很多不同的答案:

在处理我的训练数据集时,我使用决策树模型估算了某个列的缺失值。所以这是我的问题。使用所有可用数据(训练和测试)来制作插补模型(而不是预测)是否公平,或者我可以在这样做时只接触训练集吗?此外,一旦我开始处理我的测试集,我是否必须只使用我的测试集数据,使用在我的训练集中制作的相同插补模型进行插补,或者我可以使用所有可用的数据来重新训练我的插补模型?

我认为只要我不使用我的测试集进行预测模型训练,将其余数据用于插补之类的事情就可以了。但也许这会打破一个基本规则。想法?

Sav*_*nry 5

在对训练集进行任何处理时,请勿使用测试集中的任何信息。@Maxim 和链接的答案是正确的,但我想补充答案。

插补尝试根据不完整的数据进行推理,以建议缺失条目的可能值。我认为将缺失值视为测量误差的一种形式是有帮助的(请参阅本文以获取有用的演示)。因此,有理由相信缺失与底层数据生成过程有关。这个过程正是您试图用模型复制的过程(当然,虽然不完美)。

如果您希望您的模型具有良好的泛化能力——我们都不想!——那么最好确保您对训练集所做的任何处理仅依赖于该集中包含的数据中的信息。

我什至建议您考虑三向分割:测试集、训练集和验证集。验证集进一步从训练集中剔除,并用于测试模型与“自身”的拟合度(在超参数的调整中)。这在一定程度上是交叉验证程序在类似和其他管道中所做的事情sklearn在这种情况下,我通常在 CV 分割后进行插补,而不是在完整的训练集上进行插补,因为我试图根据模型“知道”的数据来评估模型(并且保留数据是未知/未来的代理)数据)。但请注意,我还没有看到像在测试集和训练集之间保持完整的墙那样一致的建议。


Max*_*xim 3

我同意交叉验证的这个答案

训练集和测试集之间的划分是为了复制这样的情况:您拥有过去的信息并正在构建一个模型,您将在未来的未知信息上进行测试

预处理数据的方式可能会影响模型性能,在某些情况下甚至会影响很大。测试数据是您不知道的样本的代理。如果您知道所有未来的数据,您会以不同的方式进行插补吗?如果是,那么使用测试数据就是作弊。如果不是,则无论如何都不需要测试数据。因此,在模型构建之前最好不要接触测试数据。