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

Posted

技术标签:

【中文标题】我可以使用训练和测试数据进行插补吗?【英文标题】:Can I use Train AND Test data for Imputation? 【发布时间】:2018-03-26 17:14:57 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

如果您希望您的模型能够很好地泛化 - 我们都不要! ——那么最好确保你对训练集所做的任何处理都只依赖于该集中包含的数据中的信息。

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

【讨论】:

所以如果你使用像KNNImputer这样的插补方法,或者只是meanmedian,你是否适合你的插补方法?然后在测试和验证集上使用这些确切的结果?或者您是否将其重新用于测试和验证?例如。假设您使用的是mean,并且对于训练集中的列Age,您得到27。您是否也将这个27 用于测试和验证集中Age 列中的缺失值,或者您是否独立重新计算它们的平均值? 如果您计划在模型“野外”执行时对缺失数据进行插补,那么您可以在进行测试和验证时使用适合训练集的插补结果。直觉是:模型正在拟合数据填充数据缺失的地方,因此建立在训练数据上的 imputer 是模型猜测缺失值的最佳近似值。但请记住,仅在训练集上训练 imputer,否则 imputer 正在从它不应该“看到”的数据中学习。【参考方案2】:

我同意this answer on cross-validated:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于我可以使用训练和测试数据进行插补吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用不同的数据集进行 GridSearchCV 训练和测试?

如何在 Weka 中对训练和测试数据集进行分类

分类变量差值处理的方法

Matlab - 神经网络 - 如何使用不同的数据集进行训练、验证和测试?

如何使用 K-nearest neighbour 训练和测试数据?

在 sklearn 中进行测试和训练数据拆分的错误