【问题标题】:SkLearn - Why LabelEncoder().fit only to training dataSkLearn - 为什么 LabelEncoder().fit 仅适用于训练数据
【发布时间】:2019-02-16 04:38:28
【问题描述】:

我可能遗漏了一些东西,但是在遵循了很长一段时间之后(一些高级数据科学家的)对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 的(知识渊博的)高级数据科学家只针对训练数据,他们已经证明了这一点,因为即使是最简单的模型,测试集也应该是全新的像编码器一样,它不应该与训练数据混合。他们没有提及任何生产或词汇外的目的。

【问题讨论】:

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢这篇非常有帮助的帖子。请看我编辑的帖子的结尾。
  • 确实模型拟合方法不应该访问测试数据。我试图解释“为什么”在您显然没有泄露信息的情况下会出现这种情况(场景 2)。无论哪种方式,如果您想进一步探索,“词汇量不足”问题只是一个示例。
  • 好的,如果您必须处理大量词汇,而您无法预测其中的每一个单词,那么您的方法当然是有意义的。但是,如果您只有分类变量,例如天(星期一、星期二等),那么将 LaberEncoder 也拟合到训练数据中的测试数据(星期一、星期二)是否有任何问题?
  • 当然,在某些用例中它可能“没问题”,但实际上这是最佳实践问题。如果您想构建可靠的模型并且不冒险将测试数据泄漏到训练中,那就不要这样做。还要考虑下一个阅读您的代码的人。他们会清楚这是一个“安全”的案例吗?
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-08-24
    • 2014-10-03
    • 2020-11-03
    • 1970-01-01
    • 2014-03-02
    • 2018-08-21
    • 2017-08-29
    • 2016-11-19
    • 2020-05-11
    相关资源
    最近更新 更多