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

时间:2017-10-14 20:28:52

标签: python-2.7 data-science imputation

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

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

我会想,只要我没有触摸我的测试集进行预测模型训练,使用其他数据进行插补就可以了。但也许这会打破一个基本规则。想法?

3 个答案:

答案 0 :(得分:0)

我同意this answer on cross-validated

  

训练和测试集之间的划分是尝试复制   您有过去信息并正在建立模型的情况   你将测试未来的未知信息

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

答案 1 :(得分:0)

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

Imputation尝试从不完整的数据推断出可能的缺失条目值。我认为将缺失值视为测量误差的一种形式是有帮助的(有关此示例的详细信息,请参阅this article)。因此,有理由相信缺失与基础数据生成过程有关。而这个过程正是你试图用你的模型复制(当然,不完美)的过程。

如果你想要你的模型很好地概括 - 不要我们所有人! - 然后最好确保您对训练集所做的任何处理仅依赖于该集合中包含的数据中的信息。

我甚至建议您考虑三方分割:测试,培训和验证集。验证集进一步从训练集中剔除,用于测试模型适合"本身" (在调整超参数时)。这部分是交叉验证程序在sklearn和其他管道中所做的事情。在这种情况下,我通常在 CV分割之后进行插补,而不是在完整的训练集上,因为我试图评估数据模型,模型"知道" (并且保持数据是未知/未来数据的代理)。但请注意,我没有看到这个建议与在测试和训练集之间保持完整的墙完全一致。

答案 2 :(得分:0)

将数据分为训练集和测试集的基本原理是,有机会通过新鲜(ish)数据验证模型,对吗? 因此,通过在训练和测试集上使用相同的冲床,您将以某种方式破坏测试数据,这可能会导致过拟合。 您可以使用相同的方法在两组数据集(在您的情况下为决策树)中估算丢失的数据,但是,您应该实例化两个不同的模型,并为每个模型配备自己的相关数据。