从我在网上阅读的内容来看,关于分类和使用的术语似乎有些混乱,因此为避免误解,我将在此处对其进行定义:
标签编码- 使用任意数字标签对标称变量进行编码。
序数编码- 使用按特定顺序排列的数字标签对序数变量进行编码。
我目前正在学习的机器学习课程将 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:我问是因为我的课程有一整节课专门教学生“序数”编码。起初我想建议他们将其重命名为“标签编码”,但现在我怀疑最好完全删除整个课程以避免教学生不良做法。