拆分成火车和测试之前或之后的归因?


18

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

我计划使用多重插补。我还将分为火车和测试仪。

我应该拆分数据然后分别估算,还是估算然后拆分?

如果它的事项,我将使用PROC MISAS


2
关键变量缺少50%的值?啊。而不是估算,为什么不为变量创建“缺少”类别?
RobertF 2014年

没有一个变量有50%的缺失,但是至少有一个缺失了约50%。而且,它们是连续的,因此“丢失”会弄乱事情。
彼得·弗洛姆

啊。我因使用插补而感到紧张。我想知道使用连续值50%的连续变量与转换cont的优点。变量分类为“缺少”类别,加上足够的垃圾箱来捕获非缺失值的行为?
RobertF 2014年

我不喜欢合并连续变量。
彼得·弗洛姆

Answers:


20

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

训练和测试集之间的划分是一种尝试,以复制您拥有过去信息的情况,并正在构建一个模型,以对将来仍未知的信息进行测试:训练集取代了过去,测试集取代了未来的地方,所以您只需要测试您训练过的模型一次。

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

从注释中添加:如果您使用测试数据来影响训练数据,那么该测试数据将用于构建您的模型,因此它不再是测试数据,并且不会提供对模型的公平测试。您可能会过度拟合,而为了避免这种情况,您首先就要分离出测试数据


当您说“在两个集合上使用相同的方法”时,您的意思是:“使用相同的方法来填充测试集中的缺失数据,而不是相同的数据”?
蒂姆维兹

@colorlace使用过去/未来的比喻。您过去使用过训练集,并估算了一些值。现在,您将在将来获得测试集,并希望估算其中的一些值。您大概会使用与之前应用于测试数据的方法相同的方法(尽管您可以自由地结合从训练数据中学到的知识)
亨利

如果您“可以自由地结合从培训数据中学到的知识”,那么这与在插补之前不进行拆分有何不同?
timwiz

1
@colorlace:这就是我要说的最后一点:测试数据不会告诉您对培训数据的任何处理(比喻说,未来不应影响过去),但是您对测试数据的处理可以从培训数据中获悉(比喻是,您可以使用过去来帮助预测未来)
亨利

1
@colorlace-如果您使用测试数据来影响训练数据,那么该测试数据将用于构建您的模型,因此它将不再是测试数据,并且不会提供对您模型的公平测试。您可能会过度拟合,而为了避免这种情况,您首先就要分离出测试数据
亨利(Henry)

1

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

但是您可能会问,如果我在分割后进行插补,那么当我需要进行交叉验证时,这可能会太乏味。我的建议是使用sklearn管道。它确实简化了您的代码,并减少了犯错的机会。见管道


0

补充说明一下,我还希望在插补或任何类型的预处理之前进行拆分。测试数据不会告诉您您对培训数据所做的任何事情(比喻说,未来不应影响过去)。然后,如果您的测试集也需要预处理或估算,那么您就可以记住对训练集所做的操作,以便您在两个集合上都以相同的方式进行操作(类比是您可以使用过去来帮助预测未来) 。

如果您使用测试数据以任何方式影响训练数据,那么该测试数据将用于构建您的模型,因此它将不再是测试数据,也不会为您的模型提供公平的测试。您冒着过度安装的风险,而为了避免这种情况,您首先就要分离出测试数据!

我认为r中的插入符号包在这种情况下非常有用。我发现该帖子特别有用https://topepo.github.io/caret/model-training-and-tuning.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.