首页 > 解决方案 > SkLearn - 为什么 LabelEncoder().fit 仅适用于训练数据

问题描述

我可能遗漏了一些东西,但是在遵循了很长一段时间(一些高级数据科学家的)建议LabelEncoder().fit只训练数据而不是测试数据之后,我开始思考为什么这真的很有必要。

具体来说,SkLearn如果我只想LabelEncoder().fit训练数据,那么有两种不同的情况:

  1. 测试集有一些与训练集相关的新标签。例如,测试集只有标签['USA', 'UK'],而测试集有标签['USA', 'UK', 'France']。然后,正如在其他地方报告的那样(例如,Getting ValueError: y contains new labels when using scikit learn's LabelEncoder),如果您尝试根据此转换测试集,则会收到错误,LabelEncoder()因为它恰好遇到了新标签。

  2. 测试集与训练集具有相同的标签。例如,训练集和测试集都有标签['USA', 'UK', 'France']。然而,LabelEncoder().fit只有训练数据本质上是多余的,因为测试集与训练集具有相同的已知值。

因此,如果在情况 (1) 中抛出错误并且在情况 (2) 中是多余的LabelEncoder().fit,那么仅训练数据然后训练和测试数据的意义何在?LabelEncoder().tranform

让我澄清一下,我所见过的(知识渊博的)高级数据科学家LabelEncoder().fit只对训练数据进行了证明,他们说测试集应该是全新的,即使是最简单的模型(如编码器)也不应该混合与训练数据的任何拟合。他们没有提到任何关于任何生产或词汇外的目的。

标签: pythonmachine-learningscikit-learncategorical-data

解决方案


fit()这样做的主要原因是因为在推理/生产时间(不是测试),您可能会遇到以前从未见过的标签(即使您想调用也无法调用)。

在场景 2 中,您可以保证在折叠中始终具有相同的标签,并且在生产中它确实是多余的。但是您仍然保证在生产中看到相同的内容吗?

在场景 1 中,您需要找到处理未知标签的解决方案。一种流行的方法是将每个未知标签映射到一个unknown标记中。在自然语言处理中,这被称为“词汇不足”问题,并且经常使用上述方法。

要这样做并且仍然使用LabelEncoder(),您可以预处理您的数据并自己执行映射。


推荐阅读