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 reduzieren, um Zeit zu sparen bei der Berechnung:
<-
ames |>
ames select(Sale_Price, where(is.numeric))
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
CV:
set.seed(42)
<- vfold_cv(ames_train, strata = "Sale_Price", v = 2)
ames_folds ames_folds
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()
ames_grid_search
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
R-Quadrat:
<- fit1_metrics %>% pull(.estimate)
sol sol
Categories:
- ds1
- tidymodels
- prediction
- yacsda
- statlearning
- num