1 votos

LOOCV frente a k-fold CV conduce a los mismos resultados

Construyo un modelo de regresión lineal y lo uso para predecir fuera de la muestra. En este contexto, utilizo LOOCV y k-fold CV (5). Sin embargo, ambos métodos parecen conducir a los mismos resultados. La única diferencia menor entre estos dos métodos son los valores ligeramente diferentes de las medidas de precisión para las estimaciones dentro de la muestra (véanse los resultados más abajo).

¿Qué está pasando aquí? ¿Me estoy perdiendo algo?

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)

Los resultados son los siguientes:

Coeficientes:

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

Ajuste en la muestra:

mod1$results 
mod2$results

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

Ajuste fuera de la muestra:

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

1voto

cbeleites Puntos 12461

En primer lugar, los modelos finales ( mod1$finalModel y mod1$finalModel ) son los mismos, en su caso particular por dos razones:

  1. En realidad no se afina, se entrena un único modelo que es el modelo lineal con intercept = TRUE ).

    La línea reveladora es la salida de print(mod2) :

    El parámetro de sintonía "intercepción" se mantuvo constante en un valor de TRUE

    También puede consultar el mod2$results :

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

    Compara esto con:

    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 validación cruzada interna durante la puesta a punto da como resultado un conjunto de hiperparámetros, pero aún no el modelo final. El modelo final se obtiene entrenando con este conjunto de hiperparámetros y todo datos que se entregaron a train() .

    Independientemente de la rutina de validación cruzada/bootstrap que elija, mientras el conjunto de hiperparámetros ajustados sea el mismo, el modelo final también será el mismo (al menos para las rutinas de entrenamiento deterministas como lm() ).

    Así que, aunque se hubiera afinado, seguiría resultando el mismo modelo: el de intercept = TRUE .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X