LOOCV vs CV K-fold conduit aux mêmes résultats

Aug 18 2020

Je construis un modèle de régression linéaire et l'utilise pour prédire le hors échantillon. Dans ce contexte, j'utilise LOOCV et k-fold CV (5). Cependant, les deux méthodes semblent conduire aux mêmes résultats. La seule différence mineure entre ces deux méthodes réside dans les valeurs légèrement différentes des mesures d'exactitude des estimations dans l'échantillon (voir les résultats ci-dessous).

Qu'est-ce qui se passe ici; est-ce que je rate un point?

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)

Les résultats se présentent comme suit:

Coefficients:

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

Ajustement dans l'échantillon:

mod1$results mod2$results

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

Ajustement hors échantillon:

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

Réponses

1 cbeleitesunhappywithSX Aug 19 2020 at 16:56

Tout d'abord, les modèles finaux ( mod1$finalModelet mod1$finalModel) sont les mêmes, dans votre cas particulier pour deux raisons:

  1. Vous ne réglez pas réellement, vous entraînez un modèle unique qui est le modèle linéaire avec intercept = TRUE).

    La ligne témoin est la sortie de print(mod2):

    Le paramètre de réglage «interception» a été maintenu constant à la valeur TRUE

    Vous pouvez également consulter mod2$results:

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

    Comparez ceci à:

    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. La validation croisée interne pendant le réglage aboutit à un ensemble d'hyperparamètres, mais pas encore dans le modèle final. Le modèle final est obtenu par entraînement avec cet ensemble d'hyperparamètres et toutes les données qui ont été transmises train().

    Quelle que soit la routine de validation croisée / bootstrap que vous avez choisie, tant que l'ensemble d'hyperparamètres réglé est le même, le modèle final sera également le même (au moins pour les routines d'entraînement déterministes telles que lm()).

    Donc, même si vous aviez réglé, le même modèle en résulterait: celui avec intercept = TRUE.