在R和sklearn中的随机森林

3

在R中,随机森林非常方便地接受输入(X)的因子(factor)。我假设这使得构建树更容易,如果您能够从具有值(a、b、c)的因子变量构建一个分裂为(a、c)和(b)的节点。在sklearn中,我需要将所有内容编码为(0,1)的虚拟变量(dummy),以便失去a、b、c向量之间的任何关系。

我的理解是否正确?在sklearn中是否有一种方法可以链接输入向量?

如果我将变量编码为(0,1,2),我还假设sklearn会将其解释为0和1彼此靠近,因此它会寻找一个分割[0,1] vs [2]。


在给定的树中选择的分裂将基于对整体模型准确性的最大影响进行。也可能是0和1在对模型的影响方面存在很大差异。 - Tim Biegeleisen
也许这可以帮助:- https://github.com/scikit-learn/scikit-learn/issues/5442 - Vivek Kumar
2个回答

2
Scikit-learn确实不支持不将分类特征编码为数字的情况。此外,您假设sklearn会将

解释为0和1彼此接近,因此它会寻找(例如)一个分割[0,1]与1

是正确的。在某些情况下,这并不一定意味着这种编码的性能比One Hot Encoding差。您可能需要在您的数据上尝试它。

如果您想坚持使用Python,则有三个选项:

将分类变量转换为数字变量,如您所描述的那样。 使用rpy2软件包通过Python利用R库。 使用其他支持分类特征的Python库。最显著的是LightGBM和最近发布的CatBoost(即分类提升)。请注意,这两个包都实现了GBMs而不是随机森林。

2
考虑一个有三个值a、b、c及其对应的one-hot编码因素:
 factor        a b c
--------     ---------
   a           1 0 0
   b           0 1 0
   c           0 0 1

有三种可能性来分割这个因子:
f: a | b c
f: b | a c
f: c | a b

有三个虚拟变量,每个变量都有一种可能的分割方式。这又导致了三种可能的分割方式:

a: 1 | 0
b: 1 | 0
c: 1 | 0

例如,在1 | 0中拆分变量a等同于在a | b c中拆分因子f。因子和one-hot编码之间存在精确对应关系,关系不会丢失,无需明确“链接”输入向量。
然而,将因子值(a、b、c)编码为数字(0、1、2)会失去表达能力:只有两种方法可以拆分这些数字:0 | 1 20 1 | 2。因此,使用此编码方式无法表示单个节点的拆分b | a c
最后,有一个小问题。在寻找最佳拆分时,仅考虑给定数量的max_features特征(默认值:sqrt(n_features))。如果包含了该因子,则评估所有拆分。在one-hot编码中,可能不会评估因子的所有拆分,因为每个虚拟变量都是单独选择的。这可能会对结果树产生影响,但我不知道这可能有多严重。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接