library(tidyverse)
library(tidymodels)
library(finetune)
Tengku-Hanis01
Aufgabe
Bearbeiten Sie diese Fallstudie von Tengku Hanis!
Lösung
Die folgende Lösung basiert auf der oben angegebenen Fallstudie.
Pakete laden:
Daten importieren:
data(income, package = "kernlab")
Datensatz vereinfachen:
set.seed(2021)
<-
income2 %>%
income filter(INCOME == "[75.000-" | INCOME == "[50.000-75.000)") %>%
slice_sample(n = 600) %>%
mutate(INCOME = fct_drop(INCOME),
INCOME = fct_recode(INCOME,
rich = "[75.000-",
less_rich = "[50.000-75.000)"),
INCOME = factor(INCOME, ordered = F)) %>%
mutate(across(-INCOME, fct_drop))
Check:
::plot_missing(income) DataExplorer
{DataExplorer}
sieht nach einem nützlichen Paket aus. Check it out hier!
Daten aufteilen (“Spending our data budget”):
set.seed(2021)
<- initial_split(income2, strata = INCOME)
dat_index <- training(dat_index)
dat_train <- testing(dat_index) dat_test
Kreuzvalidierung:
set.seed(2021)
<- vfold_cv(dat_train, v = 10, repeats = 1, strata = INCOME) dat_cv
Rezept:
<-
dat_rec recipe(INCOME ~ ., data = dat_train) %>%
step_impute_mode(all_predictors()) %>%
step_ordinalscore(AGE, EDUCATION, AREA, HOUSEHOLD.SIZE, UNDER18)
Als Modell (im engeren Sinne) nutzen wir ein Random-Forest-Modell:
<-
rf_mod rand_forest(mtry = tune(),
trees = tune(),
min_n = tune()) %>%
set_mode("classification") %>%
set_engine("ranger")
Wie man sieht, geben wir 3 Tuningparameter an.
Modell und Rezept zum Workflow zusammenfassen:
<-
rf_wf workflow() %>%
add_recipe(dat_rec) %>%
add_model(rf_mod)
Tuning Grids definieren:
Wichtig ist, dass wir genau die Parameter angeben im Grid, die wir auch zum Tunen getaggt haben. Das kann man händisch erledigen:
# Regular grid:
<- grid_regular(mtry(c(1, 13)),
reg_grid trees(),
min_n(),
levels = 3)
# Random grid mit 100 Kandidaten:
<- grid_random(mtry(c(1, 13)),
rand_grid trees(),
min_n(),
size = 100)
Wir speichern die Vorhersagen aller Folds im Train-Sample, um die Modellgüte im Train- bzw. Validierungssample anschauen zu können:
<- control_grid(save_pred = T,
ctrl extract = extract_model)
Error: object 'extract_model' not found
<- metric_set(roc_auc) measure
Außerdem haben wir als Gütemaß roc_auc
definiert.
In der Fallstudie wurde noch extract = extract_model
bei control_grid()
ergänzt. Das lassen wir der Einfachheit halber mal weg.
Parallelisieren auf mehreren Kernen, um Rechenzeit zu sparen:
library(doParallel)
# Create a cluster object and then register:
<- makePSOCKcluster(4)
cl registerDoParallel(cl)
Wie viele CPUs hat mein Computer?
detectCores(logical = FALSE)
[1] 4
Jetzt geht’s ab: Tuning und Fitting!
Hier das “reguläre Gitter” an Tuningkandidaten:
set.seed(2021)
<-
tune_regular %>%
rf_wf tune_grid(
resamples = dat_cv,
grid = reg_grid,
control = ctrl,
metrics = measure)
Error: object 'ctrl' not found
stopCluster(cl)
Die Modellgüte im Vergleich zwischen den Tuning-Kandidaten kann man sich schön ausgeben lassen:
autoplot(tune_regular)
Error: object 'tune_regular' not found
Geht aber nur, wenn man oben gesagt hat, dass man die Predictions speichern möchte.
Welche Kandidatin war am besten:
show_best(tune_regular)
Error: object 'tune_regular' not found
So kann man sich die beste Kandidatin anschauen:
show_best(tune_regular) %>%
arrange(-mean) %>%
slice(1)
Error: object 'tune_regular' not found
Aber man kann sich auch von Tidymodels einfach die beste Kandidatin sagen lassen:
<-
best_rf select_best(tune_regular, "roc_auc")
Error: object 'tune_regular' not found
Auf dieser Basis können wir jetzt den Workflow finalisieren, also die Tuningparameter einfüllen:
<-
final_wf %>%
rf_wf finalize_workflow(best_rf)
Error: object 'best_rf' not found
final_wf
Error: object 'final_wf' not found
Und mit diesen Werten den ganzen Train-Datensatz fitten:
<-
test_fit %>%
final_wf last_fit(dat_index)
Error: object 'final_wf' not found
Wie gut ist das jetzt?
%>%
test_fit collect_metrics()
Error: object 'test_fit' not found
Categories:
- tidymodels
- prediction
- yacsda
- statlearning
- trees
- speed
- string