tidymodels-tree5

statlearning
trees
tidymodels
speed
string
Published

November 8, 2023

Aufgabe

Berechnen Sie folgendes einfache Modell:

  1. Random Forest mit trees=50

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)
data("penguins", package = "palmerpenguins")
library(tictoc)  # Zeitmessung
library(finetune)  # tune_race_anova
library(doParallel)  # mehrere CPUs nutzen 
set.seed(42)

Entfernen wir Fälle mit fehlenden Werten:

d <-
  penguins %>% 
  drop_na()

Daten teilen

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

Modell(e)

mod_rf <-
  rand_forest(mode = "regression",
              mtry = tune())
mod_rf
Random Forest Model Specification (regression)

Main Arguments:
  mtry = tune()

Computational engine: ranger 

Rezept(e)

rec_plain <- 
  recipe(body_mass_g ~ ., data = d_train) %>% 
  step_dummy(all_nominal_predictors()) %>% 
  step_impute_knn(all_predictors())
d_train_baked <-
  bake(prep(rec_plain, d_train), new_data = NULL)

head(d_train_baked)
bill_length_mm bill_depth_mm flipper_length_mm year body_mass_g species_Chinstrap species_Gentoo island_Dream island_Torgersen sex_male
34.5 18.1 187 2008 2900 0 0 0 0 0
52.2 18.8 197 2009 3450 1 0 1 0 1
45.4 14.6 211 2007 4800 0 1 0 0 0
42.1 19.1 195 2008 4000 0 0 0 1 1
50.0 15.9 224 2009 5350 0 1 0 0 1
41.5 18.5 201 2009 4000 0 0 1 0 1

Keine fehlenden Werte mehr?

sum(is.na(d_train_baked))
[1] 0

Resampling

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

Workflows

wf_rf <-
  workflow() %>%  
  add_recipe(rec_plain) %>% 
  add_model(mod_rf)

wf_rf
══ Workflow ════════════════════════════════════════════════════════════════════
Preprocessor: Recipe
Model: rand_forest()

── Preprocessor ────────────────────────────────────────────────────────────────
2 Recipe Steps

• step_dummy()
• step_impute_knn()

── Model ───────────────────────────────────────────────────────────────────────
Random Forest Model Specification (regression)

Main Arguments:
  mtry = tune()

Computational engine: ranger 

Ohne Speed-up

tic()
fit_rf <-
  tune_grid(
    object = wf_rf,
    resamples = rsmpl)
toc()
16.801 sec elapsed

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

Mit Speeed-up 1

tic()
fit_rf2 <-
  tune_race_anova(
    object = wf_rf,
    resamples = rsmpl)
toc()
27.433 sec elapsed

Mit Speeed-up 2

doParallel::registerDoParallel()

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

Mit Speeed-up 3

doParallel::registerDoParallel()

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

Fazit

Mit Speed-up ist schneller also ohne. Ein Random-Forest ist ein Modelltyp, der von Parallelisierung gut profitiert.


Categories:

  • statlearning
  • trees
  • tidymodels
  • speed
  • string