LOOCV vs. CV k-fold mengarah ke hasil yang sama

Aug 18 2020

Saya membuat model regresi linier dan menggunakannya untuk memprediksi out-of-sample. Dalam konteks ini, saya menggunakan LOOCV dan k-fold CV (5). Namun, kedua metode tersebut tampaknya membuahkan hasil yang sama. Satu-satunya perbedaan kecil antara kedua metode ini adalah nilai yang sedikit berbeda untuk ukuran akurasi estimasi dalam sampel (lihat hasil di bawah).

Apa yang terjadi disini; apakah saya kehilangan satu poin?

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)

Hasilnya terlihat sebagai berikut:

Koefisien:

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

Sesuai Sampel:

mod1$results mod2$results

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

Kecocokan Out-of-Sample:

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

Jawaban

1 cbeleitesunhappywithSX Aug 19 2020 at 16:56

Pertama-tama, model akhir ( mod1$finalModeldan mod1$finalModel) sama, dalam kasus khusus Anda karena dua alasan:

  1. Anda sebenarnya tidak menyetel, Anda melatih model tunggal yang merupakan model linier dengan intercept = TRUE).

    Garis tanda adalah keluaran dari print(mod2):

    Parameter penyetelan 'intersep' dipertahankan konstan pada nilai TRUE

    Anda juga dapat melihat mod2$results:

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

    Bandingkan ini dengan:

    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. Validasi silang dalam selama penyetelan menghasilkan himpunan hyperparameter, tetapi belum di model akhir. Model akhir diperoleh melalui pelatihan dengan himpunan hyperparameter ini dan semua data yang diserahkan ke train().

    Terlepas dari rutinitas validasi silang / bootstrap yang Anda pilih, selama set hyperparameter yang disetel sama, model akhirnya juga akan sama (setidaknya untuk rutinitas pelatihan deterministik seperti lm()).

    Jadi, meskipun Anda telah menyetelnya, model yang sama tetap akan dihasilkan: model dengan intercept = TRUE.