入力の変換: "ホッケースティック"(2)
前の演習では、二次モデルのほうが線形モデルよりも houseprice データによく当てはまりそうだと分かりました。
この演習では、その二次モデルがアウトオブサンプルデータでもより良く機能するかを確認します。
このデータセットは小さいため、クロスバリデーションを用います。前の演習で作成した二次の式 fmla_sqr と、データフレーム houseprice は利用可能です。
比較のために、サンプルコードでは線形モデル price ~ size からクロスバリデーション予測を計算します。
この演習はコースの一部です
R による Supervised Learning:回帰
演習の手順
kWayCrossValidation()を使って、3-fold クロスバリデーションの分割計画を作成します。- この関数の第3・第4引数は
NULLに設定できます。
- この関数の第3・第4引数は
- サンプルコードを確認して実行し、モデル
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 = ___)