r параметры оценки каретки на подмножестве, подходящем для полных данных

У меня есть набор данных из 550 тыс. Элементов, которые я разделил на 500 тыс. Для обучения и 50 тыс. Для тестирования. На этапе обучения необходимо установить «лучшую» комбинацию значений параметров каждого алгоритма. Вместо того, чтобы использовать для этого все 500k, я был бы счастлив использовать подмножество, НО, когда дело доходит до обучения окончательной модели, с «лучшей» комбинацией, я бы хотел использовать полные 500k. В псевдокоде задача выглядит так:

subset the 500k training data to 50k
for each combination of model parameters (3, 6, or 9)
  for each repeat (3)
    for each fold (10)
       fit the model on 50k training data using the 9 folds
       evaluate performance on the remaining fold
establish the best combination of parameters
fit to all 500k using best combination of parameters

Для этого мне нужно сказать карету, что перед оптимизацией он должен подмножество данных, но для окончательной подгонки использовать все данные.

Я могу сделать это: (1) разбивая данные на подмножества; (2) выполнять обычные этапы поезда; (3) остановить окончательную посадку (не требуется); (4) установить «лучшую» комбинацию (это на выходе поезда); (5) запустить поезд на полных 500 км без оптимизации параметров.

Это немного неопрятно, и я не знаю, как остановить обучение курсора курсора окончательной модели, которую я никогда не буду использовать.


person Stephen Clark    schedule 02.02.2018    source источник


Ответы (1)


Это возможно, указав аргументы index, indexOut и indexFinal для trainControl.

Вот пример использования набора данных сонара из библиотеки mlbench:

library(caret)
library(mlbench)
data(Sonar)

Допустим, мы хотим каждый раз рисовать половину набора данных сонара для обучения и повторять это 10 раз:

train_inds <- replicate(10, sample(1:nrow(Sonar), size = nrow(Sonar)/2), simplify = FALSE)

Если вас интересует другой подход к выборке, опубликуйте подробности. Это только для иллюстрации.

Для тестирования мы будем использовать 10 случайных строк не в train_inds:

test_inds <- lapply(train_inds, function(x){
  inds <- setdiff(1:nrow(Sonar), x)
  return(sample(inds, size = 10))
}
)

теперь просто укажите test_inds и train_inds в trainControl:

ctrl <-  trainControl(
    method = "boot",
    number = 10,
    classProbs = T,
    savePredictions = "final",
    index = train_inds,
    indexOut = test_inds,
    indexFinal = 1:nrow(Sonar),
    summaryFunction = twoClassSummary
  )

вы также можете указать indexFinal, если не хотите помещать окончательную модель во все строки.

и подходят:

model <- train(
    Class ~ .,
    data = Sonar,
    method = "rf",
    trControl = ctrl,
    metric = "ROC"
  )
model
#output
Random Forest 

208 samples, 208 used for final model
 60 predictor
  2 classes: 'M', 'R' 

No pre-processing
Resampling: Bootstrapped (10 reps) 
Summary of sample sizes: 104, 104, 104, 104, 104, 104, ... 
Resampling results across tuning parameters:

  mtry  ROC        Sens    Spec     
   2    0.9104167  0.7750  0.8250000
  31    0.9125000  0.7875  0.7916667
  60    0.9083333  0.7875  0.8166667
person missuse    schedule 06.02.2018
comment
Для тестирования мы будем использовать случайные 10 строк не в test_inds. Должно ли это быть Для тестирования мы будем использовать случайные 10 строк не в train_inds? - person Stephen Clark; 07.02.2018
comment
Извините, что возвращаюсь к этому, но почему вы выбрали загрузку в качестве метода? Было бы cv более логичным? Может, в этом контексте разница несущественная? - person Stephen Clark; 08.02.2018
comment
@Stephen Clark в случае, когда указаны index и indexOut, выбор метода не имеет значения. - person missuse; 08.02.2018