简短回答:在newdata
参数中指定训练数据。
如何从使用caret
的predict
函数训练的模型中一致地提取类别概率?当前,当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),但这看起来有点投机取巧。有没有办法让predict
按预期工作?
=====编辑=====
我使用caretEnsemble
包中的caretList
训练了多个不同的模型(使用公式表示法),在尝试使用predict
时遇到了各种错误:
knn
错误信息:在knn3Train(train = c(….)中:’test’和’train’的维度不同
svmRadial
:
警告信息:在method$prob(modelFit = modelFit, newdata = newdata, submodels = param)中:kernlab类别概率计算失败;返回NA
mlpML
:
错误信息:在myFunc[[1]](x, …)中:输入数据列数28与输入神经元数20不匹配
没有错误的方法包括nnet
和基于树的方法(rf
,xgbTree
)
=====编辑2=====
以下方法没有考虑重复抽样。选定的答案要简单得多。
这是我自己设计的从训练模型中提取概率的解决方案,但为了标准化,我更希望能够让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] TRUElibrary(randomForest)fit.rf <- randomForest(Species ~ . -Petal.Length, data = iris)identical(predict(fit.rf), predict(fit.rf, newdata=iris))# [1] FALSE