首先,我想澄清一下重要性指标的实际作用。
MeanDecreaseGini是一种用于衡量重要程度的变量,该指标基于用于训练期间分裂计算的基尼杂质指数。一个常见的误解是,变量重要性度量是指用于声明模型性能的基尼,基尼与AUC密切相关,但这是错误的。这是Breiman和Cutler编写的randomForest软件包的解释:
基尼重要性
每次在变量m上分割节点时,两个后代节点的基尼杂质准则都小于父节点。将森林中所有树木上每个变量的基尼系数加起来得出的快速变量重要性通常与排列重要性度量非常一致。
G = ∑我= 1ñCp一世(1 − p一世)
ñCp一世是这个类的比率。
对于两类问题,这将导致以下曲线,该曲线对于50-50样本最大,对于齐次集合最小:
一世= Gp 一个ř ë Ñ 吨− G小号p 升我吨1− G小号p 升我吨2
E [ E [X| ÿ] ] = E [ X]
现在,直接回答您的问题并不只是简单地总结每个组中的所有重要性以得到合并的MeanDecreaseGini,而是计算加权平均值将为您找到所需的答案。我们只需要找到每个组中的可变频率即可。
这是一个简单的脚本,可以从R中的随机森林对象中获取它们:
var.share <- function(rf.obj, members) {
count <- table(rf.obj$forest$bestvar)[-1]
names(count) <- names(rf.obj$forest$ncat)
share <- count[members] / sum(count[members])
return(share)
}
只需传入组中变量的名称作为members参数即可。
我希望这回答了你的问题。如果感兴趣,我可以编写一个函数直接获取组的重要性。
编辑:
这是一个函数,它给定randomForest
对象的重要性和带有变量名的向量列表,从而赋予组重要性。它使用var.share
如先前定义的。我没有进行任何输入检查,因此您需要确保使用正确的变量名。
group.importance <- function(rf.obj, groups) {
var.imp <- as.matrix(sapply(groups, function(g) {
sum(importance(rf.obj, 2)[g, ]*var.share(rf.obj, g))
}))
colnames(var.imp) <- "MeanDecreaseGini"
return(var.imp)
}
用法示例:
library(randomForest)
data(iris)
rf.obj <- randomForest(Species ~ ., data=iris)
groups <- list(Sepal=c("Sepal.Width", "Sepal.Length"),
Petal=c("Petal.Width", "Petal.Length"))
group.importance(rf.obj, groups)
>
MeanDecreaseGini
Sepal 6.187198
Petal 43.913020
它也适用于重叠的组:
overlapping.groups <- list(Sepal=c("Sepal.Width", "Sepal.Length"),
Petal=c("Petal.Width", "Petal.Length"),
Width=c("Sepal.Width", "Petal.Width"),
Length=c("Sepal.Length", "Petal.Length"))
group.importance(rf.obj, overlapping.groups)
>
MeanDecreaseGini
Sepal 6.187198
Petal 43.913020
Width 30.513776
Length 30.386706