使用“ lda2”,“ qda”,“ lda”从经过Caret训练的模型中检索变量重要性

时间:2018-12-06 12:04:49

标签: r r-caret

我可以从“ 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时如何获得有关模型的性能以及哪些变量的性能最佳的正确反馈?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,这似乎是由于在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

希望有帮助。

苏菲