library(tidymodels)
library(tidyverse)
library(tictoc) # Rechenzeit messen, optional
# data(penguins, package = "palmerpenguins")
<- "https://vincentarelbundock.github.io/Rdatasets/csv/modeldata/penguins.csv"
d_path <- read_csv(d_path) d
tidymodels-penguins06
tidymodels
statlearning
schoice
Aufgabe
Berechnen Sie ein kNN-Modell mit tidymodels und zwar anhand des penguins Datensatzes.
Modellgleichung: body_mass_g ~ bill_length_mm
.
Vergleichen Sie die Testfehlerhöhe im Test-Sample in folgenden zwei Szenarien:
- Train-Test-Aufspaltung, 10 Mal wiederholt
- 10-fache Kreuzvalidierung (im Train-Sample) (\(v=10, r= 1\))
Hinweise:
- Tuning Sie - nur im 2. Szenario - \(k\) mit den Werten 5, 10, 15.
- Löschen Sie alle Zeilen mit fehlenden Werten in den Prädiktoren.
- Beachten Sie die üblichen Hinweise.
- Natürlich gilt: Ceteris paribus. Halten Sie also die Modelle im Übrigen vergleichbar bzw. identisch.
Answerlist
- Szenario 1 hat den geringeren Vorhersagefehler.
- Szenario 2 hat den geringeren Vorhersagefehler.
- Der Vorhersagefehler ist in beiden Szenarien gleich.
- Keine Antwort möglich.
Lösung
Setup
Wir dürfen keine fehlenden Werte in der Y-Variable haben (im Train-Set), sonst meckert Tidymodels:
<-
d2 %>%
d drop_na(body_mass_g)
CV
Daten aufteilen:
set.seed(42)
<- initial_split(d2)
d_split <- training(d_split)
d_train <- testing(d_split) d_test
CV
set.seed(42)
<- vfold_cv(d_train, v = 10, repeats = 1) folds
Workflow
<-
rec1 recipe(body_mass_g ~ bill_length_mm, data = d_train) %>%
step_naomit(all_numeric_predictors())
<-
knn_model nearest_neighbor(
mode = "regression",
neighbors = tune()
)
<-
wflow workflow() %>%
add_recipe(rec1) %>%
add_model(knn_model)
Fitten
<-
d_resamples tune_grid(
wflow,resamples = folds,
control = control_grid(save_workflow = TRUE),
grid = data.frame(neighbors = c(5, 10, 15)),
metrics = metric_set(rmse)
)
Modellgüte
<- fit_best(x = d_resamples)
bestfit1 <- last_fit(bestfit1, d_split)
lastfit1 collect_metrics(lastfit1)
# A tibble: 2 × 4
.metric .estimator .estimate .config
<chr> <chr> <dbl> <chr>
1 rmse standard 586. Preprocessor1_Model1
2 rsq standard 0.410 Preprocessor1_Model1
Train-Test-Aufteilung wiederholt
CV
Wir resamplen nicht über das Train-Sample, sondern über die ganze Stichprobe:
set.seed(42)
<- vfold_cv(d2, v = 2, repeats = 10) folds2
Fitten
<-
d_resamples2 tune_grid(
wflow,resamples = folds2,
control = control_grid(save_workflow = TRUE),
grid = data.frame(neighbors = c(5, 10, 15)),
metrics = metric_set(rmse)
)
Modellgüte
<- fit_best(x = d_resamples2)
bestfit2 <- last_fit(bestfit2, d_split)
lastfit2 collect_metrics(lastfit2)
# A tibble: 2 × 4
.metric .estimator .estimate .config
<chr> <chr> <dbl> <chr>
1 rmse standard 586. Preprocessor1_Model1
2 rsq standard 0.410 Preprocessor1_Model1
Categories:
- tidymodels
- statlearning
- schoice