【问题标题】:caret: `predict` fails when `train` formula has deleted variables插入符号:当 `train` 公式删除变量时,`predict` 失败
【发布时间】:2017-05-28 09:16:30
【问题描述】:

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

如何从使用caretpredict 训练的模型中始终如一地提取类别概率?目前,当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")

predict.lda(modelFit, newdata) 中的错误:变量数错误

如果在train 公式中省略了-Petal.Length,则不会出错。我对公式语句做错了吗?

我想我可以挖掘模型的 pred 插槽并获取与类类型相对应的列(请参阅 EDIT2),但这似乎是 hackish。 有没有办法获得 predict按预期工作?

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

我使用 caretEnsemble 包中的 caretList 训练了许多不同的模型(使用公式表示法),但在尝试使用 predict 时出现各种错误:

  • knn

knn3Train(train = c(....) 中的错误:'test' 和 'train 的尺寸不同

  • svmRadial:

警告信息: 在方法$prob(modelFit = modelFit, newdata = newdata, submodels = param) 中: kernlab 类概率计算失败;返回 NAs

  • mlpML:

myFunc[[1]](x, ...) 中的错误: 输入数据列数 28 与输入神经元数 20 不匹配

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

=====EDIT2=====

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

这是从训练后的模型中提取概率的自制解决方案,但为了标准化,我更希望predict 能够正常运行。

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

grabProbs(fit.lda)

【问题讨论】:

  • 你现在有什么问题?
  • @sandipan 我只是想使用predict 有一种标准化的方法来从经过训练的模型中提取类概率(并在以后预测新数据)......正是predict 的意思成为。编辑问题以澄清。

标签: r machine-learning r-caret


【解决方案1】:

只需使用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

【讨论】:

  • 哇,这么简单。这似乎有效。我很困惑为什么不指定newdata 就不能工作。来自predict 文档:“newdata:要预测的可选数据集。如果为 NULL,则使用原始训练数据”
  • 实际上,我不确定这是否正确:请参阅 Hong Ooi 在 stats.stackexchange.com/a/112052/130941 的帖子 似乎 predict 可能会根据是否指定 newdata = train 给出不同的结果。
  • 但是我们这里使用的模型是lda而不是rf,所以我们没有任何OOB的概念。更新了上面的帖子,看看吧。
  • 我对@9​​87654334@ 对不同型号的表现持谨慎态度。我使用lda 作为可重现的示例,但对于我的实际问题,我使用caretEnsemble 来训练和预测许多模型,包括rf。因此,除非我为每个模型检查带有和不带有 newdata 的相同结果,否则这不是一个完整的解决方案。
  • 你到底想要什么不清楚。 (1) 如果您想对训练数据集进行预测,那么上面的newdata 将始终有效,无论模型是什么。 (2) 如果您想要对类似 RF 的模型进行 OOB 估计(这与对训练数据集的预测不同),您已经可以在不使用 newdata 参数的情况下得到它,并且它确实适用于类似 RF 的模型,正如您在你的帖子,我也查了。所以这两种方式都涵盖了所有情况,我认为是一个完整的解决方案。
猜你喜欢
  • 2015-10-28
  • 2015-07-17
  • 2018-11-11
  • 2017-08-13
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
相关资源
最近更新 更多