tidymodels-penguins06

tidymodels
statlearning
schoice
Published

May 17, 2023

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:

  1. Train-Test-Aufspaltung, 10 Mal wiederholt
  2. 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

library(tidymodels)
library(tidyverse)
library(tictoc)  # Rechenzeit messen, optional
# data(penguins, package = "palmerpenguins")
d_path <- "https://vincentarelbundock.github.io/Rdatasets/csv/modeldata/penguins.csv"
d <- read_csv(d_path)

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)
d_split <- initial_split(d2)
d_train <- training(d_split)
d_test <- testing(d_split)

CV

set.seed(42)
folds <- vfold_cv(d_train, v = 10, repeats = 1)

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

bestfit1 <- fit_best(x = d_resamples)
lastfit1 <- last_fit(bestfit1, d_split)
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)
folds2 <- vfold_cv(d2, v = 2, repeats = 10)

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

bestfit2 <- fit_best(x = d_resamples2)
lastfit2 <- last_fit(bestfit2, d_split)
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