tmdb08

ds1
tidymodels
statlearning
tmdb
random-forest
num
Published

May 17, 2023

Aufgabe

Wir bearbeiten hier die Fallstudie TMDB Box Office Prediction - Can you predict a movie’s worldwide box office revenue?, ein Kaggle-Prognosewettbewerb.

Ziel ist es, genaue Vorhersagen zu machen, in diesem Fall für Filme.

Die Daten können Sie von der Kaggle-Projektseite beziehen oder so:

d_train_path <- "https://raw.githubusercontent.com/sebastiansauer/Lehre/main/data/tmdb-box-office-prediction/train.csv"
d_test_path <- "https://raw.githubusercontent.com/sebastiansauer/Lehre/main/data/tmdb-box-office-prediction/test.csv"

Aufgabe

Reichen Sie bei Kaggle eine Submission für die Fallstudie ein! Berichten Sie den Score!

Hinweise:

  • Sie müssen sich bei Kaggle ein Konto anlegen (kostenlos und anonym möglich); alternativ können Sie sich mit einem Google-Konto anmelden.
  • Halten Sie das Modell so einfach wie möglich. Verwenden Sie als Algorithmus die regularisierte lineare Regression .
  • Minimieren Sie die Vorverarbeitung (steps) so weit als möglich.
  • Verwenden Sie tidymodels.











Lösung

Vorbereitung

library(tidyverse)
library(tidymodels)
library(tictoc)
d_train_raw <- read_csv(d_train_path)
d_test_raw <- read_csv(d_test_path)

Train-Set verschlanken

d_train <-
  d_train_raw %>% 
  select(id, popularity, runtime, revenue, budget) 

Test-Set verschlanken

d_test <-
  d_test_raw %>% 
  select(id,popularity, runtime, budget) 

Rezept

Rezept definieren

rec2 <-
  recipe(revenue ~ ., data = d_train) %>% 
  step_mutate(budget = ifelse(budget == 0, 1, budget)) %>%  # log mag keine 0
  step_log(budget) %>% 
  step_impute_knn(all_predictors()) %>% 
  step_dummy(all_nominal_predictors())  %>% 
  update_role(id, new_role = "id")

rec2

Kreuzvalidierung / Resampling

cv_scheme <- vfold_cv(d_train,
                      v = 5)

Modelle

LM regularisiert

Mit mixture = 1 definieren wir ein Lasso.

mod_lm <-
  linear_reg(penalty = tune(), mixture = 1) %>% 
  set_engine("glmnet")

Check:

mod_lm

Workflow-Set

Hier nur ein sehr kleiner Workflow-Set.

Das ist übrigens eine gute Strategie: Erstmal mit einem kleinen Prozess anfangen, und dann sukzessive erweitern.

preproc2 <- list(rec1 = rec2)
models2 <- list(lm1 = mod_lm)
 
all_workflows2 <- workflow_set(preproc2, models2)

Fitten und tunen

my_grid <- grid_max_entropy(penalty(), size = 10)
tmdb_model_set2 <-
    all_workflows2 %>% 
    workflow_map(resamples = cv_scheme,
                 verbose = TRUE,
                 grid = my_grid
                 )
autoplot(tmdb_model_set2)

Finalisieren

Wir müssen uns leider händisch das beste Modell raussuchen:

tmdb_model_set2 %>% 
  collect_metrics() %>% 
  arrange(mean) %>% 
  filter(.metric == "rmse") %>% 
  select(1,2, mean, std_err)
best_model_params2 <-
extract_workflow_set_result(tmdb_model_set2, "rec1_lm1") %>% 
  select_best()

best_model_params2

Finalisieren

Finalisieren bedeutet:

  • Besten Workflow identifizieren (zur Erinnerung: Workflow = Rezept + Modell)
  • Den besten Workflow mit den optimalen Modell-Parametern ausstatten
  • Damit dann den ganzen Train-Datensatz fitten
  • Auf dieser Basis das Test-Sample vorhersagen
best_wf2 <- 
all_workflows2 %>% 
  extract_workflow("rec1_lm1")

best_wf2
best_wf_finalized2 <- 
  best_wf2 %>% 
  finalize_workflow(best_model_params2)

best_wf_finalized2

Final Fit

fit_final2 <-
  best_wf_finalized2 %>% 
  fit(d_train)

fit_final2
preds <- 
fit_final2 %>% 
  predict(new_data = d_test)

head(preds)

Submission df

Wir brauchen die ID-Spalte und die Vorhersagen für die Einreichung:

submission_df <-
  d_test %>% 
  select(id) %>% 
  bind_cols(preds) %>% 
  rename(revenue = .pred)

head(submission_df)

Abspeichern und einreichen:

write_csv(submission_df, file = "submission_regul_lm.csv")

Leider ein schlechter Score: 5.77945.


Categories:

  • ds1
  • tidymodels
  • statlearning
  • tmdb
  • random-forest
  • num