【问题标题】:How to get predictions for each fold in 10-fold cross-validation of the best tuned hyperparameters using caret package in r?如何使用 r 中的插入符号包在 10 倍交叉验证中获得最佳调整超参数的每个折叠的预测?
【发布时间】:2019-11-18 21:34:56
【问题描述】:

我试图使用 R 中的 caret 包使用 10 折交叉验证和 3 次重复运行 SVM 模型。我想使用最佳调整的超参数来获得每个折叠的预测结果。我正在使用以下代码

# 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 倍平均值使用最佳调整的超参数进行预测。

【问题讨论】:

    标签: r r-caret


    【解决方案1】:

    实现目标的一种方法是使用 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")
    

    【讨论】:

    • 我不希望 RMSE 作为输出。我希望对每个折叠使用最佳调整参数的观察值和预测值,以便我可以计算 预测的标准偏差或标准误差。使用您的代码,我只能看到前 10 个样本的观察值和预测值。怎么写成.csv文件?
    • 非常感谢。我现在得到了想要的输出。如果可以将输出作为每次观察的标准偏差或标准误差重复次数的平均值将有很大帮助。
    • 所以你想要重复的标准偏差和错误,但是为了什么?对于 RMSE?
    • 衡量模型预测的不确定性。实际上,我会将它用于模型不确定性的数字映射。我想要模型预测的 SE 地图或置信区间也可以达到目的。是否有可能获得SVM 预测的置信区间。我知道它可用于线性回归。
    • 您想要预测的置信区间吗?我认为你可以通过引导来做到这一点。我不知道任何用于估计 SVM 置信区间的封闭式计算。这是相关的:stats.stackexchange.com/questions/94845/…。如果我的评论不够有用,请考虑再问一个问题。
    猜你喜欢
    • 2017-12-09
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2020-01-25
    • 1970-01-01
    • 2017-02-05
    相关资源
    最近更新 更多