LOOCV vs. 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$finalModelmod1$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.