LOOCV बनाम k- गुना CV एक ही परिणाम की ओर जाता है

Aug 18 2020

मैं एक रैखिक प्रतिगमन मॉडल का निर्माण करता हूं और इसका उपयोग आउट-ऑफ-सैंपल की भविष्यवाणी करने के लिए करता हूं। इस संदर्भ में, मैं LOOCV और k- गुना CV (5) का उपयोग करता हूं। हालाँकि, दोनों विधियाँ समान परिणाम की ओर ले जाती हैं। इन दो तरीकों के बीच एकमात्र मामूली अंतर इन-सैंपल अनुमानों के लिए सटीकता उपायों के लिए थोड़ा भिन्न मूल्य है (नीचे परिणाम देखें)।

यहाँ क्या हो रहा है; क्या मुझे एक बिंदु याद आ रहा है?

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)

परिणाम निम्नानुसार हैं:

गुणांक:

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

इन-सैंपल फिट:

mod1$results mod2$results

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

आउट-ऑफ-सैंपल फिट:

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

जवाब

1 cbeleitesunhappywithSX Aug 19 2020 at 16:56

सबसे पहले, दो कारणों से आपके विशेष मामले में अंतिम मॉडल ( mod1$finalModelऔर mod1$finalModel) समान हैं:

  1. आप वास्तव में धुन नहीं करते हैं, आप एक एकल मॉडल को प्रशिक्षित करते हैं जो रैखिक मॉडल है intercept = TRUE)।

    टेल्टेल लाइन का आउटपुट है print(mod2):

    ट्यूनिंग पैरामीटर 'इंटरसेप्ट' को TRUE के मान पर स्थिर रखा गया था

    आप इसे भी देख सकते हैं mod2$results:

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

    इसकी तुलना करें:

    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. ट्यूनिंग परिणाम के दौरान इनर क्रॉस सत्यापन हाइपरपरमीटर सेट में होता है, लेकिन अभी तक अंतिम मॉडल में नहीं है। अंतिम मॉडल इस हाइपरपरमीटर सेट और सभी डेटा के साथ प्रशिक्षण द्वारा प्राप्त किया जाता है जिसे सौंप दिया गया था train()

    चाहे आपके द्वारा चुने गए क्रॉस सत्यापन / बूटस्ट्रैप रूटीन के बावजूद, जब तक ट्यून किए गए हाइपरपरमेट सेट समान होते हैं, अंतिम मॉडल भी समान होगा (कम से कम नियतात्मक प्रशिक्षण दिनचर्या जैसे lm())।

    तो, अगर आपने ट्यून किया था, तब भी एक ही मॉडल का परिणाम होगा: एक के साथ intercept = TRUE