LOOCV vs. CV k-fold mengarah ke hasil yang sama
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
Pertama-tama, model akhir ( mod1$finalModel
dan mod1$finalModel
) sama, dalam kasus khusus Anda karena dua alasan:
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
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
.