拆分为训练和测试之前或之后的插补?

机器算法验证 交叉验证 生存 多重插补 火车
2022-01-29 00:32:12

我有一个 N ~ 5000 的数据集,并且至少有一个重要变量缺少大约 1/2。主要的分析方法是 Cox 比例风险。

我计划使用多重插补。我还将分成一个训练集和测试集。

我应该先拆分数据然后单独估算,还是先估算然后拆分?

如果重要,我将使用PROC MIin SAS

3个回答

您应该在预处理或插补之前进行拆分。

训练集和测试集之间的划分是试图复制您拥有过去信息并正在构建模型的情况,您将在未来未知的信息上测试该模型:训练集代替过去,测试集代替未来的地方,所以你只能测试你训练过的模型一次。

牢记过去/未来的类比,这意味着您为预处理或处理数据所做的任何事情,例如估算缺失值,都应该单独在训练集上执行。然后,如果您的测试集也需要预处理或插补,那么您可以记住您对训练集做了什么,这样您就可以在两个集上以相同的方式进行操作。

从评论中添加:如果您使用测试数据影响训练数据,那么测试数据将被用于构建您的模型,因此它不再是测试数据,并且不会为您的模型提供公平的测试。您冒着过度拟合的风险,为了阻止这种情况,您首先分离出测试数据

我认为你最好在进行插补之前进行拆分。例如,您可能希望使用列均值来估算缺失值。在这种情况下,如果您首先使用 train+valid 数据集进行估算,然后再进行拆分,那么您在构建模型之前就使用了验证数据集,这就是数据泄漏问题出现的原因。

但是你可能会问,如果我在拆分后进行估算,当我需要进行交叉验证时可能会太繁琐。我的建议是使用 sklearn 管道。它确实简化了您的代码,并减少了出错的机会。管道

只是为了补充上述内容,我还倾向于在插补或任何类型的预处理之前进行拆分。测试数据不应告知您对训练数据所做的任何事情(类比是未来不应该影响过去)。然后,如果您的测试集也需要预处理或插补,那么您可以记住您对训练集做了什么,这样您就可以在两个集上以相同的方式进行操作(类比是您可以使用过去来帮助预测未来) .

如果您使用测试数据以任何方式影响训练数据,那么测试数据将被用于构建您的模型,因此它不再是测试数据,并且不会为您的模型提供公平的测试。您冒着过度拟合的风险,为了阻止这种情况,您首先分离出测试数据!

我认为 r 中的 caret 包在该设置中非常有用。我特别发现那篇文章非常有帮助https://topepo.github.io/caret/model-training-and-tuning.html