根据你所描述的,一切都应该在
caret
.
我解决这个问题的方法是使用
lappy
函数覆盖要估计的所有模型类型的列表。这件事的好处是当你完成后,你将拥有
train
对象整齐地组合在一起,您可以命名这些对象,然后轻松地提取您要查找的任何信息。
现在已经有了这个漂亮的列表,您可以使用另一个apply函数再次遍历它们来创建respective
confusionMatrix
对象,您可以将其保存为列表,也可以直接提取与测试集上的预测或准确性相关的任何信息。
从那里,将提取的信息绑定到表中进行打印、比较、绘图等应该非常容易。
例如:
# set model names
models <- c("plr", "svmLinear", "rpart", "ada", "nnet", "knn")
# set train control params
trnControl <- trainControl(method='cv',number=5, allowParallel = T,verboseIter = T)
# fit models
set.seed(11)
train_models <- lapply(models, function(model){
print(model)
train(shortflag ~ ., method = model, data = trnds1, trControl = trnControl)
})
# name the models in your list
names(train_models) <- models
有了这个,你有一个很好的列表。如果你这样做了
View(train_models)
,您可以单击并展开所有不同的列表,然后查看可以在其中提取的内容。例如,您可以这样做,以获得训练精度,它返回一个命名列表,以便您知道什么是:
# extract training accuracy
elapsed <- sapply(train_models, function(object)
object$results["Accuracy"])
接下来,使用训练过的模型列表,通过创建
混淆矩阵
得到你想要的关于测试数据的任何信息。下面是从测试集中直接提取模型精度列表的示例:
# extract test accuracy
test_accuracy = sapply(train_models, function(x){
pred = predict(x, newdata = testds1)
cm = confusionMatrix(pred, reference = testds1$shortflag)
return(cm[["overall"]]["Accuracy"])
一句忠告:如果你决定尝试这种方法,我会先从你的训练和测试数据中提取一小部分,然后在你开始使用你的所有数据之前,先让代码完全按照你的要求在这个小部分上运行,就像你把整个模型列表输入
lapply
功能如上面第一步所述,可能需要很长时间才能完成。
希望能帮上忙!