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 20 1 | 2。所以单个节点不能用这种编码表示分裂b | a c

最后,有一个小问题。在寻找最佳分割时,只考虑给定数量的max_features 特征(默认值:sqrt(n_features))。如果该因素被包括在内,则评估所有拆分。在 one-hot 编码中,可能不会评估一个因子的所有拆分,因为每个虚拟变量都是单独选择的。这可能会对生成的树木产生影响,但我不知道这可能会变得多严重。

【讨论】:

以上是关于R和sklearn中的随机森林的主要内容,如果未能解决你的问题,请参考以下文章

sklearn库学习----随机森林(RandomForestClassifier,RandomForestRegressor)

#sklearn——随机森林

sklearn随机森林中的引导参数

LSH︱python实现局部敏感随机投影森林——LSHForest/sklearn

LSH︱python实现局部敏感随机投影森林——LSHForest/sklearn

随机森林原理与Sklearn参数详解