tidymodels-tree4

statlearning
trees
tidymodels
speed
string
Published

November 8, 2023

Aufgabe

Berechnen Sie folgendes einfache Modell:

  1. Entscheidungsbaum

Modellformel: body_mass_g ~ . (Datensatz palmerpenguins::penguins)

Hier geht es darum, die Geschwindigkeit (und den Ressourcenverbrauch) beim Fitten zu verringern. Benutzen Sie dazu folgende Methoden

  • Auslassen gering performanter Tuningparameterwerte
  • Verwenden Sie ein Anova-Grid-Search!
  • Parallelisieren Sie auf mehrere Kerne (wenn möglich).

Hinweise:

  • Tunen Sie alle Parameter (die der Engine anbietet).
  • Verwenden Sie Defaults, wo nicht anders angegeben.
  • Beachten Sie die üblichen Hinweise.











Lösung

Setup

library(tidymodels)
── Attaching packages ────────────────────────────────────── tidymodels 1.1.1 ──
✔ broom        1.0.5     ✔ recipes      1.0.8
✔ dials        1.2.0     ✔ rsample      1.2.0
✔ dplyr        1.1.3     ✔ tibble       3.2.1
✔ ggplot2      3.4.4     ✔ tidyr        1.3.0
✔ infer        1.0.5     ✔ tune         1.1.2
✔ modeldata    1.2.0     ✔ workflows    1.1.3
✔ parsnip      1.1.1     ✔ workflowsets 1.0.1
✔ purrr        1.0.2     ✔ yardstick    1.2.0
── Conflicts ───────────────────────────────────────── tidymodels_conflicts() ──
✖ purrr::discard() masks scales::discard()
✖ dplyr::filter()  masks stats::filter()
✖ dplyr::lag()     masks stats::lag()
✖ recipes::step()  masks stats::step()
• Dig deeper into tidy modeling with R at https://www.tmwr.org
data("penguins", package = "palmerpenguins")
library(tictoc)  # Zeitmessung
library(finetune)  # tune_race_anova
library(doParallel)  # mehrere CPUs nutzen 
Loading required package: foreach

Attaching package: 'foreach'
The following objects are masked from 'package:purrr':

    accumulate, when
Loading required package: iterators
Loading required package: parallel
set.seed(42)

Entfernen wir Fälle ohne y-Wert:

d <-
  penguins %>% 
  drop_na(body_mass_g)

Daten teilen

set.seed(42)
d_split <- initial_split(d)
d_train <- training(d_split)
d_test <- testing(d_split)

Modell(e)

mod_tree <-
  decision_tree(mode = "regression",
                cost_complexity = tune(),
                tree_depth = tune(),
                min_n = tune())

Rezept(e)

rec_plain <- 
  recipe(body_mass_g ~ ., data = d_train)

Resampling

set.seed(42)
rsmpl <- vfold_cv(d_train)

Workflows

wf_tree <-
  workflow() %>%  
  add_recipe(rec_plain) %>% 
  add_model(mod_tree)

Tuning-Grid

Tuninggrid:

tune_grid <- grid_regular(extract_parameter_set_dials(mod_tree), levels = 5)

Hinweis: Andere Arten von Tuning-Grids sind sinnvoller, hier ist nur zum Vergleich mit anderen Aufgaben diese Form des Tuning-Grids gewählt.

Die Zeilen im Tuninggrid zeigen uns, für wie viele Modellparameter ein Modell berechnet wird. Natürlich üblicherweise jedes Modell mit Resampling. Da kommt in Summe ein mitunter sehr große Menge an Modellberechnungen zusammen.

Ohne Speed-up

tic()
fit_tree <-
  tune_grid(object = wf_tree,
            grid = tune_grid,
            metrics = metric_set(rmse),
            resamples = rsmpl)
toc()
78.464 sec elapsed

Die angegebene Rechenzeit bezieht sich auf einen 4-Kerne-MacBook Pro (2020).

Mit Speeed-up 1

tic()
fit_tree2 <-
  tune_race_anova(object = wf_tree,
            grid = tune_grid,
            metrics = metric_set(rmse),
            control = control_race(verbose = FALSE,
                                   pkgs = c("tidymodels"),
                                   save_pred = TRUE),
            resamples = rsmpl)
toc()
72.066 sec elapsed

Mit Speeed-up 2

doParallel::registerDoParallel()

tic()
fit_tree2 <-
  tune_race_anova(
    object = wf_tree,
    grid = tune_grid,
    metrics = metric_set(rmse),
    control = control_race(verbose = FALSE,
                           pkgs = c("tidymodels"),
                           save_pred = TRUE),
            resamples = rsmpl)
toc()
27.524 sec elapsed

Mit Speeed-up 3

doParallel::registerDoParallel()

tic()
fit_tree2 <-
  tune_grid(object = wf_tree,
            grid = tune_grid,
            metrics = metric_set(rmse),
            control = control_grid(verbose = FALSE,
                                   save_pred = TRUE),
            resamples = rsmpl)
toc()
27.312 sec elapsed

Fazit

Mit Speed-up ist schneller also ohne. Hier haben wir einen Entscheidungsbaum berechnet, der ist nicht so sehr parallelisierbar. Bei einem “Wald-Modell”, wie Random Forests, sollte der Vorteil der Parallisierung viel deutlich sein.


Categories:

  • statlearning
  • trees
  • tidymodels
  • speed
  • string