Py学习  »  机器学习算法

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

shubhankarnanda • 4 年前 • 677 次点击  

我对stackoverflow还不熟悉,所以我对自己犯的任何错误都要事先道歉。

我在R中运行各种机器学习模型,使用 插入符号 包装- Logistic回归、支持向量机、决策树、增强树、神经网络和K近邻 .

我使用插入符号作为所有这些模型的实现,只需要更改方法的名称。

我想提取模型在训练集和测试集上所做的预测,并将输出/因变量的这些预测存储回数据集,以便与实际值进行比较。

我研究了一下,找到了下面的代码:

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

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

首先,代码抛出了一个错误,除非以下面的方式执行,但我们暂时不讨论这个问题。

results<-extractPrediction(models)

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

其次,输入函数的模型只包含训练集而不包含测试集。我需要将训练和测试集的预测值结合起来,并按照正确的顺序进行比较。

我想做的是可能的,还是仅仅是为了星星??

我还提供了一个模型示例,供您参考:

在数据集上实现线性支持向量机

    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")

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

提前谢谢你的建议。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49796
 
677 次点击  
文章 [ 2 ]  |  最新文章 4 年前
anguyen1210
Reply   •   1 楼
anguyen1210    4 年前

根据你所描述的,一切都应该在 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 功能如上面第一步所述,可能需要很长时间才能完成。

希望能帮上忙!

cuttlefish44
Reply   •   2 楼
cuttlefish44    4 年前

我不能复制你的问题没有 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.