library(tidyverse)
data("germeval_train", package = "pradadata")
data("germeval_test", package = "pradadata")
germeval03-sent-wordvec-xgb-tune
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 XGB. Tunen Sie die Lernrate und die max. Tiefe (max_depth
) des Modells.
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
<-
d_train |>
germeval_train select(id, c1, text)
library(tictoc)
library(tidymodels)
#library(syuzhet)
library(beepr)
library(finetune) # anova race
library(lobstr) # object size
library(visdat) # footprint of csv
#data("sentiws", package = "pradadata")
Learner/Modell
<-
mod boost_tree(mode = "classification",
learn_rate = tune(),
tree_depth = tune()
)
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 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.
vis_dat(d_train) +
# remove axis labels:
theme(axis.text.x=element_blank(),
axis.ticks.x=element_blank()
)
<- read_csv("https://raw.githubusercontent.com/sebastiansauer/Datenwerk2/main/data/germeval/germeval_test_recipe_wordvec_senti.csv") d_test_baked
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.
Plain-Rezept
<-
rec recipe(c1 ~ ., data = d_train)
Neuer Workflow mit plainem Rezept
<-
wf workflow() |>
add_recipe(rec) |>
add_model(mod)
Parallelisierung über mehrere Kerne
library(parallel)
<- detectCores(logical = FALSE)
all_cores
library(doFuture)
Loading required package: foreach
Attaching package: 'foreach'
The following objects are masked from 'package:purrr':
accumulate, when
Loading required package: future
registerDoFuture()
<- makeCluster(3)
cl plan(cluster, workers = cl)
Achtung: Viele Kerne brauchen auch viel Speicher.
Tune/Resample/Fit
tic()
<-
fit_wordvec_senti_xgb tune_race_anova(
wf,grid = 30,
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.
ℹ Fold5: 23 eliminated; 7 candidates remain.
ℹ Fold4: 2 eliminated; 5 candidates remain.
toc()
186.332 sec elapsed
beep()
Objekt-Größe:
::obj_size(fit_wordvec_senti_xgb) lobstr
5.10 MB
Groß!
Wie wir gesehen haben, ist das Rezept riesig.
Get best performance
autoplot(fit_wordvec_senti_xgb)
show_best(fit_wordvec_senti_xgb)
Warning: No value of `metric` was given; metric 'roc_auc' will be used.
# A tibble: 5 × 8
tree_depth learn_rate .metric .estimator mean n std_err .config
<int> <dbl> <chr> <chr> <dbl> <int> <dbl> <chr>
1 7 0.255 roc_auc binary 0.765 5 0.00862 Preprocessor1_Mo…
2 11 0.292 roc_auc binary 0.760 5 0.00859 Preprocessor1_Mo…
3 9 0.126 roc_auc binary 0.756 5 0.00662 Preprocessor1_Mo…
4 8 0.0796 roc_auc binary 0.755 5 0.00570 Preprocessor1_Mo…
5 10 0.213 roc_auc binary 0.754 5 0.00628 Preprocessor1_Mo…
<- select_best(fit_wordvec_senti_xgb) best_params
Warning: No value of `metric` was given; metric 'roc_auc' will be used.
Finalisieren
<- select_best(fit_wordvec_senti_xgb) best_params
Warning: No value of `metric` was given; metric 'roc_auc' will be used.
tic()
<- finalize_workflow(wf, best_params)
wf_finalized <- fit(wf_finalized, data = d_train)
lastfit_xgb toc()
1.997 sec elapsed
Test-Set-Güte
tic()
<-
preds predict(lastfit_xgb, new_data = d_test_baked)
toc()
0.219 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.715
2 f_meas binary 0.479