predictioncontest1

R
ds1
string
Published

May 17, 2023

Question

Aufgabe

Erstellen Sie eine Analyse, die einem typischen Vorhersageprojekt entspricht!

Nutzen Sie den Datensatz penguins!

Sagen Sie die Variable body_mass_g vorher.

Hinweise:

  • Halten Sie die Analyse einfach.
  • Teilen Sie Test- vs. Train-Set hälftig auf.
  • Teilen Sie Analysis vs. Assessment-Set 3:1 auf.
  • Den Datensatz penguins können Sie entweder aus dem Paket palmerpenguins beziehen oder z.B. von hier via read_csv() importieren.
  • Orientieren Sie sich im Übrigen an den allgemeinen Hinweisen des Datenwerks.











Lösung

Pakete laden:

library(tidymodels)
library(tidyverse)
library(easystats)
data("penguins", package = "palmerpenguins")

Man erinnere sich, dass ein R-Paket erst (einmalig) installiert sein muss, bevor Sie darauf zugreifen können, etwa um Daten - wie den Datensatz penguins - daraus zu beziehen.

Zeilen mischen und Train- vs. Testset aufteilen:

penguins2 <-
  penguins %>% 
  sample_n(size = nrow(.))

d_train <- penguins2 %>% slice(1:(344/2))
d_test <- penguins2 %>% slice(173:nrow(penguins))

Das Trainset weiter aufteilen:

d_split <- initial_split(d_train)

d_analysis <- training(d_split)
d_assessment <- testing(d_split)

Rezept definieren:

rec1 <-
  recipe(body_mass_g ~ ., data = d_analysis) %>% 
  step_impute_knn(all_predictors()) %>% 
  step_normalize(all_numeric(), -all_outcomes())

Rezept prüfen:

d_analysis_baked <- 
rec1 %>% 
  prep() %>% 
  bake(new_data = NULL)

describe_distribution(d_analysis_baked)
Variable Mean SD IQR Min Max Skewness Kurtosis n n_Missing
bill_length_mm 0.000 1.0000 1.731310 -2.159228 2.560870 0.0760789 -0.8319692 129 0
bill_depth_mm 0.000 1.0000 1.469785 -2.113935 2.137943 -0.2111715 -0.6801013 129 0
flipper_length_mm 0.000 1.0000 1.707152 -1.535114 2.084049 0.4487826 -0.9893612 129 0
year 0.000 1.0000 2.359469 -1.198025 1.161444 -0.0296827 -1.6124172 129 0
body_mass_g 4225.969 851.5118 1325.000000 2900.000000 6300.000000 0.5405268 -0.7594811 129 0

Workflow und CV definieren:

m1 <- 
  linear_reg()

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

cv_scheme <- vfold_cv(d_analysis, v = 2)

Fitten (hier kein Tuning):

fit1 <-
  wf1 %>% 
  tune_grid(resamples = cv_scheme)

Finalisieren:

show_best(fit1)
.metric .estimator mean n std_err .config
rmse standard 315.3654 2 15.70452 pre0_mod0_post0
wf1_final <-
  wf1 %>% 
  finalize_workflow(show_best(fit1))


wf1_final
══ Workflow ════════════════════════════════════════════════════════════════════
Preprocessor: Recipe
Model: linear_reg()

── Preprocessor ────────────────────────────────────────────────────────────────
2 Recipe Steps

• step_impute_knn()
• step_normalize()

── Model ───────────────────────────────────────────────────────────────────────
Linear Regression Model Specification (regression)

Computational engine: lm 

Modellgüte:

fit1_final <-
  wf1_final %>% 
  last_fit(d_split)


collect_metrics(fit1_final)
.metric .estimator .estimate .config
rmse standard 226.9887784 pre0_mod0_post0
rsq standard 0.9127546 pre0_mod0_post0
fit1_train <-
  wf1_final %>% 
  fit(d_train)


fit1_test <-
  fit1_train %>% 
  predict(d_test)

head(fit1_test)
.pred
4709.582
3836.121
4169.211
4319.333
3383.746
3506.382

Vgl https://workflows.tidymodels.org/reference/predict-workflow.html

Submitten:

subm_df <-
  d_test %>% 
  mutate(id = 173:344) %>% 
  bind_cols(fit1_test) %>% 
  select(id, .pred) %>% 
  rename(pred = .pred)

Und als CSV-Datei speichern:

#write_csv(subm_df, file = "submission_blabla.csv")

Categories:

  • R
  • ds1
  • sose22
  • string