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