从 R 中的插入符号机器学习模型中提取预测值

extract the predicted values from caret machine learning models in R

我是 Whosebug 的新手,所以对于我犯的任何错误,我提前表示歉意。

我是 运行 R 中的各种机器学习模型,使用 caret 包- Logistic 回归、SVM、决策树、提升树,神经网络和 K- 最近邻 .

我使用插入符号,因为实现所有这些模型只是更改方法名称的问题。

我想提取模型在训练集和测试集上所做的预测,这些对 output/dependent 变量的预测将被存储回数据集以与实际值进行比较.

我研究并找到了以下代码:

results<-extractPrediction(models, testX = NULL, testY = NULL, unkX = NULL, unkOnly = !is.null(unkX) & is.null(testX), verbose = FALSE)

其中 models 是要提取其结果的所有模型的列表。

首先,代码抛出了一个错误,除非以下面的方式执行,但让我们暂时保留它。

results<-extractPrediction(models)

现在,当我将模型输入此函数时,我确实得到了模型的实际值和预测值,但由于没有可用的索引号,我不知道哪个值对应于哪个记录原始数据集。

其次,输入函数的模型只包含训练集而不包含测试集。我需要以正确的顺序提取训练集和测试集的预测值以进行比较。

我正在尝试做的事情是可能的还是我只是在追星?

我还附上了我正在使用的模型样本供您参考:

在数据集上实施线性 SVM

    cl <- parallel::makeCluster(detectCores(logical=TRUE), type='PSOCK')
    doParallel::registerDoParallel(cl)

   start.time <- Sys.time()
   trnControl <- trainControl(method='cv',number=5, allowParallel = T,verboseIter = T) 

   set.seed(11)
   ds1lnrsvm <- train(shortflag~., data=trnds1,method="svmLinear",
                   trControl=trnControl)
   ds1lnrsvm_t<- Sys.time() - start.time

   parallel::stopCluster(cl)
   registerDoSEQ()


## Implementing Linear SVM model on test dataset
   ds1lnrsvmres <- predict(object=ds1lnrsvm, newdata=testds1) 

## confusion matrix to check performance
   confusionMatrix(data=ds1lnrsvmres, reference=testds1$shortflag,positive="1")

任何关于如何实现这一点的帮助或建议将不胜感激。

提前感谢您的建议。

没有 trnds1/testds1, 我无法重现你的问题,但也许下面就是你想要的。

library(dplyr)

pred <- extractPrediction(list(NAME = ds1lnrsvm),   # extractPrediction want list(model)
                          testX = select(testds1, -shortflag),
                          testY = pull(testds1, shortflag))

trnds1 %>%                  # train data 
  bind_rows(testds1) %>%    # bind_rows with testdata
  bind_cols(pred) # %>%     # add cols of predict
  # select(-shortflag) # shortflg is the same as obs, if you want please delete the col.

根据您目前的描述,caret 中的一切都应该是可能的。

我解决这个问题的方法是对您要估计的所有模型类型的列表使用 lappy 函数。这样做的好处是,当您完成后,您将把所有 train 对象整齐地组合在一起,您可以命名它们,然后轻松提取您要查找的任何信息。

现在你有了这个漂亮的列表,你可以用另一个应用函数再次遍历它们来创建相应的 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),您可以单击并展开所有不同的列表,看看您可以从中提取哪些内容。因此,例如,您可以做这样的事情,以获得训练准确性,其中 returns 一个命名列表,因此您知道什么是什么:

# extract training accuracy
elapsed <- sapply(train_models, function(object) 
    object$results["Accuracy"])

接下来,根据您的训练模型列表,通过并创建 confusionMatrix 以获取您想要的测试数据信息。下面是直接从测试集中提取模型准确率列表的例子:

# 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 函数,可能需要相当长的时间才能完成。

希望对您有所帮助!