LOOCVとk倍CVは同じ結果になります
線形回帰モデルを作成し、それを使用してサンプル外を予測します。このコンテキストでは、LOOCVとk-fold CVを使用します(5)。ただし、どちらの方法でも同じ結果が得られるようです。これら2つの方法のわずかな違いは、サンプル内推定の精度測定値がわずかに異なることだけです(以下の結果を参照)。
ここで何が起こっているのか。私はポイントを逃していますか?
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
)は同じですが、特定のケースでは2つの理由があります。
実際に調整するのではなく、線形モデルである単一のモデルをトレーニングします
intercept = TRUE
)。わかりやすい行は、次の出力です
print(mod2)
。チューニングパラメータ「intercept」は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
チューニング中の内部交差検証により、ハイパーパラメータセットが生成されますが、最終モデルにはまだ含まれていません。最終的なモデルは、このハイパーパラメータセットとに渡されたすべてのデータを使用してトレーニングすることで取得され
train()
ます。選択した相互検証/ブートストラップルーチンに関係なく、調整されたハイパーパラメータセットが同じである限り、最終モデルも同じになります(少なくともなどの決定論的トレーニングルーチンの場合
lm()
)。したがって、調整したとしても、同じモデルが生成され
intercept = TRUE
ます。