繁体   English   中英

SkLearn-为什么LabelEncoder()。仅适用于训练数据

[英]SkLearn - Why LabelEncoder().fit only to training data

我可能会丢失一些东西,但是在很长一段时间后,(对于一些高级数据科学家而言) LabelEncoder().fit的建议仅适用于训练数据,而不适合测试数据,然后我开始思考为什么这确实必要。

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

  1. 测试集相对于训练集具有一些新标签。 例如,测试集只有标签['USA', 'UK']而测试集只有标签['USA', 'UK', 'France'] 然后,正如其他地方所报道的那样(例如,使用scikit learning的LabelEncoder时,Getting ValueError:y包含新标签 ),如果尝试根据此LabelEncoder()转换测试集,则会遇到错误,因为它恰好遇到了新标签。

  2. 测试集具有与训练集相同的标签。 例如,训练集和测试集都具有标签['USA', 'UK', 'France'] 但是,由于测试集具有与训练集相同的已知值,所以仅LabelEncoder().fit训练数据的LabelEncoder().fit本质上是多余的。

因此, LabelEncoder().fit仅适用于训练数据,然后LabelEncoder().tranform训练和测试数据的意义是什么,如果在情况(1)下抛出错误,而在情况(2)下冗余?

让我澄清一下,我见过的LabelEncoder().fit的(非常有知识的)高级数据科学家仅LabelEncoder().fit训练数据,他们通过说测试集甚至对于最简单的模型(例如编码器和请勿将其与培训数据进行任何混合。 他们没有提及任何有关生产或非语言用途的内容。

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

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

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

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

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

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

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

获得此信息后,将取决于您的数据和要解决的最佳解决方案问题,但是在某些情况下,必须具有所有标签的重要性。 一个很好的例子就是确定一种非常罕见的疾病的存在。 如果您的训练数据不包括表明存在该疾病的标签,则最好重新采样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM