在实践中,决策树是否会通过将分类值转换为数值来执行节点拆分?

机器算法验证 机器学习 分类数据 随机森林 大车 多类
2022-03-02 04:19:03

在决策树中,在进行分类或回归时,我们是否只使用数值?假设我有一个分类列Wind作为特征。假设我有 5 行(观察值),其值为Wind[ high, low, high, medium, medium]。

我可以将这些分类数据输入决策树分类器(如 scikit-learn),它会获取数据吗?也就是说,基于风的节点拆分是否会发生在high计数为 2、medium计数为 2 和low计数为 1 的分类值上。或者,系统会将其转换为虚拟变量吗?

2个回答

理论不同于实践。基本上,理论上如何描述算法在实践中并不总是得到尊重。在 scikit-learn 的情况下,决策树的实现仅考虑数字特征。这是错误的,或者至少是不完整的,因为对于名义变量,与数值变量相比,您有不同的方法来查找拆分。

一个简短的例子。首先对数值变量进行排序并遍历排序值,然后创建和评估新测试。对数字输入的测试具有以下形式:左侧所有大于等于可能拆分值的值,右侧是另一个。对于标称值,有各种测试,其中一种具有以下形式:左边是一个类别的实例,右边是其余的实例。

人们总是可以使用某种编码将名义变量转换为数字变量。只要您不对编码值进行一些数学运算,就可以了。但是 scikit-learn 实现的问题在于,它将在拆分时使用数值变量的逻辑,应用于名义变量的数值编码。因此,您确实无法重现我作为示例提供给您的名词行为。

它还考虑了一种热编码替代方案。这意味着您将一个名义变量转换为多个二元变量(名义变量的每个级别一个)。处理名义变量的数字编码或一种热编码可能会产生结果(毫无疑问)。关键是它们产生的结果与理论上指定的算法不同,因为它们没有完全实现它。

有各种 ML 库,其中大多数都支持处理分类变量(R 将它们命名为因子,Weka 将它们命名为名义变量等)。

[稍后编辑:解决 Soren 和 Candic3 的评论]

据我所知,Breiman 关于随机森林的规范考虑了对来自所有变量组合组的名义变量的二元拆分。正如索伦所说,这是这太多了。然而,有两件事可以说。2L1

第一个是你不必遵循这个名义上的秘诀。您可以搜索“一对多”形式的名义变量的二元拆分。即使对于具有多个级别的变量,它们的数量也很少。可以说,您可以通过某种编码转换成二进制指标。这是正确的,但并不完整,因为您必须以某种方式处理缺失值,这对于编码而言并非易事。使用代理或加权随机是不可能的。不知何故,您必须在编码发生之前进行变量插补,或者将缺失视为另一个类别。

第二件事是,在对 Gini 杂质进行二元分类的情况下,有证据表明,如果使用以下过程,从所有中找到最佳分割的速度要快得多。计算每个级别子集的纯度函数。根据在每个子集上计算的杂质函数值对变量进行排序。然后,计算子集的二进制拆分,其中一方面您有前个变量,而在另一组中剩余的值。这个过程是在线性时间内计算的,因此效率很高,实际上可以处理超过 32 个级别的变量。有关详细信息,请参阅Elements of Statistical Learning,第 2 版 - 第 310 页,第 9.2.4 节其他问题您将在那里找到解释和以下参考资料。2L1k

我对此类主题的个人结论如下。如果可能,请使用分类处理。即使对于大量级别,这有时也是可能的。但是,对于大量级别,您应该谨慎行事。太多的级别可以转化为低预测能力。因此,也许一组级别提供的不仅仅是直接使用变量。

例如,如果您有邮政编码。级别的数量可能很大。直接处理是可能的,但也许将邮政编码解码为区域具有更高的通用性,因此具有更强的预测能力。

我的想法是,应该以一种更具解释性的方式直接通过编程技巧来分析和解决名义级别的过多粒度。

一般来说,分类变量应该被这样对待,而不是分配虚拟数值。想象一个变量是“头发颜色”的情况,可能的值是“红色、黑色、金发、棕色”。为这个变量分配一个数值没有任何意义,因为没有固有的顺序。如果您的变量值存在固有顺序,例如您的风示例,您可能需要直接指定(取决于您的分析包)作为数值,将每个变量状态直接与一个数字相关联 - 您的包可能不一定默认情况下,将它们按低、中、高的顺序排列。