SkLearn-为什么LabelEncoder()。只适合训练数据

时间:2018-09-11 15:56:53

标签: python machine-learning scikit-learn categorical-data

我可能会丢失一些东西,但是在遵循很长一段时间后,(一些高级数据科学家)建议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仅用于训练数据实际上是多余的,因为测试集具有与训练集相同的已知值。

因此,LabelEncoder().fit仅对训练数据有什么意义,然后LabelEncoder().tranform既对训练数据又对测试数据有什么意义,如果在情况(1)下抛出错误,并且在情况下(2)是否多余?

让我澄清一下,我见过LabelEncoder().fit的(非常有知识的)高级数据科学家仅用于训练数据,他们通过说测试集甚至对于测试人员来说也是全新的来证明了这一点。最简单的模型(例如编码器),不应将其与训练数据进行任何混合。他们没有提及任何有关生产或出于语音目的的事情。

2 个答案:

答案 0 :(得分:3)

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

在方案2中,可以保证折叠时始终具有相同的标签,并且在生产中确实是多余的。但是您仍然可以保证在生产中看到相同的东西吗?

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

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

答案 1 :(得分:1)

很难猜测为什么高级数据科学家会在没有上下文的情况下向您提供建议,但是我可以想到至少他们想到的一个原因。

如果在第一种情况下,训练集不包含完整的标签集,那么了解这一点通常会很有帮助,因此错误消息是有用的信息。

随机抽样通常会遗漏稀有标签,因此对您所有数据进行完全随机抽样并不总是生成训练集的最佳方法。如果法国未出现在您的训练集中,则您的算法将不会从中学习,因此您可能希望使用随机方法来确保您的训练集中代表少数情况。另一方面,使用不同的随机方法可能会引入新的偏差。

一旦掌握了这些信息,将取决于您的数据和要解决的问题以及最佳解决方案,但是在某些情况下,必须具有所有标签的重要性。一个很好的例子就是确定一种非常罕见的疾病的存在。如果您的训练数据中没有表明存在该疾病的标签,那么您最好重新采样。