library(tidyverse)
data("germeval_train", package = "pradadata")
data("germeval_test", package = "pradadata")
germeval03-sent-wordvec-elasticnet
Aufgabe
Erstellen Sie ein prädiktives Modell für Textdaten. Nutzen Sie Sentiments und TextFeatures im Rahmen von Feature-Engineering. Nutzen Sie außerdem deutsche Word-Vektoren für das Feature-Engineering.
Als Lernalgorithmus verwenden Sie ein Elasticnet. Tunen Sie alle Parameter mit insgesamt 100 Kandidaten.
Daten
Verwenden Sie die GermEval-2018-Daten.
Die Daten sind unter CC-BY-4.0 lizensiert. Author: Wiegand, Michael (Spoken Language Systems, Saarland University (2010-2018), Leibniz Institute for the German Language (since 2019)),
Die Daten sind auch über das R-Paket PradaData zu beziehen.
AV und UV
Die AV lautet c1
. Die (einzige) UV lautet: text
.
Hinweise
- Orientieren Sie sich im Übrigen an den allgemeinen Hinweisen des Datenwerks.
- Nutzen Sie Tidymodels.
- Nutzen Sie das
sentiws
Lexikon. - ❗ Achten Sie darauf, die Variable
c2
zu entfernen bzw. nicht zu verwenden.
Lösung
Setup
Train-Datensatz:
<-
d_train |>
germeval_train select(id, c1, text)
Pakete:
library(tictoc)
library(tidymodels)
library(beepr)
library(finetune) # anova race
Learner/Modell
<-
mod logistic_reg(mode = "classification",
penalty = tune(),
mixture = tune(),
engine = "glmnet"
)
Gebackenen Datensatz als neue Grundlage
Wir importieren den schon an anderer Stelle aufbereiteten Datensatz. Das hat den Vorteil (hoffentlich), das die Datenvolumina viel kleiner sind. Die Arbeit des Feature Engineering wurde uns schon abgenommen.
<-
d_train_raw read_csv("https://raw.githubusercontent.com/sebastiansauer/Datenwerk2/main/data/germeval/germeval_train_recipe_wordvec_senti.csv")
Rows: 5009 Columns: 121
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (1): c1
dbl (120): id, emo_count, schimpf_count, emoji_count, textfeature_text_copy_...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
<- read_csv("https://raw.githubusercontent.com/sebastiansauer/Datenwerk2/main/data/germeval/germeval_test_recipe_wordvec_senti.csv") d_test_baked_raw
Rows: 3532 Columns: 121
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (1): c1
dbl (120): id, emo_count, schimpf_count, emoji_count, textfeature_text_copy_...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Keine Dummysierung der AV
Lineare Modelle müssen dummysiert sein. Rezepte wollen das nicht so gerne für die AV besorgen.
ABER: Klassifikationsmodelle in Tiymodels (parsnip) benötigen eine factor Variable als AV, sonst werden sie nicht als Klassifikation erkannt.
<-
d_train |>
d_train_raw mutate(c1 = as.factor(c1))
levels(d_train$c1)
[1] "OFFENSE" "OTHER"
Tidymodels modelliert die erste Stufe.
<-
d_test_baked |>
d_test_baked_raw mutate(c1 = as.factor(c1))
levels(d_test_baked$c1)
[1] "OFFENSE" "OTHER"
Dummy-Rezept
Plain, aber mit Dummyisierung:
<-
rec recipe(c1 ~ ., data = d_train)
Workflow
<-
wf workflow() |>
add_recipe(rec) |>
add_model(mod)
Parallelisierung über mehrere Kerne
library(parallel)
<- detectCores(logical = FALSE)
all_cores
library(doFuture)
registerDoFuture()
<- makeCluster(3)
cl plan(cluster, workers = cl)
Achtung: Viele Kerne brauchen auch viel Speicher.
Tune/Resample/Fit
tic()
<-
fit_wordvec_senti_elasticnet tune_race_anova(
wf,grid = 100,
resamples = vfold_cv(d_train, v = 5),
control = control_race(verbose_elim = TRUE))
ℹ Racing will maximize the roc_auc metric.
ℹ Resamples are analyzed in a random order.
ℹ Fold4: 19 eliminated; 81 candidates remain.
ℹ Fold5: 2 eliminated; 79 candidates remain.
toc()
164.439 sec elapsed
beep()
Beste Performance
autoplot(fit_wordvec_senti_elasticnet)
show_best(fit_wordvec_senti_elasticnet)
Warning: No value of `metric` was given; metric 'roc_auc' will be used.
# A tibble: 5 × 8
penalty mixture .metric .estimator mean n std_err .config
<dbl> <dbl> <chr> <chr> <dbl> <int> <dbl> <chr>
1 0.00367 0.349 roc_auc binary 0.787 5 0.00703 Preprocessor1_Model032
2 0.00865 0.204 roc_auc binary 0.787 5 0.00706 Preprocessor1_Model017
3 0.00423 0.0682 roc_auc binary 0.786 5 0.00682 Preprocessor1_Model002
4 0.00228 0.305 roc_auc binary 0.786 5 0.00692 Preprocessor1_Model027
5 0.00174 0.960 roc_auc binary 0.786 5 0.00714 Preprocessor1_Model096
<- select_best(fit_wordvec_senti_elasticnet) best_params
Warning: No value of `metric` was given; metric 'roc_auc' will be used.
Finalisieren
tic()
<- finalize_workflow(wf, best_params)
wf_finalized <- fit(wf_finalized, data = d_train)
lastfit toc()
0.869 sec elapsed
Test-Set-Güte
tic()
<-
preds predict(lastfit, new_data = d_test_baked)
toc()
0.05 sec elapsed
<-
d_test |>
d_test_baked bind_cols(preds) |>
mutate(c1 = as.factor(c1))
<- metric_set(accuracy, f_meas)
my_metrics my_metrics(d_test,
truth = c1,
estimate = .pred_class)
# A tibble: 2 × 3
.metric .estimator .estimate
<chr> <chr> <dbl>
1 accuracy binary 0.717
2 f_meas binary 0.502