插入符号:当“train”公式删除变量时,“predict”失败
caret: `predict` fails when `train` formula has deleted variables
TL/DR 答案:在 newdata
参数中指定训练数据。
如何从 caret
的 predict
训练模型中始终如一地提取 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 时遇到了各种错误=]
knn
Error in knn3Train(train = c(....) : dims of 'test' and 'train differ
svmRadial
:
Warning message:
In method$prob(modelFit = modelFit, newdata = newdata, submodels = param) :
kernlab class probability calculations failed; returning NAs
mlpML
:
Error in myFunc[[1]](x, ...) :
number of input data columns 28 does not match number of input neurons 20
没有错误的方法是 nnet
和基于树的方法(rf
、xgbTree
)
=====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
TL/DR 答案:在 newdata
参数中指定训练数据。
如何从 caret
的 predict
训练模型中始终如一地提取 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 时遇到了各种错误=]
knn
Error in knn3Train(train = c(....) : dims of 'test' and 'train differ
svmRadial
:
Warning message: In method$prob(modelFit = modelFit, newdata = newdata, submodels = param) : kernlab class probability calculations failed; returning NAs
mlpML
:
Error in myFunc[[1]](x, ...) : number of input data columns 28 does not match number of input neurons 20
没有错误的方法是 nnet
和基于树的方法(rf
、xgbTree
)
=====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