编码多类响应变量

数据挖掘 scikit-学习 多类分类 预言
2021-09-26 12:11:52

在分类问题中,当响应变量具有多类,例如“晴天”、“雨天”、“阴天”时,我们应该如何对其进行编码?我知道对于这样的预测器,通常我们会使用One Hot Encoding,如果一个预测器的类太多,那么我们可能只使用LabelEncode

当响应变量中出现这个多类问题时,我想我们可以只使用 LabelEncode() 而不是使用 One Hot 编码对吗?因为如果我们使用 One Hot 编码,那么我们将有 2 个变量作为响应变量,而 sklearn 中的机器学习算法通常期望响应变量不是向量,对吧?(我的意思是它需要一个长的一维向量,其长度等于观察的数量,但不是一个二维矩阵)。但另一方面,如果我们只是将“sunny”、“rainy”、“cloudy”映射到 {1,2,3} 或 {0,1,2} 或任何 3 个数字,这将创建一个小于或大于“晴”、“雨”、“阴”之间的关系,这在原问题中没有继承。

2个回答

这取决于类的含义,以及它们是否有任何有意义的顺序。

如果它们是序数或标度,则存在有意义的排序,对它们进行排序然后分配标签可能是合理的1,2,,n为了上课。这就是你所说的“LabelEncode”。在某些情况下,某种形式的回归也可能是合适的并且值得尝试。

如果它们是categoricalnominal,没有有意义的排序,那么 LabelEncode 没有任何意义,并且不会比 one-hot 编码更好——而且可能更糟。因此,默认值为 one-hot 编码。

如果它们是分类的但有一些层次结构,则有更聪明的方法您可以构建表示层次结构的树,然后进行多热编码。如果有n 类,你将有一棵树 n 叶子和(说) m 节点总数(其中 m>n)。然后你可以将类编码为m-向量,其 i如果类是节点的后代,则第 1 项为 1 i 在树中,否则为 0。

如果类是分类的但具有各种属性,您可以尝试一种编码,每个可能的属性都有一个元素。例如,如果有k 二进制属性,你可以有一个 k-向量中包含 0 或 1 ith条目根据对应的类是否有 i属性与否。您可以从那里概括为更一般的情况。

有关不同类型测量的更多信息,请参阅

这在很大程度上取决于软件。 sklearn 分类器将知道不将标签编码的数据视为有序;也就是说,它们中的大多数/全部都会很好地获取原始字符串数据(并且在许多情况下会在LabelEncoder内部使用 a 以提高计算效率)。如果您一次性对多类数据进行编码,sklearn通常会认为您的问题是多标签而不是多类,并且您的结果会有所不同。另请参阅此 SO 问题

但是,相比之下,大多数神经网络实现都期望多类目标预先进行一次热编码,并且可能您希望在最后一层使用 softmax 激活。