LOOCV ile k-kat CV aynı sonuçlara yol açar

Aug 18 2020

Doğrusal bir regresyon modeli oluşturuyorum ve bunu örneklem dışı tahmin etmek için kullanıyorum. Bu bağlamda, LOOCV ve k-kat CV (5) kullanıyorum. Ancak, her iki yöntem de aynı sonuçlara yol açıyor gibi görünüyor. Bu iki yöntem arasındaki tek küçük fark, örnek içi tahminler için doğruluk ölçümleri için biraz farklı değerlerdir (aşağıdaki sonuçlara bakın).

Burada neler oluyor; bir noktayı mı kaçırıyorum?

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)

Sonuçlar aşağıdaki gibidir:

Katsayılar:

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

Örneklem içi uyum:

mod1$results mod2$results

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

Örneklem dışı uyum:

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

Yanıtlar

1 cbeleitesunhappywithSX Aug 19 2020 at 16:56

Her şeyden önce, son modeller ( mod1$finalModelve mod1$finalModel) sizin özel durumunuzda iki nedenden dolayı aynıdır:

  1. Aslında ayarlama yapmazsınız, lineer model olan tek bir model eğitirsiniz intercept = TRUE).

    Telltale line şunların çıktısıdır print(mod2):

    Ayarlama parametresi 'kesişme' DOĞRU değerinde sabit tutuldu

    Ayrıca şunlara da bakabilirsiniz mod2$results:

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

    Bunu şununla karşılaştırın:

    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. Ayarlama sırasında iç çapraz doğrulama bir hiperparametre setiyle sonuçlanır, ancak henüz nihai modelde değildir. Nihai model, bu hiperparametre seti ve teslim edilen tüm verilerle eğitilerek elde edilir train().

    Seçtiğiniz çapraz doğrulama / önyükleme rutini ne olursa olsun, ayarlanmış hiperparametre seti aynı olduğu sürece, nihai model de aynı olacaktır (en azından gibi deterministik eğitim rutinleri için lm()).

    Yani, ayarlamış olsanız bile, yine aynı model ortaya çıkacaktır: olanı intercept = TRUE.