LOOCV против k-кратного CV приводит к тем же результатам

Aug 18 2020

Я строю модель линейной регрессии и использую ее для прогнозирования вне выборки. В этом контексте я использую LOOCV и k-кратное CV (5). Однако оба метода, похоже, приводят к одним и тем же результатам. Единственное незначительное различие между этими двумя методами - это несколько разные значения мер точности для оценок внутри выборки (см. Результаты ниже).

Что здесь происходит; я упустил момент?

library(mlbench)
library(caret)
data(BostonHousing)
df <- BostonHousing

######
set.seed(12345)
train.index <- createDataPartition(df$medv, p = 0.75, list = FALSE)
train <- df[train.index, ]
test <- df[-train.index, ]

#####
fitControl <- trainControl(method = "LOOCV")

mod1 <- train(medv ~ crim + zn + rm,
              data = train,
              method = "lm",
              trControl = fitControl)

preds1 <- predict(mod1, newdata = test)

#####
fitControl2 <- trainControl(method = "repeatedcv", number = 5, repeats = 10)

mod2 <- train(medv ~ crim + zn + rm,
              data = train,
              method = "lm",
              trControl = fitControl2)

preds2 <- predict(mod2, newdata = test)

Результаты выглядят следующим образом:

Коэффициенты:

coef(summary(mod1)) 
coef(summary(mod2))

             LOOCV         k-fold
(Intercept) -28.74077696  -28.74077696
crim         -0.23736504   -0.23736504
zn            0.04259996    0.04259996
rm            8.21720224    8.21720224

Подгонка по образцу:

mod1$results mod2$results

              LOOCV         k-fold
RMSE          6.16378       6.083234
Rsquared      0.5437839     0.5727744
MAE           4.176978      4.174368

Подгонка вне выборки:

postResample(preds1, obs = test$medv) postResample(preds2, obs = test$medv)

              LOOCV         k-fold
RMSE          4.1298679     4.1298679
Rsquared      0.5489697     0.5489697
MAE           4.1298679     4.1298679

Ответы

1 cbeleitesunhappywithSX Aug 19 2020 at 16:56

Прежде всего, окончательные модели ( mod1$finalModelи mod1$finalModel) одинаковы в вашем конкретном случае по двум причинам:

  1. На самом деле вы не настраиваетесь, вы тренируете одну модель, которая является линейной моделью intercept = TRUE).

    Контрольная строка - это результат print(mod2):

    Параметр настройки «перехват» оставался постоянным на значении ИСТИНА.

    Вы также можете посмотреть mod2$results:

      intercept     RMSE  Rsquared      MAE    RMSESD RsquaredSD     MAESD  
    1      TRUE 6.121066 0.5568386 4.187102 0.9087823  0.1089092 0.4691107
    

    Сравните это с:

    mod3 <- train(medv ~ crim + zn + rm,
               data = train,
               method = "lm",
               tuneGrid = data.frame (intercept = c(FALSE, TRUE)),
               trControl = fitControl)
    mod3
    # [...snip...]
    # Resampling results across tuning parameters:
    # 
    #   intercept  RMSE      Rsquared   MAE     
    #   FALSE      6.818821  0.4592127  4.844369
    #    TRUE      6.163780  0.5437839  4.176978
    # 
    # RMSE was used to select the optimal model using the smallest value.
    # The final value used for the model was intercept = TRUE.
    
    mod3$results
    #   intercept     RMSE  Rsquared      MAE
    # 1     FALSE 6.818821 0.4592127 4.844369
    # 2      TRUE 6.163780 0.5437839 4.176978
    
  2. Внутренняя перекрестная проверка во время настройки приводит к набору гиперпараметров, но еще не в окончательной модели. Окончательная модель получается путем обучения с использованием этого набора гиперпараметров и всех данных, которые были переданы train().

    Независимо от выбранной вами процедуры перекрестной проверки / начальной загрузки, до тех пор, пока настроенный набор гиперпараметров остается одинаковым, окончательная модель также будет такой же (по крайней мере, для детерминированных программ обучения, таких как lm()).

    Итак, даже если бы вы настроились, все равно получилась бы та же модель: с intercept = TRUE.