knn-ames01

statlearning
tidymodels
num
Published

May 17, 2023

Aufgabe

Berechnen Sie ein knn-Modell für den Datensatz ames!

Nutzen Sie diese Modellformel: Sale_Price ~ Lot_Area + Fireplaces + Longitude + Latitude.

Berichten Sie die Modellgüte.

Hinweise:

  • Tunen Sie \(k\) mit den Werten 1 bis 10.
  • Teilen Sie in Train- und Test-Sample auf.
  • Verwenden Sie Defaults der Funktionen, wo nicht anders angegeben.
  • z-Transformieren Sie die Prädiktoren.
  • Verwenden Sie den RSME als Kennzahl der Modellgüte.











Lösung

library(tidymodels)
data(ames)

Daten aufteilen:

d_split <- initial_split(ames)
d_train <- training(d_split)
d_test <- testing(d_split)

Modell definieren:

mod1 <-
  nearest_neighbor(
    mode = "regression",
    neighbors = tune())  # k-Wert zum Tunen taggen

Rezept definieren:

rec1 <-
  recipe(Sale_Price ~ Lot_Area + Fireplaces + Longitude + Latitude, data = d_split) %>% 
  step_normalize(all_predictors())

Workflow definieren:

wf1 <-
  workflow() %>% 
  add_model(mod1) %>% 
  add_recipe(rec1)

Resampling definieren:

cv1 <- vfold_cv(d_train)

Tuning definieren:

k_grid <-
  tibble(neighbors = 1:10)

Fitting:

fit1 <-
  tune_grid(wf1,
            resamples = vfold_cv(d_train),
            metrics = metric_set(rmse),  # nur RMSE als Modellgüte, Default ist RMSE und R2
            grid = k_grid,
            control = control_grid(save_workflow = TRUE)  # nur nötig für "fit_best", s.u.
            )

Metriken im Train-Sample (genauer: im Assessment-Sample):

show_best(fit1)
# A tibble: 5 × 7
  neighbors .metric .estimator   mean     n std_err .config              
      <int> <chr>   <chr>       <dbl> <int>   <dbl> <chr>                
1        10 rmse    standard   43067.    10   1798. Preprocessor1_Model10
2         9 rmse    standard   43089.    10   1774. Preprocessor1_Model09
3         8 rmse    standard   43115.    10   1738. Preprocessor1_Model08
4         7 rmse    standard   43181.    10   1708. Preprocessor1_Model07
5         6 rmse    standard   43317.    10   1682. Preprocessor1_Model06

(Komplettes) Train-Sample mit bestem Tuning-Kandidat fitten:

tune1_best <- fit_best(fit1)

Im Test-Sample predicten:

fit_test <- last_fit(tune1_best, d_split)

Metriken einsammeln:

collect_metrics(fit_test)
# A tibble: 2 × 4
  .metric .estimator .estimate .config             
  <chr>   <chr>          <dbl> <chr>               
1 rmse    standard   42554.    Preprocessor1_Model1
2 rsq     standard       0.717 Preprocessor1_Model1

Die Lösung lautet 4.2554397^{4}.


Categories:

  • statlearning
  • tidymodels
  • num