使用 Caret 的 R 中各个类的变量重要性

问题描述 投票:0回答:2

我使用随机森林来预测类别。现在,我正在尝试绘制每个班级的变量重要性。我使用了下面的代码,但它并没有为我提供 varImp 类,而是为我提供了整个模型。有人可以帮帮我吗?

谢谢。

odFit = train(x = df_5[,-22], 
              y = df_5$`kpres$cluster`,
              ntree=20,method="rf",metric = "Accuracy",trControl = control,tuneGrid = tunegrid
              )
odFit

varImp(odFit)
r random-forest r-caret caret
2个回答
3
投票

只需在

importance=TRUE
函数中添加
train
,这与
importance(odFit)
包中的
randomForest
相同。

这里有一个可重现的例子:

library(caret)
data(iris)

control <- trainControl(method = "cv",10)
tunegrid <- expand.grid(mtry=2:ncol(iris)-1)
odFit = train(x = iris[,-5], 
              y = iris$Species,
              ntree=20,
              trControl = control,
              tuneGrid = tunegrid,
              importance=T
)
odFit

varImp(odFit)

这是输出

rf variable importance

  variables are sorted by maximum importance across the classes
             setosa versicolor virginica
Petal.Width   57.21     73.747    100.00
Petal.Length  61.90     79.981     77.49
Sepal.Length  20.01      2.867     40.47
Sepal.Width   20.01      0.000     15.73

您可以使用

ggplot

绘制变量重要性
library(ggplot2)
vi <- varImp(odFit,scale=T)[[1]]
vi$var <-row.names(vi) 
vi <- reshape2::melt(vi)

ggplot(vi,aes(value,var,col=variable))+
  geom_point()+
  facet_wrap(~variable)


0
投票

如果您需要“每个班级”的变量重要性,则必须在随机森林的 train() 模型中定义

importance=T
;否则,它只会为您提供所有类别中的总体重要变量。除此之外,您的代码没有任何问题。这是您自己的代码的修改版本:

odFit = train(x = df_5[,-22], 
          y = df_5$`kpres$cluster`,
          ntree=20,method="rf",metric = "Accuracy",trControl = 
control,tuneGrid = tunegrid, importance=T
          )
odFit

varImp(odFit)
© www.soinside.com 2019 - 2024. All rights reserved.