Skip to content

Instantly share code, notes, and snippets.

@sebastiansauer
Created June 21, 2022 10:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sebastiansauer/163356116c3f0c8b0b41fd3988c1685d to your computer and use it in GitHub Desktop.
Save sebastiansauer/163356116c3f0c8b0b41fd3988c1685d to your computer and use it in GitHub Desktop.
Simple regularized model Kaggle TMDB competition
```{r libs, include = FALSE}
library(tidyverse)
```
```{r global-knitr-options, include=FALSE}
knitr::opts_chunk$set(fig.pos = 'H',
fig.asp = 0.618,
fig.width = 4,
fig.cap = "",
fig.path = "",
echo = TRUE,
message = FALSE,
fig.show = "hold")
```
Question
========
Wir bearbeiten hier die Fallstudie [TMDB Box Office Prediction -
Can you predict a movie's worldwide box office revenue?](https://www.kaggle.com/competitions/tmdb-box-office-prediction/overview),
ein [Kaggle](https://www.kaggle.com/)-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:
```{r}
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`.
Solution
========
# Vorbereitung
```{r}
library(tidyverse)
library(tidymodels)
```
```{r}
d_train_raw <- read_csv(d_train_path)
d_test_raw <- read_csv(d_test_path)
```
## Train-Set verschlanken
```{r}
d_train <-
d_train_raw %>%
select(id, popularity, runtime, revenue, budget)
```
## Test-Set verschlanken
```{r}
d_test <-
d_test_raw %>%
select(id,popularity, runtime, budget)
```
# Rezept
## Rezept definieren
```{r}
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
```{r}
cv_scheme <- vfold_cv(d_train,
v = 5,
repeats = 3)
```
# Modelle
## LM
```{r}
mod_lm <-
linear_reg(penalty = tune(), mixture = 1) %>%
set_engine("glmnet")
```
# 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.
```{r}
preproc2 <- list(rec1 = rec2)
models2 <- list(lm1 = mod_lm)
all_workflows2 <- workflow_set(preproc2, models2)
```
# Fitten und tunen
```{r}
tmdb_model_set2 <-
all_workflows2 %>%
workflow_map(resamples = cv_scheme)
```
# Finalisieren
Wir müssen uns leider händisch das beste Modell raussuchen:
```{r}
tmdb_model_set2 %>%
collect_metrics() %>%
arrange(-mean)
```
```{r}
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
```{r}
best_wf2 <-
all_workflows2 %>%
extract_workflow("rec1_lm1")
best_wf2
```
```{r}
best_wf_finalized2 <-
best_wf2 %>%
finalize_workflow(best_model_params2)
best_wf_finalized2
```
## Final Fit
```{r}
fit_final2 <-
best_wf_finalized2 %>%
fit(d_train)
fit_final2
```
```{r error = TRUE}
preds <-
fit_final2 %>%
predict(new_data = d_test)
head(preds)
```
## Submission df
```{r}
submission_df <-
d_test %>%
select(id) %>%
bind_cols(preds) %>%
rename(revenue = .pred)
head(submission_df)
```
Abspeichern und einreichen:
```{r eval = FALSE}
write_csv(submission_df, file = "submission_regul_lm.csv")
```
Meta-information
================
exname: tmdb08
extype: num
exsolution: `r sol`
extol: .2
expoints: 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment