【问题标题】:Retrieving Variable Importance from Caret trained model with "lda2", "qda", "lda"从带有“lda2”、“qda”、“lda”的 Caret 训练模型中检索变量重要性
【发布时间】:2019-05-08 03:09:32
【问题描述】:

我可以从“nnet”和“knn”模型中获得可变重要性,但不能从“lda”、“lda2”和“qda”中获得。

我正在使用 varImp()。我已经尝试了所有我能想到的方法,但无法正确理解变量重要性是什么。

这是我训练模型的代码:

lda_model <- train(quality2 ~ ., 
                   data = train_data,
                   method = "lda",
                   preProcess = c("center", "scale"),
                   trControl = trainControl(method = "repeatedcv",
                                            number = 10,
                                            repeats = 2),
                   importance = TRUE)

这是我在尝试检查重要性时遇到的错误:

> varImp(lda_model)
Error in model.frame.default(formula = y ~ x, na.action = na.omit, drop.unused.levels = TRUE) : 
  invalid type (list) for variable 'y'
In addition: Warning messages:
1: In mean.default(y, rm.na = TRUE) :
  argument is not numeric or logical: returning NA
2: In Ops.factor(left, right) : ‘-’ not meaningful for factors

我知道这意味着它将其视为对象类列表而不是经过训练的模型,并且我已经在 lda_model$finalmodel 和其他模型上进行了尝试,但它仍然无法正常工作。

在使用 lda/qda 时,如何获得关于我的模型表现如何以及哪些变量表现最佳的适当反馈?

【问题讨论】:

  • quality2的值是多少?
  • 由于没有给出任何信息,我假设quality2 是一个带有数值的因子。尝试将数值转换为字符。
  • 抱歉回复缓慢,quality2 是 0 级和 1 级的一个因素
  • 我会试着把它改成一个字符
  • @quality2 很遗憾这没有帮助,我尝试了字符、数字和因子数字,但都不起作用

标签: r r-caret


【解决方案1】:

我遇到了同样的问题,它似乎来自于在 R 中导入数据集的方式。我首先使用 {readxl} 包导入,而 varImp() 不起作用。然后我尝试通过剪贴板导入,现在 varImp 正在使用 {caret} 构建我的 lda 模型。

我的 {readxl} 代码:

library(readxl)
glauc <- read_excel("Glaucome.xlsx", sheet="GlaucomaM")
rownames(glauc) <- glauc$IDENT
glauc$IDENT <- NULL
glauc$Class <- as.factor(glauc$Class)

library(caret)
numappr <- createDataPartition(glauc$Class, p=0.7)
appr <- glauc[numappr$Resample1,]
test <- glauc[-numappr$Resample1,]

Ctrl <- trainControl(summaryFunction=twoClassSummary,
                     classProbs=TRUE)
appr.lda <- train(Class~., data=appr, method="lda",
                  trControl=Ctrl, preProc = c("center","scale"),
                  metric="ROC")
varImp(appr.lda)

这会导致与您的错误消息相同。

Error: $ operator is invalid for atomic vectors
In addition: Warning messages:
1: In mean.default(y, rm.na = TRUE) :
  argument is not numeric or logical: returning NA
2: In Ops.factor(left, right) : ‘-’ not meaningful for factors

还有我的带有 read.table() 和剪贴板的代码:

glauc <- read.table("clipboard", header=T, sep="\t", dec=".")
rownames(glauc) <- glauc$IDENT
glauc$IDENT <- NULL

library(caret)
numappr <- createDataPartition(glauc$Class, p=0.7)
appr <- glauc[numappr$Resample1,]
test <- glauc[-numappr$Resample1,]

Ctrl <- trainControl(summaryFunction=twoClassSummary,
                     classProbs=TRUE)
appr.lda <- train(Class~., data=appr, method="lda",
                  trControl=Ctrl, preProc = c("center","scale"),
                  metric="ROC")
varImp(appr.lda)

这个导致结果(这里只有第一个):

varImp(appr.lda)
ROC curve variable importance

  only 20 most important variables shown (out of 62)

     Importance
vari     100.00
varg      97.14
vars      94.52
phci      93.69
hic       92.02
phcg      90.55
tms       89.96

希望对你有帮助。

苏菲

【讨论】:

  • 对我来说,解决方案是使用as.data.frame 将我的tibble 转换为data.frame,然后将其传递给varImp。我认为使用data.table 默认为一个数据框,所以它最终可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 2016-09-29
  • 2016-03-09
  • 2012-07-24
  • 2019-10-11
  • 2014-12-06
  • 1970-01-01
相关资源
最近更新 更多