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"tmdb08
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:
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")
rec2Kreuzvalidierung / 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_lmWorkflow-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_params2Finalisieren
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_wf2best_wf_finalized2 <-
best_wf2 %>%
finalize_workflow(best_model_params2)
best_wf_finalized2Final Fit
fit_final2 <-
best_wf_finalized2 %>%
fit(d_train)
fit_final2preds <-
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