LOOCV เทียบกับ k-fold CV นำไปสู่ผลลัพธ์เดียวกัน

Aug 18 2020

ฉันสร้างแบบจำลองการถดถอยเชิงเส้นและใช้เพื่อทำนายการไม่อยู่ในตัวอย่าง ในบริบทนี้ฉันใช้ LOOCV และ k-fold 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. การตรวจสอบความถูกต้องไขว้ภายในระหว่างการปรับแต่งส่งผลให้ชุดไฮเปอร์พารามิเตอร์ แต่ยังไม่อยู่ในรูปแบบสุดท้าย รุ่นสุดท้ายจะได้รับโดยการฝึกอบรมกับชุด hyperparameter นี้และทุกtrain()ข้อมูลที่ถูกส่งไปยัง

    ไม่ว่าคุณจะเลือกรูทีนการตรวจสอบความถูกต้องข้าม / บูตสแตรปแบบใดตราบเท่าที่ชุดไฮเปอร์พารามิเตอร์ที่ปรับแล้วเหมือนกันโมเดลขั้นสุดท้ายก็จะเหมือนกันเช่นกัน (อย่างน้อยก็สำหรับกิจวัตรการฝึกที่กำหนดเช่นlm())

    ดังนั้นแม้ว่าคุณจะปรับจูนแล้วก็ยังคงเป็นรุ่นเดียวกัน: รุ่นที่มีintercept = TRUE.