返回R中插入符包中每次迭代的变量重要性

时间:2014-07-16 11:15:37

标签: r r-caret

我正在使用R的{​​{1}}包运行随机林模型,并且在返回的对象上运行caret可以获得平均变量重要性引导迭代次数。但是,我宁愿评估每次迭代的变量重要性。这可能是使用varImp包吗?

可重复的例子:

caret

返回:

library(caret)
mod <- train(Species ~ ., data = iris,
         method = "cforest",
         controls = cforest_unbiased(ntree = 10))
varImp(mod)
我感兴趣的是一个长度列表=每次迭代具有可变重要性的bootstrap重采样数。使用cforest variable importance Overall Petal.Width 100.0000 Petal.Length 86.6279 Sepal.Length 0.5814 Sepal.Width 0.0000 和自定义returnResamp = "all"的某种组合可能是可能的,但我不够明智。

2 个答案:

答案 0 :(得分:2)

你指的是哪些引导迭代? cforest内部使用的内容或train完成的重新采样?

train返回最终模型对象产生的重要性分数(可能与&#34不同;跨越自举迭代次数的平均变量重要性&#34;,取决于您对第一个模型对象的答案问题。)

如果您希望获得重新采样的重要性分数超过train重新取样,您可以欺骗rfe进行重新取样。例如:

set.seed(1)
mod <- rfe(x = iris[, 1:4], y = iris$Species, sizes = 4,
           rfeControl = rfeControl(functions = caretFuncs, 
                                   method = "boot",
                                   number = 5),
           ## pass options to train(), 
           tuneGrid = data.frame(mtry = 2),
           method = "cforest",
           controls = cforest_unbiased(ntree = 10))

然后每次迭代的重要性分数都在mod$variables

最高

答案 1 :(得分:0)

经过一番挖掘后,我想出了

getvarimp <- function(x) {
    stopifnot(is(x, "train") & is(x$finalModel, "RandomForest"))
    vi<-party:::varimp
    body(vi)[[length(body(vi))]]<-quote(return(perror))
    vi(x$finalModel)
}

getvarimp(mod)

至少对于这种对象类型,这似乎是varImp如何计算它的返回值。具体来说,它采用列方式和重新划分

vi <- colMeans(getvarimp(mod))
(vi-min(vi)) / max(vi)*100

请注意,每次运行此(或varImp)时,您可能会得到略有不同的结果,因为它每次运行都会使用一些随机预测。

可能还有其他方法,但我无法找到任何方法。