Каретка и пользовательская проверка, установленная с помощью indexOut, дают странный результат

Caret позволяет вам установить собственный набор для обучения и проверки в поезде с параметрами index и indexOut , но когда полученная модель применяется к набору проверки и измеряется ее производительность, это сильно отличается от того, что предоставляется самой моделью:

library(caret)
library(Metrics)

set.seed(123)
index_on <- 1:16
index_out <- 17:32
fit <- train(mpg~wt+qsec,
             mtcars,
             method = "glm", 
             metric = "RMSE",
             trControl = trainControl(method="cv", 
                                      index = list(index_on), 
                                      indexOut = list(index_out))
             ) 
fit$results$RMSE
rmse(mtcars[index_out, "mpg"], predict(fit, mtcars[index_out,])) 

Как вы можете видеть, это дает разные значения производительности, когда она получена из объекта поезда или вычислена напрямую с помощью прогноза:

[1] 3.612743

[1] 3.079445

Это ошибка? я что-то пропустил здесь?


person lbcommer    schedule 04.04.2017    source источник


Ответы (1)


Я исследовал, и похоже, что внутренний поезд вычисляет правильную ожидаемую модель и вычисляет производительность с этой моделью, но вместо этого возвращает другую модель. Он возвращает тот, который является полученным обучением ВСЕХ данных (не только «индексных» данных).

Вы можете увидеть это с помощью этого кода:

set.seed(123)
fit_3 <- train(mpg~wt+qsec,
             data=mtcars,
             method = "glm", 
             metric = "RMSE",
             trControl = trainControl(method="none")
) 

rmse(mtcars[index_out, "mpg"], predict(fit_3, mtcars[index_out,]))

который производит:

[1] 3.079445

Я использую последнюю текущую версию каретки (на данный момент Caret_6.0-75). Было совершенно ясно, что это но, и я собирался сообщить об этом, когда обнаружил, что это уже открытая ошибка:

https://github.com/topepo/caret/issues/348

person lbcommer    schedule 05.04.2017