Указание выбранного диапазона данных, которые будут использоваться в перекрестной проверке «оставь-один-один-один-раз» («нож-нож») для использования в функции caret :: train - PullRequest
0 голосов
/ 20 ноября 2018

Этот вопрос основан на вопросе, который я задал здесь: Создание разделов данных по выбранному диапазону данных для подачи в функцию caret :: train для перекрестной проверки ).

Данные, с которыми я работаю, выглядят так:

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 написал некоторый код с этой целью, который приближается к желаемому результату для этого вопроса в приведенной выше ссылке.

Я бы попробовал показать желаемый результат, но, честно говоря, вывод функций caret :: groupKFold меня смущает, так что, надеюсь, приведенного выше описания будет достаточно.Рад попробовать и уточнить, хотя!

1 Ответ

0 голосов
/ 30 ноября 2018

Вот один способ, которым вы могли бы создать нужный раздел, используя 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 Я не уверен, что буду копать немного глубже.

...