带有任意数字的标签编码是否有用?

数据挖掘 scikit-学习 熊猫 决策树 编码
2021-10-08 03:41:14

从我在网上阅读的内容来看,关于分类和使用的术语似乎有些混乱,因此为避免误解,我将在此处对其进行定义:

标签编码- 使用任意数字标签对标称变量进行编码。

序数编码- 使用按特定顺序排列的数字标签对序数变量进行编码

我目前正在学习的机器学习课程将 One-Hot Encoding 与 Ordinal Encoding 进行了比较。但是,在我在线研究期间,我意识到“Ordinal Encoding”实际上是用词不当,而该课程实际演示的内容称为“Label Encoding”。序数编码应该严格与序数变量有关,而有问题的数据集甚至没有任何序数变量。

这个误称是从哪里来的?原来它来自具有 LabelEncoder 和 OrdinalEncoder 类的 scikit-learn 库。问题是,OrdinalEncoder 类实际上默认不执行 Ordinal Encoding。为了使其具有序数,您必须在“类别”参数中指定顺序(并且它的使用对用户非常不友好 - pandas 的字典映射可以更轻松地完成相同的操作)。如果您不这样做,OrdinalEncoder 将按字母顺序分配标签,就像 LabelEncoder 所做的那样。所以这两个类之间的真正区别在于,一个只编码一列,而另一个一次编码两列或更多列。如果将这些类称为“LabelEncoder1D”和“LabelEncoder2D”,也许会更好,也不会令人困惑。

这就是错误地将标签编码称为“序数编码”的来源。但回到这个问题,我正在学习的课程提倡将(我学到的)标签编码用于基于树的算法,因为 One-Hot 编码对树的性能要差得多(这是真的)。但是,从我在网上阅读的内容来看,其他机器学习平台(例如 R 或 H2O)似乎能够处理树的名义变量而无需任何类型的编码,并且将所有内容编码为数字形式的要求似乎是完全是 scikit-learn 的问题。关于树是否使用标签编码表现更好,存在相互矛盾的信息——我的课程,以及一些在线回复,提倡使用它,但我的直觉,网上的其他一些回复,似乎表明 scikit-learn 树将无法将这些标签区分为类别,并且会错误地假设它们是有意义的尺度上的连续值。所以他们建议即使对树也使用 One-Hot Encoding 作为唯一的选择,尽管它不是最理想的。

所以我的问题是 1)标签编码是否会被 scikit-learn 树误解为数字尺度?2)如果是这样,是否存在任意标签编码有用的情况?或者,除非变量是有序的,并且给出了特定的标签顺序,否则这种技术根本没有用?

PS:我问是因为我的课程有一整节课专门教学生“序数”编码。起初我想建议他们将其重命名为“标签编码”,但现在我怀疑最好完全删除整个课程以避免教学生不良做法。

2个回答

首先,我通常同意将无序类别编码为连续整数不是一个好方法:您要添加大量数据中不存在的附加关系。

大车

首先,让我指出(因为我差点忘了)决策树有两种主要类型:CART 和 Quinlan 家族。对于 Quinlan 家族,分类变量是通过使用更高数量的拆分来处理的,因此不需要编码,这主要是没有实际意义的。

Q1,是的,通常编码将被模型视为数字(除非其他一些参数控制它,例如 LightGBM)。但是对于(大多数)树来说,实际上只有顺序是相关的:比例是无关紧要的,例如关系“10 是 5 的两倍”对于树来说是完全不可见的。

正如您所指出的,CART 模型的 one-hot 编码可能是有害的,尤其是当分类特征中有多个级别时:如果树只有 1 个虚拟变量,那么树是否会真正决定拆分其中一个虚拟变量?数据的一小部分?Q2)但是当您按顺序编码时,偶然会有一些有用的拆分,并且在每个方向上拆分许多级别。(您甚至可以尝试不止一种随机排序的关卡作为不同的功能!)

是的,大概最好的方法是使用可以利用原始分类的实现,使用平均响应技巧。(甚至有一些关于这有多大帮助的争论:一些研究已经完成,但通常数据集是合成的或太小而无法代表。)

其他型号

在其他模型中,通常单热编码就可以了,并且不会遇到与树相同的问题。如果级别太多,尤其是其中一些级别太小,您可以考虑使用平滑技术来避免过度拟合。Q2)如果对大多数模型来说,通常编码是否值得,我会感到惊讶,但是需要单独考虑每种模型类型,并且可能会进行一些测试。

名称

至于命名,事情有点混乱,但我不认为这是 sklearn 的错。中的“标签”LabelEncoder意味着它应该在标签上使用,也就是因变量。对于这种用法,它是否合适没有争议:sklearn 只需要连续的整数标签来进行多类分类;它不使用数值,就好像它们在数学上有意义一样。

至于OrdinalEncoder它旨在与类别的输入排序一起使用。请参阅下面的 sklearn 问题#13488。但是有人可能会争辩说,您是以一种有序的方式对分类变量进行编码,因此即使使用无序的类别,这也不一定是用词不当。

也可以看看

有关一些相关讨论,请参阅Issue#13488

  1. 标签编码是否会被 scikit-learn 树误解为数字尺度?

是的,SciKit-Learn 将其视为 Numeric value
因此,它会影响 Tree 的深度并导致不同的 Tree 结构
关于结果——当然,不同的方法需要不同的超参数调整,但我不确定我们是否永远无法通过标签编码达到最佳效果,或者如果调整得当,我们可能会做到这一点。
同样的道理,如果编码与Labels/target对齐的话,很快就能达到很好的效果。
可能喜欢阅读此答案

  1. 如果是这样,是否存在任意标签编码有用的情况,或者这种技术根本没有用,除非变量是序数的,并且给出了特定的标签顺序(即序数编码只有在它真正是序数时才有用) ?

我怀疑它是否能与神经网络或线性回归等一起工作
。10 将变为 5 的 2 倍,而在特征的两个值之间没有任何此类潜在关系。
如果发生这种情况,那将是巧合,或者可能是因为在随机分配值时对目标(目标编码)的潜意识知识。

但现在我怀疑整个课程最好完全删除,以避免教学生不良做法

我认为学生应该知道它在不同条件下将如何失败/表现。这样他们就可以掌握底层的概念。