Specifiying数据的所选范围中留一出(折刀)交叉验证用于在插入符::列车功能使用(Speci

2019-11-05 07:37发布

这个问题建立在问题,我在这里问: 对数据的选择范围创建数据分区被送入插入符号::火车功能交叉验证 )。

我有看起来像这样的工作数据:

df <- data.frame(Effect = rep(seq(from = 0.05, to = 1, by = 0.05), each = 5), Time = rep(c(1:20,1:20), each = 5), Replicate = c(1:5))

基本上就是我想要做的就是创建自定义分区,如由生成的caret::groupKFold功能,但这些褶皱是在指定的范围(即> 15天)和每个折叠与保持一个点是测试集,并与所有其他数据被用于训练。 这将在每次迭代被重复直到在指定的范围中的每个点被用作测试集。 @Missuse写了一些代码为此目的它获取接近期望输出用于上述链路这个问题。

我会尝试,并显示你所期望的输出,但在所有诚实插入符号:: groupKFold功能输出混淆了我,所以希望上面的描述就足够了。 乐于尝试,虽然澄清!

Answer 1:

这里有一种方法,你可以创建一个使用所需的分区tidyverse

library(tidyverse)

df %>%
  mutate(id = row_number()) %>% #create a column called id which will hold the row numbers
  filter(Time > 15) %>% #subset data frame according to your description 
  split(.$id)  %>% #split the data frame into lists by id (row number)
  map(~ .x %>% select(id) %>% #clean up so it works with indexOut argument in trainControl
        unlist %>%
        unname) -> folds_cv

编辑:看来indexOut预期参数不执行,但index进行论证后这样做folds_cv一个使用可以只获得倒数setdiff

folds_cv <- lapply(folds_cv, function(x) setdiff(1:nrow(df), x))

现在:

test_control <- trainControl(index = folds_cv,
                             savePredictions = "final")


quad.lm2 <- train(Time ~ Effect,
                  data = df,
                  method = "lm",
                  trControl = test_control)

一个警告:

Warning message:
In nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo,  :
  There were missing values in resampled performance measures.
> quad.lm2
Linear Regression 

200 samples
  1 predictor

No pre-processing
Resampling: Bootstrapped (50 reps) 
Summary of sample sizes: 199, 199, 199, 199, 199, 199, ... 
Resampling results:

  RMSE          Rsquared  MAE         
  3.552714e-16  NaN       3.552714e-16

Tuning parameter 'intercept' was held constant at a value of TRUE

所以每个重新采样使用199行和预测1,重复一个我们希望在一个时间保持了所有50行。 这可以被验证了:

quad.lm2$pred

为什么Rsquared缺少我不知道我会挖一个深一点。



文章来源: Specifiying a selected range of data to be used in leave-one-out (jack-knife) cross-validation for use in the caret::train function