始める無料で始める

相互作用を用いたモデリング (2)

この演習では、前の演習で当てはめた相互作用ありのモデルと、主効果のみのモデルの性能を比較します。このデータセットは小さいため、クロスバリデーションで外部データへの予測を模擬します。

計算には dplyr パッケージを使い始めます。

  • mutate()ドキュメント)は、tbl(データフレームの一種)に新しい列を追加します。
  • group_by()ドキュメント)は、tbl 内で行のグループ化方法を指定します。
  • summarize()ドキュメント)は、列の要約統計量を計算します。

また、tidyrpivot_longer()ドキュメント)も使います。これは複数の列をキーと値のペアに折りたたみます。alcohol データフレームと、数式 fmla_add および fmla_interaction はあらかじめ読み込まれています。

この演習はコースの一部です

R による Supervised Learning:回帰

コースを見る

演習の手順

  • kWayCrossValidation()ドキュメント)を使って、3分割のクロスバリデーション用の分割計画を作成します。
    • 第1引数は分割する行数です。
    • 第2引数はクロスバリデーションの分割数です。
    • 第3引数と第4引数は NULL に設定できます。
  • サンプルコードを確認して実行し、相互作用なしのモデルの3分割クロスバリデーション予測を取得して、列 pred_add に代入します。
  • 相互作用ありのモデルの3分割クロスバリデーション予測を取得します。予測は列 pred_interaction に代入します。
    • 手順はサンプルコードで示しています。
    • すでに作成した同じ splitPlan を使ってください。
  • 空欄を埋めて、次を行ってください。
    • 予測を1つの列 predpivot_longer でまとめます。
    • 残差(実測値 − 予測値)の列を追加します。
    • 各モデルタイプのクロスバリデーション予測のRMSEを求めます。
  • RMSEを比較しましょう。これらの結果に基づくと、どちらのモデルを使うべきでしょうか?

実践的なインタラクティブ演習

このサンプルコードを完成させて、この演習に挑戦してみましょう。

# alcohol is available
summary(alcohol)

# Both the formulae are available
fmla_add
fmla_interaction

# Create the splitting plan for 3-fold cross validation
set.seed(34245)  # set the seed for reproducibility
splitPlan <- ___(___(___), ___, ___, ___)

# Sample code: Get cross-val predictions for main-effects only model
alcohol$pred_add <- 0  # initialize the prediction vector
for(i in 1:3) {
  split <- splitPlan[[i]]
  model_add <- lm(fmla_add, data = alcohol[split$train, ])
  alcohol$pred_add[split$app] <- predict(model_add, newdata = alcohol[split$app, ])
}

# Get the cross-val predictions for the model with interactions
alcohol$pred_interaction <- 0 # initialize the prediction vector
for(i ___ ___) {
  split <- ___
  model_interaction <- lm(___, data = alcohol[split$train, ])
  alcohol$___[split$app] <- predict(___, newdata = alcohol[split$app, ])
}

# Get RMSE
alcohol %>% 
  pivot_longer(cols=c('pred_add', 'pred_interaction'), names_to='modeltype', values_to='pred') %>%
  mutate(residuals = ____) %>%      
  group_by(modeltype) %>%
  summarize(rmse = ___(___(___)))
コードを編集して実行