使用 R 预处理 ML 中的待预测数据——“学习”和“应用”特征

数据挖掘 机器学习 r 预处理 预言
2022-02-20 18:03:35

我研究了机器学习的常用预处理方法,但我无法应对以下具体问题。

我将建模的“常规”准备(虚拟变量、归一化、PCA 等,当然在必要的情况下)应用于训练数据到现在为止还挺好。但是当我得到待分类的新数据来对上面构建的模型进行预测时,显然我也必须将这些准备步骤应用到这个新数据集上。

而问题就出现在这里了,因为如果我只是简单地再次对我的新数据进行准备步骤,这些都没有考虑到训练数据的特征因此,如果我将新数据因子转换为虚拟变量,则只考虑新数据中现有的因子水平;如果我对新数据进行 min-max 归一化,它将根据自己的 min-max 值进行归一化,而忽略训练数据中的值;如果我使用 PCA,那么来自新数据的结果组件将完全独立于训练数据。

所以基本上我的观点是,将相同的转换分别应用于训练集和新数据集(也可能只是一个观察结果),那么这两个结果转换集将没有任何共同点,因此预测将毫无根据。

我发现了一些痕迹,在某些情况下,在这些转换的训练阶段也有一些“学习”步骤,并将这些“知识”应用于新数据(例如,插入符号和 Sklearn,使用“预测”可以转换为新数据)具有从训练数据中学习到的特征的数据),但一般来说,这种不一致仍然没有被提及。

这里的正确做法是什么?

2个回答

简而言之,正确的做法是使用您在训练集上找到并使用的缩放/预处理参数,并将它们应用于您的测试集。这样做的动机是,你应该能够处理那些带着他们想要预测的新观察来找你的人。您将能够使用您的训练集预处理参数预处理该单个观察。

我将讨论您提出的一些问题:

虚拟变量: 这可能需要您setdiff()在 R 中使用来查找哪些列在您的训练集中但不在您的测试集中,然后在您的测试集中创建一个列,其中包含一列零。这是最简单的方法,但它非常依赖于数据/目的。您可能还想更改此设置或根据您使用的建模技术寻找更好的选项。

Min/Max Normalize: 当您缩放训练集时,保存每列的最小值和最大值,并使用这些参数(不是测试集的最小值/最大值)缩放测试集。

PCA: 当您对训练集执行 PCA 时,您将根据在训练集上计算的旋转来转换数据。你想在你的测试集上执行那些预先计算好的旋转。退房?predict.prcomp这将向您展示如何将您的旋转从您的训练集应用到您的测试集。

如果您的测试数据中存在您在训练数据中没有看到的因子水平,那么严格来说,您无法预测这些观察结果的任何内容。您可以通过额外的假设来克服它,但恐怕除了放弃之外没有其他通用解决方案。

类似的考虑可能适用于其他情况。你愿意做样本外预测吗?您的模型中有哪些基本假设而不是使其成为可能?这些假设在其他方面起什么作用,这些对你的结果有很大影响吗?

话虽如此,我同意 TBSRounder 的观点。您必须使用与您为训练数据应用的转换完全相同的转换。