插入符号:当“train”公式删除变量时,“predict”失败

caret: `predict` fails when `train` formula has deleted variables

TL/DR 答案:在 newdata 参数中指定训练数据。

如何从 caretpredict 训练模型中始终如一地提取 class 概率?当前,当使用公式符号训练 predict 的参数并且使用 -variable 指示忽略变量时,我收到错误消息。

这可以通过以下方式复制:

fit.lda <- train(Species ~ . -Petal.Length, 
  data = iris, 
  preProcess = c("center", "scale"), 
  trControl = trainControl(method = "repeatedcv", 
    number = 10, 
    repeats = 3, 
    classProbs = TRUE, 
    savePredictions = "final", 
    selectionFunction = "best", 
    summaryFunction = multiClassSummary), 
  method = "lda", 
  metric = "Mean_F1")

然后下面一行将失败:

predict(fit.lda, type = "prob")

Error in predict.lda(modelFit, newdata) : wrong number of variables

如果在train公式中省略了-Petal.Length,则没有错误。我是不是公式语句有问题?

我想我可以深入模型的 pred 插槽并获取与 class 类型对应的列(参见 EDIT2),但这看起来很老套。 有没有办法让 predict 按预期工作?

=====编辑=====

我用 caretEnsemble 包中的 caretList 训练了许多不同的模型(使用公式表示法),在尝试使用 predict:[=36 时遇到了各种错误=]

Error in knn3Train(train = c(....) : dims of 'test' and 'train differ

Warning message: In method$prob(modelFit = modelFit, newdata = newdata, submodels = param) : kernlab class probability calculations failed; returning NAs

Error in myFunc[[1]](x, ...) : number of input data columns 28 does not match number of input neurons 20

没有错误的方法是 nnet 和基于树的方法(rfxgbTree

=====EDIT2=====

以下不考虑重复重采样。选择的答案就简单多了。

这是一个从训练模型中提取概率的自制解决方案,但为了标准化,我更愿意 predict 表现出来。

grabProbs <- function(model) model$pred[, colnames(model$pred) %in% model$levels]

grabProbs(fit.lda)

只需使用newdata参数即可

predict(fit.lda, newdata = iris, type = "prob")

[已编辑]

正如我们所见,lda 的预测结果是相同的:

library(MASS)
fit.lda <- lda(Species ~ . -Petal.Length, data = iris)
identical(predict(fit.lda), predict(fit.lda, newdata=iris))
# [1] TRUE

library(randomForest)
fit.rf <- randomForest(Species ~ . -Petal.Length, data = iris)
identical(predict(fit.rf), predict(fit.rf, newdata=iris))
# [1] FALSE