如何使用ranger获取按类别排序的特征重要性?

4

我一直在使用 R 语言中的 ranger 和 randomForest 函数。我特别关注的是获取每个类别预测时特征(预测变量)的重要性,而不是所有类别的总体重要性。我知道如何使用 randomForest 中的 importance() 函数来实现这一点,因为它似乎是默认行为:

library(randomForest)
set.seed(100)
rfmodel <- randomForest(Species ~ ., data = iris, ntree = 1000, importance = TRUE)
importance(rfmodel)

这将生成一个矩阵,其中包含每个特征对于三个类别的重要性。

另外,对于ranger,我正在运行:

library(ranger)
rangermodel<-ranger(Species ~ ., data = iris, num.trees = 1000, write.forest=TRUE, importance="permutation", local.importance=TRUE)
importance(rangermodel)
rangermodel$variable.importance
rangermodel$variable.importance.local

rangermodel$variable.importance提供了整个分类问题中特征的重要性,但不按类别提供。而rangermodel$variable.importance.local提供了每个案例的重要性,但同样不按类别提供。
ranger文档似乎没有提供有关此信息的信息。我在这个主题上唯一找到的问题是这个:如何在使用随机森林时分离总体变量重要性值? 但他们没有得出使用ranger实现这一点的结论。 将ranger代码更改如下也未能提供我要寻找的输出:
rangermodel<-ranger(Species ~ ., data = iris, num.trees = 1000, write.forest=TRUE, importance="impurity")
1个回答

3

这个想法是使用局部变量重要性,定义如下:

对于每个案例,考虑所有OOB的树。从未触及的OOB数据中正确分类的投票百分比减去变量m置换后OOB数据中正确分类的投票百分比。这是此案例中变量m的局部重要性得分。 来源:Breiman和Cutler网站,章节:变量重要性

ranger 中提取局部变量重要性:您需要同时指定 importance = "permutation"local.importance = TRUE

library(ranger)
rf.iris <- ranger(Species ~ ., iris, importance = "permutation", 
             local.importance = TRUE)
rf.iris$variable.importance.local

然后您可以
library(data.table)    
as.data.table(rf.iris$variable.importance.local)[,Species := iris$Species][,lapply(.SD,mean),by=Species]

Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1:     setosa      0.01316     0.00252      0.11192     0.12548
2: versicolor      0.00800     0.00120      0.10672     0.11112
3:  virginica      0.01352     0.00316      0.10632     0.09956

参考资料:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接