R和sklearn中的随机森林
Posted
技术标签:
【中文标题】R和sklearn中的随机森林【英文标题】:Random forest in R and sklearn 【发布时间】:2018-01-18 15:45:10 【问题描述】:R 中的 RandomForest 非常方便地接受输入 (X) 的因子。我假设这使得构建树变得更容易,如果从具有值 (a,b,c) 的因子变量中,您可以构建一个拆分为 (a,c) 和 (b) 的节点。在 sklearn 中,我需要将所有内容编码为虚拟对象 (0,1),以便丢失 a、b、c 向量之间的任何关系。
我的解释是否正确,sklearn 中有没有办法链接输入向量?
如果我将变量编码为 (0,1,2),我还假设 sklearn 会将其解释为 0 和 1 彼此接近,因此它会寻求(例如)拆分 [0,1]与 [2]。
【问题讨论】:
在给定树中选择的分割将基于对整个模型准确性的最大影响。可能是 0 和 1 对模型的影响有很大差异。 也许这会有所帮助:- github.com/scikit-learn/scikit-learn/issues/5442 【参考方案1】:Scikit-learn 确实不支持分类特征而不将它们编码为数字。此外,您假设 sklearn 会解释
因为 0 和 1 彼此靠近,因此它会寻找(例如)a 拆分 [0,1] 与 1
是正确的。在某些情况下,这并不一定意味着与 One Hot Encoding 相比,此编码的性能更差。许多人必须在数据上进行尝试。
如果你想坚持使用python,你有三个选择:
-
按照您的描述将分类变量转换为数值变量
使用 rpy2 包通过 python 利用 R 库
使用其他一些支持分类特征的 python 库。最值得注意的是LightGBM 和最近发布的CatBoost(即Categorical Boosting)。请注意,这两个包都实现了 GBM,而不是随机森林。
【讨论】:
【参考方案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 2
和 0 1 | 2
。所以单个节点不能用这种编码表示分裂b | a c
。
最后,有一个小问题。在寻找最佳分割时,只考虑给定数量的max_features
特征(默认值:sqrt(n_features)
)。如果该因素被包括在内,则评估所有拆分。在 one-hot 编码中,可能不会评估一个因子的所有拆分,因为每个虚拟变量都是单独选择的。这可能会对生成的树木产生影响,但我不知道这可能会变得多严重。
【讨论】:
以上是关于R和sklearn中的随机森林的主要内容,如果未能解决你的问题,请参考以下文章
sklearn库学习----随机森林(RandomForestClassifier,RandomForestRegressor)
LSH︱python实现局部敏感随机投影森林——LSHForest/sklearn