如何使用 Ranger 按类别获取特征重要性?

Posted

技术标签:

【中文标题】如何使用 Ranger 按类别获取特征重要性?【英文标题】:How to obtain feature importance by class using ranger? 【发布时间】:2020-08-04 00:14:36 【问题描述】:

我一直在 R 中使用 ranger 和 randomForest 函数。我特别感兴趣的是了解我试图预测的每个类的特征(预测变量)的重要性,而不是所有类的整体重要性。我知道如何使用 randomForest 中的 important() 函数来做到这一点,它似乎是默认行为:

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

这会产生一个矩阵,其中包含三个类别中每个类别的每个特征的重要性

或者我正在运行的游侠:

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 提供了每种情况的重要性,但也不是按类别。

游侠文档似乎没有提供这方面的信息。 我能找到的关于这个话题的唯一问题是这个:How can I separate the overall variable importance values when using Random forest? 但他们没有就如何使用 ranger 实现这一点得出结论。 如下更改游侠代码并没有提供我正在寻找的输出:

rangermodel<-ranger(Species ~ ., data = iris, num.trees = 1000, write.forest=TRUE, importance="impurity")

【问题讨论】:

【参考方案1】:

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

对于每种情况,考虑它是 oob 的所有树。从未触及的 oob 数据中正确类别的投票百分比中减去变量 m 排列的 oob 数据中正确类别的投票百分比。这是这种情况下变量 m 的局部重要性分数。 Source: Breiman's and Cutler website, section: Variable Importance

ranger中提取局部变量重要性:你需要指定bothimportance = "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

参考:

SO: What exactly does the LocalImp parameter do in randomForests package? R::ranger github issue: variable importance by class #552

【讨论】:

以上是关于如何使用 Ranger 按类别获取特征重要性?的主要内容,如果未能解决你的问题,请参考以下文章

随机森林变量重要性排序时的影响为负值怎么办

随机森林如何评估特征重要性

Ranger 预测数据框中每一行的类别概率

如何使用权重在逻辑回归中获得特征重要性?

如何获取在 Wordpress 中按类别过滤的自定义帖子类型的永久链接?

如何在 Kotlin 中按类别获取问题