sklearn中的随机森林
Posted
技术标签:
【中文标题】sklearn中的随机森林【英文标题】:Random forest in sklearn 【发布时间】:2016-07-23 09:17:14 【问题描述】:我试图使用来自 sklearn 的随机森林分类器包来拟合随机森林模型。但是,我的数据集由具有字符串值('国家')的列组成。这里的随机森林分类器不采用字符串值。它需要所有特征的数值。我想用一些虚拟变量来代替这些列。但是,我对特征重要性图现在的样子感到困惑。会有 country_India、country_usa 等变量。如果我使用 R 进行分析,如何获得 country 变量的综合重要性。
【问题讨论】:
【参考方案1】:您必须手动完成。 sklearn 不支持通过特征映射的逆变换来映射分类器特定的方法。 R 正在计算基于多值拆分的重要性(正如@Soren 解释的那样) - 使用 scikit-learn 时,您受限于二进制拆分,您必须近似实际重要性。最简单的解决方案之一(尽管有偏见)是存储哪些特征实际上是分类变量的二进制编码,并将这些结果元素从特征重要性向量中求和。从数学的角度来看,这并不完全合理,但最简单的事情就是得到一些粗略的估计。要正确地做到这一点,您应该从头开始重新实现特征重要性,并且只需在计算“在分类期间该特征有多少样本处于活动状态”期间,您必须使用映射将每个样本正确评估一次到实际特征(如添加虚拟重要性将计算分类路径上的每个虚拟变量,而您想要执行 min(1, #dummy on path)。
【讨论】:
好的。太感谢了。我不确定是否可以简单地添加虚拟变量的重要性值。 没有明确的方法可以做到这一点,通过编码处理分类变量总是会引入某种偏差。 RF 特征重要性或多或少是使用该特征的点的预期分数。因此,如果您的特征是分类的,那么每个样本应该只使用一个虚拟变量来获取它的值。然后你可以简单地添加。不幸的是,在找到“有效”虚拟变量之前,您无法控制使用了多少“其他”虚拟变量(因此在“俄罗斯”之前您将有多少次“非印度”、“非美国”),因此聚合几乎不可能。 我所说的“不可能”是指 - 不可能从 scikit-learn 的特征重要性中恢复过来。如果您分析每个训练/测试样本分类过程,仍然可以手动计算它,但这需要在您的情况下从头开始编写整个特征重要性,因为您只想计算“1”,无论多少次决定使用你的虚拟变量。 那么,当我们需要特征重要性图并且数据集中有字符串列时,您是否建议使用 R 而不是 sklearn? 可能 r 是分类数据的更好选择。 Scikit learn 是为数字而设计的【参考方案2】:国家的随机枚举(为每个类别分配一些整数)有时会很好。尤其是在类别很少且训练集规模很大的情况下。有时比一次性编码更好。
一些讨论与 sklearn 的两个选项的线程: https://github.com/scikit-learn/scikit-learn/issues/5442
How to use dummy variable to represent categorical data in python scikit-learn random forest
您还可以选择使用真正支持分类数据的 RF 算法,例如 Arborist(python 和 R 前端)、extraTrees(R、Java、RF'isch)或 randomForest(R)。为什么 sklearn 选择不支持分类拆分,我不知道。也许实施方便。
在 10 个类别之后尝试的可能分类拆分数量激增,搜索变慢并且拆分可能变得贪婪。 Arborist 和 extraTrees 只会在每个节点中尝试有限的拆分选择。
【讨论】:
以上是关于sklearn中的随机森林的主要内容,如果未能解决你的问题,请参考以下文章