R Caret: перегруппировать несколько объектов поезда - PullRequest
0 голосов
/ 26 апреля 2018

Предположим, я выполняю несколько прогонов одной и той же модели, но только с разными параметрами сложности, на одной и той же (с фиксированным начальным значением) перекрестной проверке с пакетом каретки, например:

library(caret)
data(iris)

# controls are the same for every models
c = trainControl(method = "cv",number=10,verboseIter = TRUE) 
d = iris # data is also the same 
f = Species ~ . # formula is also the same 
m = "rpart" # method is also the same 


set.seed(1234)
model1 <- train(form = f, data = d, trControl = c, method = m,
                tuneGrid = expand.grid(cp = c(0,0.5)))
set.seed(1234)
model2 <- train(form = f, data = d, trControl = c, method = m,
                tuneGrid = expand.grid(cp = c(0.1,0.2)))

set.seed(1234)
model3 <- train(form = f, data = d, trControl = c, method = m,
                tuneGrid = expand.grid(cp = c(0,0.5,0.1,0.2)))

Есть ли способ, которым я мог бы "построить" объект поезда model3 только из model1 и model2? Расчеты длинные, и я не запустил все свои разные настройки в одном вызове. Но сравнивать их с каждым прогоном в одном и том же объекте поезда (через функцию plot, функцию обновления, функцию повторной выборки и т. Д.)

Я особенно ищу способ сделать то же самое, что и plot.train, но для всех вместе взятых.

1 Ответ

0 голосов
/ 04 мая 2018

Я прекрасно понимаю вашу озабоченность, потому что мои вычислительные источники также очень ограничены. Однако я бы подошел к этому следующим образом, вместо того, чтобы «строить» объект model3.

Предположим, что вы хотите достичь высочайшей точности. Тогда вам просто нужно оценить следующее: какие из model1 и model2 мы видим наивысшую точность? Тогда нас интересует только выбор параметра настройки с наилучшим результатом. Например, мы видим следующее:

> model1$bestTune$cp
[1] 0
> model2$bestTune$cp
[1] 0.2
> model1$results$Accuracy ## Respectively for cp = 0.0 and cp = 0.5
[1] 0.9333 0.3333
> model2$results$Accuracy ## Respectively for cp = 0.1 and cp = 0.2
[1] 0.9267 0.9267    

Мы бы выбрали cp = 0.

Предположим, вы разбили вещи на model1, model2, model3, ... и хотите изучить все значения параметров, вводимые вручную, используя их.

k = 2 ## Here we only have model1 and model2 to compare
evaluate <- list()
for (i in 1:k) {
  model = eval(parse(text = paste0("model", i)))
  evaluate[["cp"]][[paste0("model", i)]] <- 
    model$finalModel$tuneValue$cp
  evaluate[["accuracy"]][[paste0("model", i)]] <- 
    model$results$Accuracy[[which(model$results$cp == model$bestTune$cp)]]
}    

Тогда в нашем списке evaluate есть следующее:

> evaluate
$cp
model1 model2 
   0.0    0.2 
$accuracy
model1 model2 
0.9333 0.9267 

После этого мы можем сделать

> which(evaluate$accuracy == max(evaluate$accuracy))
model1 
     1 
> evaluate$cp[[which(evaluate$accuracy == max(evaluate$accuracy))]]
[1] 0

Теперь мы можем счастливо выбрать cp = 0, и мы также знаем, что результат из оптимального cp хранится в model1.

Если вы хотите «построить» model3, вы можете просто заменить некоторые компоненты (например, results, в которых будут сохранены AccuracySD, KappaSD и такие метрики) после выбора того, что мы оценили как лучшая модель --- model1 в этом случае.

...