我试图使用sklearn中的随机森林分类器包来拟合随机森林模型。但是,我的数据集包含带字符串值的列(' country')。此处的随机林分类器不接受字符串值。它需要所有功能的数值。我想到了一些虚拟变量代替这些列。但是,我很困惑,现在的特征重要性图将如何。会有像country_India,country_usa等变量。如果我使用R进行分析,如何获得国家变量的综合重要性。
答案 0 :(得分:2)
您必须手动完成。 sklearn不支持通过特征映射的逆变换映射分类器特定方法。 R正在计算基于多值分裂的重要性(正如@Soren所解释的) - 当使用scikit-learn时,你必须对二进制分裂进行限制,你必须近似实际的重要性。最简单的解决方案之一(尽管存在偏差)是存储哪些特征实际上是分类变量的二进制编码,并将这些结果元素与特征重要性矢量相加。从数学的角度来看,这不是完全合理的,而是做出粗略估计的最简单的事情。要正确地执行此操作,您应该从头开始重新实现要素重要性,并且只需在计算期间“对于分类期间要素有效的样本数量”,您必须使用映射来正确地将每个样本评估为实际要素一次(作为添加虚拟重要性将计算分类路径上的每个虚拟变量,并且您想要做min(1,路径上的#dummy)。
答案 1 :(得分:0)
有时候,各国的随机枚举(为每个类别分配一些整数)都会很有效。特别是如果类别很少而且训练集大小很大。有时比一热编码好。
一些线程与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只会尝试在每个节点中进行有限的分割选择。