如何使用 r 中的 caret 包对最佳调整的超参数进行 10 次交叉验证中的每次折叠预测?
How to get predictions for each fold in 10-fold cross-validation of the best tuned hyperparameters using caret package in r?
我正在尝试 运行 SVM 模型使用 10 折交叉验证和 3 次重复使用 R 中的插入符包。我想使用最佳调整的超参数获得每次折叠的预测结果。我正在使用以下代码
# Load packages
library(mlbench)
library(caret)
# Load data
data(BostonHousing)
#Dividing the data into train and test set
set.seed(101)
sample <- createDataPartition(BostonHousing$medv, p=0.80, list = FALSE)
train <- BostonHousing[sample,]
test <- BostonHousing[-sample,]
control <- trainControl(method='repeatedcv', number=10, repeats=3, savePredictions=TRUE)
metric <- 'RMSE'
# Support Vector Machines (SVM)
set.seed(101)
fit.svm <- train(medv~., data=train, method='svmRadial', metric=metric,
preProc=c('center', 'scale'), trControl=control)
fit.svm$bestTune
fit.svm$pred
fit.svm$pred
使用超参数的所有组合给我预测。但是我只想对每个重复的 10 倍平均值使用最佳调整的超参数进行预测。
实现目标的一种方法是使用 fit.svm$bestTune
中的超参数对 fit.svm$pred
进行子集化,然后通过 CV 复制聚合所需的度量。我将使用 dplyr
:
执行此操作
library(tidyverse)
library(caret)
fit.svm$pred %>%
filter(sigma == fit.svm$bestTune$sigma & C == fit.svm$bestTune$C) %>% #subset
mutate(fold = gsub("\..*", "", Resample), #extract fold info from resample info
rep = gsub(".*\.(.*)", "\1", Resample)) %>% #extract replicate info from resample info
group_by(rep) %>% #group by replicate
summarise(rmse = RMSE(pred, obs)) #aggregate the desired measure
输出:
# A tibble: 3 x 2
rep rmse
<chr> <dbl>
1 Rep1 4.02
2 Rep2 3.96
3 Rep3 4.06
编辑:如果您不喜欢使用正则表达式,或者只是想节省一些输入,您可以使用 dplyr::separate
:
fit.svm$pred %>%
filter(sigma == fit.svm$bestTune$sigma & C == fit.svm$bestTune$C) %>%
separate(Resample, c("fold", "rep"), "\.") %>%
group_by(rep) %>%
summarise(rmse = RMSE(obs, pred))
EDIT2:回应评论。将观察值和预测值写入 csv。文件:
fit.svm$pred %>%
filter(sigma == fit.svm$bestTune$sigma & C == fit.svm$bestTune$C) %>%
write.csv("predictions.csv")
我正在尝试 运行 SVM 模型使用 10 折交叉验证和 3 次重复使用 R 中的插入符包。我想使用最佳调整的超参数获得每次折叠的预测结果。我正在使用以下代码
# Load packages
library(mlbench)
library(caret)
# Load data
data(BostonHousing)
#Dividing the data into train and test set
set.seed(101)
sample <- createDataPartition(BostonHousing$medv, p=0.80, list = FALSE)
train <- BostonHousing[sample,]
test <- BostonHousing[-sample,]
control <- trainControl(method='repeatedcv', number=10, repeats=3, savePredictions=TRUE)
metric <- 'RMSE'
# Support Vector Machines (SVM)
set.seed(101)
fit.svm <- train(medv~., data=train, method='svmRadial', metric=metric,
preProc=c('center', 'scale'), trControl=control)
fit.svm$bestTune
fit.svm$pred
fit.svm$pred
使用超参数的所有组合给我预测。但是我只想对每个重复的 10 倍平均值使用最佳调整的超参数进行预测。
实现目标的一种方法是使用 fit.svm$bestTune
中的超参数对 fit.svm$pred
进行子集化,然后通过 CV 复制聚合所需的度量。我将使用 dplyr
:
library(tidyverse)
library(caret)
fit.svm$pred %>%
filter(sigma == fit.svm$bestTune$sigma & C == fit.svm$bestTune$C) %>% #subset
mutate(fold = gsub("\..*", "", Resample), #extract fold info from resample info
rep = gsub(".*\.(.*)", "\1", Resample)) %>% #extract replicate info from resample info
group_by(rep) %>% #group by replicate
summarise(rmse = RMSE(pred, obs)) #aggregate the desired measure
输出:
# A tibble: 3 x 2
rep rmse
<chr> <dbl>
1 Rep1 4.02
2 Rep2 3.96
3 Rep3 4.06
编辑:如果您不喜欢使用正则表达式,或者只是想节省一些输入,您可以使用 dplyr::separate
:
fit.svm$pred %>%
filter(sigma == fit.svm$bestTune$sigma & C == fit.svm$bestTune$C) %>%
separate(Resample, c("fold", "rep"), "\.") %>%
group_by(rep) %>%
summarise(rmse = RMSE(obs, pred))
EDIT2:回应评论。将观察值和预测值写入 csv。文件:
fit.svm$pred %>%
filter(sigma == fit.svm$bestTune$sigma & C == fit.svm$bestTune$C) %>%
write.csv("predictions.csv")