根据我的直觉,决策树应该比连续变量更好地处理分类变量。如果是这种情况,为什么分类变量需要编码?有人可以给我这背后的直觉吗?
为什么决策树需要对分类变量进行编码?
...为什么分类变量需要编码?
那不是真的;决策树可以建立在连续特征和分类特征上。(为什么树集成不需要 one-hot-encoding?) 然而,一些实现不支持分类变量(特别是sklearn
(现在,更新)和xgboost
(他们的政治))。
现在,有一个效率问题:类别集合的二分的数量是类别数量的指数,因此对可能的拆分的完整搜索仅适用于类别较少的类别变量。
事实证明有一个(令人惊讶的?)简化:如果潜在问题是使用 MSE 的回归,或者使用交叉熵或基尼指数的二元分类,那么可以通过根据类别的平均值对类别进行排序来找到最佳分割响应值,现在将其视为序数变量拆分。(也就是说,仍然有很多类别,尤其是小类别,可能会导致严重的过度拟合。)请参阅Elements of Statistical Learning,第 9.2.4 节。
一些实现会执行详尽的二分搜索,但会限制允许的类别数量。 LightGBM
并rpart
执行有序搜索。(一些 R 讨论,LightGBM)。
据我了解,决策树使用规则< threshold_value
或>= threshold_value
将观察结果组合在一起,其中threshold_value
一个变量的值可以最小化特定拆分的成本函数。(树同样可能使用<=
and>
但这只是语义)。
这显然适用于数值变量,但不适用于分类变量 - 特别是当分类变量无法以有意义的方式排序时。因此,我们需要对分类变量进行数字编码。
这是必需的,因为并非所有机器学习算法都可以处理分类数据。他们中的许多人不能直接对标签数据进行操作。它们要求所有输入变量和输出变量都是数字的。这就是为什么我们需要对它们进行编码。
无论如何,分类变量应该编码为数字。您可以将其编码为序列:例如 1, 2, 3...。在这种情况下,它被称为序数。通过为每个类别映射一个数字,始终可以将类别变量编码为序数。但这并不总是有意义的,因为类别并不总是连续的。
例如,如果您将“低”、“中”、“高”作为分类变量的值,则将其视为序数并将其编码为 1、2、3 是合理的。因此,如果算法拆分变量,并且 { 1} 到一个分支,{2,3} 到另一个分支,这是合理的,因为 'middle' 和 'high' 与 'low' 明显分开,它们可以形成两个不同的类别。
但是如果值是'spoon','fork','knife',将其编码为数字是没有意义的,因为树算法会拆分变量的数值,为什么'knife'没有意义' 和 'fork' 应该去一个分支,而 'spoon' 应该去另一个分支。但情况就是这样,如果它们被编码为 1, 2, 3 并且它在一个分支中拆分为 {1} 而在另一个分支中拆分为 {2, 3}。因此,在这种情况下,最好对它们进行一次热编码。这种方式算法会将它们视为非顺序二进制变量,并且它们将有相同的机会彼此落入一个单独的分支。