library(tidymodels)
library(tictoc) # Rechenzeit messen, optional
data(ames)
tidymodels-ames-05
ds1
tidymodels
prediction
yacsda
statlearning
num
Aufgabe
Berechnen Sie ein knn-Modell mit tidymodels und zwar anhand des ames
Datensatzes.
Modellgleichung: log(Sale_Price) ~ ., data = ames_train
.
Gesucht ist R-Quadrat als Maß für die Modellgüte im TEST-Sample.
Hinweise:
- Fixieren Sie die Zufallszahlen auf den Startwert 42.
- Denken Sie daran, die nominal skalierten Variablen in Dummy-Variablen umzurechnen.
- Denken Sie daran, dass kNN gleich skalierte Prädiktoren benötigt.
- Nutzen Sie eine v=10,r=1 CV.
- Verzichten Sie auf weitere Schritte der Vorverarbeitung.
Lösung
Setup:
AV loggen:
<-
ames %>%
ames mutate(Sale_Price = log(Sale_Price, base = 10))
Datensatz aufteilen:
set.seed(42)
<- initial_split(ames, strata = "Sale_Price")
data_split <- training(data_split)
ames_train <- testing(data_split) ames_test
Workflow:
<-
ames_rec recipe(Sale_Price ~ ., data = ames_train) %>%
# step_log(Sale_Price, base = 10) %>% No!
step_other(Neighborhood, threshold = .1) %>%
step_dummy(all_nominal()) %>%
step_zv(all_predictors())
<-
knn_model2 nearest_neighbor(
mode = "regression",
neighbors = tune() # Wir tunen "neighbors"
)
<-
ames_wflow2 workflow() %>%
add_recipe(ames_rec) %>%
add_model(knn_model2)
ames_wflow2
══ Workflow ════════════════════════════════════════════════════════════════════
Preprocessor: Recipe
Model: nearest_neighbor()
── Preprocessor ────────────────────────────────────────────────────────────────
3 Recipe Steps
• step_other()
• step_dummy()
• step_zv()
── Model ───────────────────────────────────────────────────────────────────────
K-Nearest Neighbor Model Specification (regression)
Main Arguments:
neighbors = tune()
Computational engine: kknn
CV:
set.seed(42)
<- vfold_cv(ames_train, strata = "Sale_Price", v = 2)
ames_folds ames_folds
# 2-fold cross-validation using stratification
# A tibble: 2 × 2
splits id
<list> <chr>
1 <split [1098/1099]> Fold1
2 <split [1099/1098]> Fold2
Tunen:
tic()
<-
ames_grid_search tune_grid(
knn_model2,
ames_rec,resamples = ames_folds,
control = control_grid(save_workflow = TRUE),
grid = 2, # 2 Tuningparameterwerte, hier nur zum Zeit sparen
)toc()
5.253 sec elapsed
ames_grid_search
# Tuning results
# 2-fold cross-validation using stratification
# A tibble: 2 × 4
splits id .metrics .notes
<list> <chr> <list> <list>
1 <split [1098/1099]> Fold1 <tibble [4 × 5]> <tibble [0 × 3]>
2 <split [1099/1098]> Fold2 <tibble [4 × 5]> <tibble [0 × 3]>
Modellgüte im Train-Samples über die Tuningparameter hinweg:
autoplot(ames_grid_search)
Fitte besten Modellkandidaten (Paket tune
>= V1.1.0 benötigt):
<- fit_best(ames_grid_search) fit1_final
Vorhersagen:
<-
preds predict(fit1_final, ames_test)
Modellgüte im Test-Sample:
<-
fit1_metrics %>%
preds bind_cols(ames_test %>% select(Sale_Price)) %>%
rsq(truth = Sale_Price, estimate = .pred)
fit1_metrics
# A tibble: 1 × 3
.metric .estimator .estimate
<chr> <chr> <dbl>
1 rsq standard 0.739
R-Quadrat:
<- fit1_metrics %>% pull(.estimate)
sol sol
[1] 0.739015
Categories:
- ds1
- tidymodels
- prediction
- yacsda
- statlearning
- num