LOOCV vs CV K-fold conduit aux mêmes résultats
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
Tout d'abord, les modèles finaux ( mod1$finalModel
et mod1$finalModel
) sont les mêmes, dans votre cas particulier pour deux raisons:
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
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
.