
の続きです。前回データフレームを作り直して、個々の選手の成績をチームごとに平均値にして、このデータフレームからチームの順位を予測するモデルを作成しました。
一つは全ての説明変数を使用したモデル、もう一つは有意な説明変数だけに絞り込んだモデルです。
今回は、将来、順位を予測するときにどちらのモデルを使うのが適切かを調べます。
Copilotをはじめ、ChatGpt, Gemini, Grok, Claudに、
「あなたは、スポーツ統計解析の専門家です。
観測数が12の、特徴量が7個のデータフレームを与えられて、チームの順位を予測する線形モデルを作りました。
一つ目は、7個の特徴量をすべて使うモデル、
二つ目は、7個の中から5%水準で有意な特徴、2個だけを使うモデル、
今度の新しいシーズンで順位を予測するとき、どちらのモデルを使うほうが良いかを調べたいと思います。
どのような手法で、2つのモデルの優劣を調べるのがいいですか?」
と聞いてみました。全ての生成AIがLOOCVを提案しました。
例えば、Copilotだとこんな感じでした。

ということで、今回はLOOCV(Leave-One-Out Cross-Validation)をやってみます。1つだけデータフレームから除外して、残りのデータでモデルの係数を推測し、そのモデルの予測値と除外した実際の値を比較する、という方法です。
まず、RMSEを格納する箱を作ります。

そうしたら、for loopで12回、学習 > 予測 > 誤差を確認 を実行します。

警告メッセージがでましたが、Copilotに聞くと致命的な問題ではないようです。

なので、このまま進めます。
結果は単純に絶対値の平均値を比較すればOKです。

となりました。rmse_simple のほうが値が小さいですので、goal と n の数だけのモデルのほうが、未知のデータを使った場合の予測性能は良さそうです。
今回は以上です。
はじめから読むには、
です。
今回のコードは以下になります。
#
# LOOCVをするfor loop
#
# RMSEを入れる箱を作る
rmse_full <- numeric(12)
rmse_simple <- numeric(12)
#
for (i in 1:12) {
# トレーニング用データ
df_train <- df2[-i, ]
# テスト用データ
df_test <- df2[i, ]
# モデルをフィット
model_full <- lm(target ~ ., data = df_train)
model_simple <- lm(target ~ goal + n, data = df_train)
# 予測
predict_full <- predict(model_full, newdata = df_test)
predict_simple <- predict(model_simple, newdata = df_test)
# RMSE
rmse_full[i] <- predict_full - df2$target[i]
rmse_simple[i] <- predict_simple - df2$target[i]
}
#
# rmseの平均値
mean(abs(rmse_full))
mean(abs(rmse_simple))
#
(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは Natural Landscape Photograph, Long Wide View, Full of Flowers on the Ground, Close-up of one red Dalya Flower です。)




























