python - SkLearn - 为什么 LabelEncoder().fit 仅适用于训练数据
问题描述
我可能遗漏了一些东西,但是在遵循了很长一段时间(一些高级数据科学家的)建议LabelEncoder().fit
只训练数据而不是测试数据之后,我开始思考为什么这真的很有必要。
具体来说,SkLearn
如果我只想LabelEncoder().fit
训练数据,那么有两种不同的情况:
测试集有一些与训练集相关的新标签。例如,测试集只有标签
['USA', 'UK']
,而测试集有标签['USA', 'UK', 'France']
。然后,正如在其他地方报告的那样(例如,Getting ValueError: y contains new labels when using scikit learn's LabelEncoder),如果您尝试根据此转换测试集,则会收到错误,LabelEncoder()
因为它恰好遇到了新标签。测试集与训练集具有相同的标签。例如,训练集和测试集都有标签
['USA', 'UK', 'France']
。然而,LabelEncoder().fit
只有训练数据本质上是多余的,因为测试集与训练集具有相同的已知值。
因此,如果在情况 (1) 中抛出错误并且在情况 (2) 中是多余的LabelEncoder().fit
,那么仅训练数据然后训练和测试数据的意义何在?LabelEncoder().tranform
让我澄清一下,我所见过的(知识渊博的)高级数据科学家LabelEncoder().fit
只对训练数据进行了证明,他们说测试集应该是全新的,即使是最简单的模型(如编码器)也不应该混合与训练数据的任何拟合。他们没有提到任何关于任何生产或词汇外的目的。
解决方案
fit()
这样做的主要原因是因为在推理/生产时间(不是测试),您可能会遇到以前从未见过的标签(即使您想调用也无法调用)。
在场景 2 中,您可以保证在折叠中始终具有相同的标签,并且在生产中它确实是多余的。但是您仍然保证在生产中看到相同的内容吗?
在场景 1 中,您需要找到处理未知标签的解决方案。一种流行的方法是将每个未知标签映射到一个unknown
标记中。在自然语言处理中,这被称为“词汇不足”问题,并且经常使用上述方法。
要这样做并且仍然使用LabelEncoder()
,您可以预处理您的数据并自己执行映射。
推荐阅读
- excel - 尝试引用不同的工作表时,正在从活动工作表中提取数据
- javascript - javascript forEach 似乎是非阻塞的
- c - 有没有办法在 Windows 中使用由 CreateProcessAsUser 创建的 cmd 自动完成?
- javascript - 如何使用 KnockoutJS 插入 HTML 组件
- kubernetes - 我只能在 kubernetes 中更改一个 pod 吗?
- python - 如何在Linux中使用名为“imwrite”的python opencv函数将捕获的图像文件保存在USB中
- java - 更多内存优化版本的 Bitmap.createScaledBitmap?
- python - 如何使用 python/pygame 在 Windows 7 上关闭某些像素
- android - 如何使用 Kotlin 从 android 中的资产中读取 json 文件?
- oauth-2.0 - LinkedIn API 获取访问令牌失败