Aan de slagGa gratis aan de slag

Inputtransformaties: de "hockeystick" (2)

In de vorige oefening zag je dat een kwadratisch model de houseprice-gegevens beter lijkt te passen dan een lineair model. In deze oefening ga je bevestigen of het kwadratische model beter presteert op out-of-sample gegevens. Omdat deze gegevensset klein is, gebruik je cross-validatie. De kwadratische formule fmla_sqr die je in de vorige oefening hebt gemaakt en het houseprice-dataframe zijn beschikbaar om te gebruiken.

Ter vergelijking zal de voorbeeldcode cross-validatievoorspellingen berekenen van een lineair model price ~ size.

Deze oefening maakt deel uit van de cursus

Supervised Learning in R: Regressie

Cursus bekijken

Oefeninstructies

  • Gebruik kWayCrossValidation() om een splitsingsplan te maken voor een 3-fold cross-validatie.
    • Je kunt het 3e en 4e argument van de functie op NULL zetten.
  • Bekijk en voer de voorbeeldcode uit om de 3-fold cross-validatievoorspellingen van het model price ~ size te krijgen en voeg ze toe aan de kolom pred_lin.
  • Haal de cross-validatievoorspellingen op voor price als functie van squared size. Ken ze toe aan de kolom pred_sqr.
    • De voorbeeldcode geeft je de procedure.
    • Je kunt het splitsingsplan gebruiken dat je al hebt gemaakt.
  • Vul de lege plekken in om de voorspellingen te pivotten en de residuen te berekenen.
  • Vul de lege plekken in om de RMSE voor de twee modellen te vergelijken. Welke past beter?

Praktische interactieve oefening

Probeer deze oefening eens door deze voorbeeldcode in te vullen.

# 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 = ___)
Code bewerken en uitvoeren