从 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
函数,可能需要相当长的时间才能完成。
希望对您有所帮助!
我是 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
函数,可能需要相当长的时间才能完成。
希望对您有所帮助!