始める無料で始める

入力の変換: "ホッケースティック"(2)

前の演習では、二次モデルのほうが線形モデルよりも houseprice データによく当てはまりそうだと分かりました。 この演習では、その二次モデルがアウトオブサンプルデータでもより良く機能するかを確認します。 このデータセットは小さいため、クロスバリデーションを用います。前の演習で作成した二次の式 fmla_sqr と、データフレーム houseprice は利用可能です。

比較のために、サンプルコードでは線形モデル price ~ size からクロスバリデーション予測を計算します。

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

R による Supervised Learning:回帰

コースを見る

演習の手順

  • kWayCrossValidation() を使って、3-fold クロスバリデーションの分割計画を作成します。
    • この関数の第3・第4引数は NULL に設定できます。
  • サンプルコードを確認して実行し、モデル price ~ size の 3-fold クロスバリデーション予測を取得し、列 pred_lin に追加します。
  • 面積の二乗を説明変数とする価格のクロスバリデーション予測を取得し、列 pred_sqr に代入します。
    • 手順はサンプルコードに示されています。
    • すでに作成した分割計画を使えます。
  • 予測を縦持ちに変換して残差を計算する空欄を埋めてください。
  • 2つのモデルの RMSE を比較するための空欄を埋めてください。どちらがより適合していますか?

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

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

# houseprice is available
summary(houseprice)

# fmla_sqr is available
fmla_sqr

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

# Sample code: get cross-val predictions for price ~ size
houseprice$pred_lin <- 0  # initialize the prediction vector
for(i in 1:3) {
  split <- splitPlan[[i]]
  model_lin <- lm(price ~ size, data = houseprice[split$train,])
  houseprice$pred_lin[split$app] <- predict(model_lin, newdata = houseprice[split$app,])
}

# Get cross-val predictions for price as a function of size^2 (use fmla_sqr)
houseprice$pred_sqr <- 0 # initialize the prediction vector
for(i in 1:3) {
  split <- ___
  model_sqr <- lm(___, data = houseprice[split$train, ])
  houseprice$___[split$app] <- predict(___, newdata = houseprice[split$app, ])
}

# Pivot the predictions and calculate the residuals
houseprice_long <- houseprice %>%
  pivot_longer(cols = c('pred_lin', 'pred_sqr'), names_to = 'modeltype', values_to = 'pred') %>%
  mutate(residuals = ___)

# Compare the cross-validated RMSE for the two models
houseprice_long %>% 
  group_by(modeltype) %>% # group by modeltype
  summarize(rmse = ___)
コードを編集して実行