library(tidymodels)
data("penguins", package = "palmerpenguins")
library(tictoc) # Zeitmessung
library(finetune) # tune_race_anova
library(doParallel) # mehrere CPUs nutzen
set.seed(42)tidymodels-tree5
statlearning
trees
tidymodels
speed
string
Aufgabe
Berechnen Sie folgendes einfache Modell:
- 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
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_rfRandom 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