我一直在 Kaggle 上学习中级机器学习课程。在解释中,为了标记分类数据,他们使用了 sklearn.preprocessing 中的
LabelEncoder
库。
这里,对于训练数据集,他们使用了 fit_transform,而对于验证数据集,他们只使用了变换,为什么会这样?
此外,在处理空值时,在训练数据集中他们使用了 fit_transform ,对于验证数据集他们使用了 transform 。 那么fit_transform和transform有什么区别以及什么情况下可以使用它们呢?
fit_transform 既使转换器适合数据集,又转换给定的数据。
Transform 只是转换给定的数据集。
通常,您在训练数据集上使用 fit_transform 来使转换器适合数据集并转换数据集。
在您的测试和验证数据集上,您只想转换数据集。这是因为您希望避免任何可能的数据泄漏。您希望您以任何形式创建的模型从未见过您的测试集。一种形式会影响您对数据集的看法。
示例中使用的简单输入器的默认替换是替换为平均值。通过仅拟合训练数据集,您可以避免测试集中的数据集影响输入器平均值并泄漏信息的任何可能性。
我们在创建机器学习模型时使用拟合,但是每当我们想要
fit_transform()
数据以及 fit()
这些值时,都会使用 transforming()
。
例如 - 在标签编码和特征缩放的情况下,我们想要更改或缩放我们的值。因此,每当我们想要转换值时,我们都会使用
fit_transform()
。
但是我们不使用
fit_transform()
来进行验证数据,因为有两个问题:
我们可以用一个简单的例子来解释这两者 -
就像试卷漏了一样。如果我们看到试卷,那么考试就没有意义了。可能如果我们拟合测试数据,那么模型就知道整个数据。
即“数据泄露”,可能会导致“过拟合”,就是说万一试卷泄露我们还可以做得很好,但是如果校长改了试卷怎么办?然后我们测试失败了。
请注意,我们在数据被分为训练集和测试集后应用转换。如果它没有被分割,你可以做你想做的事。但在分割为训练集(需要模型训练)和测试集(需要机器学习模型测试)之后就不行了。
将 fit_transform 应用于训练集并且仅转换到测试集将执行以下操作:
fit 方法从训练数据中学习转换(编码/缩放)所需的参数,而转换方法将学习到的转换应用于新数据。这里 fit_transform 是从训练集中学习变换参数(根据使用的 trasnformer),然后在单个语句中将变换应用到训练集(而不是先应用 .fit() 然后再应用 .transform())。 下一行是transform(testset),它将应用学习到的参数来转换测试数据。 这可以保持测试环境的纯净,并在您稍后进行模型训练时避免通过此步骤从测试端到训练端的任何泄漏。
除了上述一点之外,我还想用以下简单的类比补充一点: 假设您是一名机器学习工程师,一家公司联系您为其数据制作机器学习模型。但为了安全起见并验证您的模型,他们可能会保留 20% 的原始数据,并为您提供 80% 的数据,即 100% 的数据(可用数据)。当您说我的模型提供 90% 的准确度或您告诉的任何评估时,他们可能会在最后检查验证您的模型并验证您的索赔(在向您付款之前)。
然后,您将把这些可用数据划分为训练集(占可用数据的 75%)和测试集(占可用数据的 25%)并制作模型。因此,在制作模型时,您会希望您的测试集表现得像未知的 20% 数据,但仍然与公司相关,而这些数据从来不是您模型的一部分。
并且通过不将您的测试数据包含到任何转换和模型训练中,您的模型可能会以相同的方式处理这两个测试数据(您的 25% 和隐藏的 20% 数据仍在公司中)。
这就是为什么我们总是希望测试数据与机器学习模型训练隔离。因此,经过训练的模型将是纯粹的测试数据,其中测试数据在数据分割(训练集和测试集)之后完成的预处理步骤中从未接触过训练数据。