LOOCV против k-кратного CV приводит к тем же результатам
Я строю модель линейной регрессии и использую ее для прогнозирования вне выборки. В этом контексте я использую 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
Ответы
Прежде всего, окончательные модели ( mod1$finalModel
и mod1$finalModel
) одинаковы в вашем конкретном случае по двум причинам:
На самом деле вы не настраиваетесь, вы тренируете одну модель, которая является линейной моделью
intercept = TRUE
).Контрольная строка - это результат
print(mod2)
:Параметр настройки «перехват» оставался постоянным на значении ИСТИНА.
Вы также можете посмотреть
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
Внутренняя перекрестная проверка во время настройки приводит к набору гиперпараметров, но еще не в окончательной модели. Окончательная модель получается путем обучения с использованием этого набора гиперпараметров и всех данных, которые были переданы
train()
.Независимо от выбранной вами процедуры перекрестной проверки / начальной загрузки, до тех пор, пока настроенный набор гиперпараметров остается одинаковым, окончательная модель также будет такой же (по крайней мере, для детерминированных программ обучения, таких как
lm()
).Итак, даже если бы вы настроились, все равно получилась бы та же модель: с
intercept = TRUE
.