非常方便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]。
答案 0 :(得分:2)
实际上,Scikit-learn不支持分类功能而不将其编码为数字。另外,你假设sklearn会解释
0和1彼此接近,因此它会寻找(例如)a 拆分[0,1] vs 1
是对的。在某些情况下,这并不一定意味着与One Hot Encoding相比,此编码的性能更差。你们很多人都要对你的数据进行尝试。
如果你想坚持使用python,你有三个选择:
答案 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
)。如果包含因子,则评估所有拆分。在单热编码中,可能不是所有因子的分裂都被评估,因为每个虚拟变量被单独选择以包含。这可能会对生成的树木产生影响,但我不知道这可能会有多严重。