R和sklearn中的随机森林

时间:2017-08-10 11:48:55

标签: python r machine-learning scikit-learn random-forest

非常方便R中的RandomForest接受输入(X)的因子。我假设这使得构建树更容易,如果从具有值(a,b,c)的因子变量,您可以构建分成(a,c)和(b)的节点。在sklearn中,我需要将所有内容编码为虚拟对象(0,1),以便丢失a,b,c向量之间的任何关系。

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

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

2 个答案:

答案 0 :(得分:2)

实际上,Scikit-learn不支持分类功能而不将其编码为数字。另外,你假设sklearn会解释

  

0和1彼此接近,因此它会寻找(例如)a   拆分[0,1] vs 1

是对的。在某些情况下,这并不一定意味着与One Hot Encoding相比,此编码的性能更差。你们很多人都要对你的数据进行尝试。

如果你想坚持使用python,你有三个选择:

  1. 如您所述,将分类变量转换为数字变量
  2. 使用rpy2包通过python
  3. 利用R库
  4. 使用一些支持分类功能的其他python库。最值得注意的是LightGBM和最近发布的CatBoost(即分类提升)。请注意,这两个软件包都实现了GBM,而不是随机森林。

答案 1 :(得分:2)

考虑具有三个值a,b,c和相应的单热编码的因子:

 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。因子和单热编码之间存在精确的对应关系。关系不会丢失,也不需要明确地链接输入向量。

但是,将因子值(a,b,c)编码为数字(0,1,2)会失去表达能力:分割这些数字的方法只有两种:0 | 1 2和{{1} }。因此,单个节点无法使用此编码表示拆分0 1 | 2

最后,有一个小问题。在查找最佳拆分时,仅考虑给定数量的b | a c功能(默认值:max_features)。如果包含因子,则评估所有拆分。在单热编码中,可能不是所有因子的分裂都被评估,因为每个虚拟变量被单独选择以包含。这可能会对生成的树木产生影响,但我不知道这可能会有多严重。