diamonds-tidymodels01

ds1
tidymodels
statlearning
string
Published

May 17, 2023

Aufgabe

Finden Sie ein möglichst “gutes” prädiktives Modell zur Vorhersage des Diamantenpreises im Datensatz diamonds!

Gegenstand dieser Aufgabe ist die Modellierung; Datenvorverarbeitug (wie explorative Datenanalyse) steht nicht im Fokus.

Hinweise:

  • Verwenden Sie die Methoden aus tidymodels.
  • Hohe Modellgüte (“gutes Modell”) sei definiert über \(R^2\), RMSE und MAE
  • Verwenden Sie verschiedene Algorithmen (lineare Modell, kNN, …) und verschiedene Rezepte.
  • Resampling und Tuning ist hier noch nicht nötig.s

Der Datensatz ist hier zu beziehen. Außerdem ist er Teil von ggplot2 bzw. des Tidyverse und daher mit data() zu laden, wenn das entsprechende Paket vorhanden ist.











Lösung

Setup

library(tidyverse)
library(tidymodels)

Daten laden:

data(diamonds, package = "ggplot2")

Oder so:

diamonds <- read_csv("https://vincentarelbundock.github.io/Rdatasets/csv/ggplot2/diamonds.csv")

Train- vs. Testdaten:

d_split <- initial_split(diamonds, strata = price)

d_train <- training(d_split)
d_test <- testing(d_split)

Modelle:

lin_mod <-
  linear_reg()
knn_mod <-
  nearest_neighbor(mode = "regression")

Hilfe zu kNN findet sich z.B. hier.

Rezepte:

rec1 <-
  recipe(price ~ ., data = d_train) %>% 
  update_role(1, new_role = "id") %>% 
  step_naomit() %>% 
  step_log(all_outcomes())

Rezept prüfen (preppen und backen)

rec1_prepped <-
  rec1 %>% 
  prep()

rec1_prepped
d_train_baked <-
  bake(rec1_prepped, new_data = d_train)

Einen Überblick zu steps findet sich z.B. hier.

Rollen-Definitionen in Tidymodels-Rezepten kann man hier nachlesen.

rec2 <-
  recipe(price ~ ., data = d_train) %>% 
  update_role(1, new_role = "id") %>% 
  step_impute_knn() %>% 
  step_log(all_outcomes())

Workflows:

wf1 <-
  workflow() %>% 
  add_recipe(rec1) %>% 
  add_model(lin_mod)
wf2 <-
  wf1 %>% 
  update_model(knn_mod)

Fitting

fit1 <-
  wf1 %>% 
  fit(d_train)
fit1

Fitten des Test-Samples

fit1_test <-
  wf1 %>% 
  last_fit(d_split)
fit1_test

Modellgüte

collect_metrics(fit1_test)

De-logarithmieren, wenn man Vorhersagen in den Rohwerten haben möchte:

collect_predictions(fit1_test) %>% 
  head()
d_test_w_preds <- 
collect_predictions(fit1_test) %>% 
  mutate(pred_raw = exp(.pred)) 

head(d_test_w_preds)

Categories:

  • ds1
  • tidymodels
  • statlearning
  • string