Wie bewerten wir ein Machine Learning Modell?
Trainings Loss:
Regressionsmodelle
Wir sagen reellwertige Zahlen voraus
Mean Squared Error: \[ \frac{1}{m} \sum_{(x,y) \in \mathcal{D}} (h(x) - y)^2 \]
Mean Absolute Error: \[ \frac{1}{m} \sum_{(x,y) \in \mathcal{D}} |h(x) - y| \]
Max Error: \[ \max_{(x,y) \in \mathcal{D}} |h(x) - y| \]
R2 Score
Coefficient of determination
Gibt an, wie viel besser wir sind, als einfach den Mittelwert vorherzusagen
\[ \text{R2} = 1 - \frac{\color{blue} \text{SS}_\text{res}}{\color{red} \text{SS}_\text{tot}} \]
https://en.wikipedia.org/wiki/File:Coefficient_of_Determination.svg
Es macht Sinn, immer mehrere Metriken zu tracken um potentielle Probleme zu finden.
Classification
Wir haben Positive und Negative Beispiele
| Vorhergesagt | |||
| Positiv | Negativ | ||
| Wahrheit | Positiv | Richtig Positiv (TP) | Falsch Negativ (FN) |
| Negativ | Falsch Positiv (FP) | Richtig Negativ (TN) | |
Accuracy
\[ \frac{\text{TP+TN}}{\text{TP} + \text{TN} + \text{FP} + \text{FN}} \]
Welcher Anteil der Vorhersagen waren korrekt?
Recall
(True Positive Rate)
\[ \frac{\text{TP}}{\text{TP} + \text{FN}} \]
Welchen Anteil der echt positiven Beispiele haben wir gefunden?
Specificity
(True Negative Rate)
\[ \frac{\text{TN}}{\text{TN} + \text{FP}} \]
Welchen Anteil der echt negativen Beispiele haben wir gefunden?
Fall-out
(False Positive Rate)
\[ \frac{\text{FP}}{\text{TN} + \text{FP}} \]
Welchen Anteil der echt negativen Beispiele haben wir falsch vorhergesagt?
Precision
\[ \frac{\text{TP}}{\text{TP} + \text{FP}} \]
Welcher Anteil der positiven Vorhersagen waren korrekt?
Eine Metrik alleine kann täuschen
Metriken brauchen Kontext: ELISA HIV Test
Test mit 99.9% Accuracy, 99.9% Recall und 99.9% Specificity.
| Vorhergesagt | ||||
| Summe | Positiv | Negativ | ||
| Wahrheit | Positiv | 67.000 | 66.933 | 67 |
| Negativ | 81.933.000 | 81.933 | 81.851.067 | |
Tradeoff zwischen
$\text{F}_1$ Score
\[ \frac{2 \cdot \text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}} \]
Harmonisches Mittel aus Precision und Recall
Oft haben wir den Trade-off selber in der Hand.
Logistischen Regression: $h_w(x)$ nicht binär, sondern eine Wahrscheinlichkeit von 0 bis 1.
Wir müssen den Threshold bestimmen, ab dem wir "positiv" vorhersagen wollen.
Was wir wollen hängt vom Problem ab.
Beispiel: Spam Filter
Wenn eine Spam Email im Posteingang landet ist das weniger schlimm, als wenn eine richtige Email als Spam klassifiziert wird.
Specificity wichtiger als Recall
Receiver operating characteristic (ROC)
Für alle Thresholds plotte Recall gegen Fall-out.
Beispiel (Wikipedia):
AUROC
(Area under operating characteristic)
Berechne Fläche unter der ROC Kurve
In sklearn: Metrics
Wahl von Modell Parametern
Beispiel: Polynomielle Features
Welchen maximalen Grad $d$ nehmen wir?
|
|
|
| $w_0 + w_1 x$ | $w_0 + w_1 x + w_2 x^2$ | $w_0 + w_1 x + w_2 x^2 + w_3 x^3 + w_4 x^4 + w_5 x^5$ |
| Underfitting High Bias |
Overfitting High Variance |
Underfitting (High Bias):
Unser Modell hat starke Annahmen, die (zu) falsch sind.
Overfitting (High Variance):
Mit leicht anderen Daten bekommen wir ein komplett anderes Modell
Ein Modell kann viel Bias und Varianz haben
Analog für Classification
|
|
|
Jeder Parameter, den das Modell lernt ist ein Freiheitsgrad.
Wenn Freiheitsgerade $\geq m$, dann besteht die Möglichkeit, dass das Modell die Daten "auswendig" lernt.
Regularisierung
Idee: Bestrafe große Gewichte in $w$
Beispiel Lineare Regression: \[ \min_w \sum_{(x,y) \in \mathcal{D}_\text{train}} ( h_w(x) - y )^2 {\color{red} + \lambda ||w||^2} \]
![]() |
$\stackrel{\text{mehr} \lambda}{\Rightarrow}$ | ![]() |
Extremfälle:
Die Feature sollten ordentlich skaliert sein (gleiche Größenordnung), damit Regularisierung nicht große Feature bevorzugt.
Durch Regularisierung ist es nicht mehr so schlimm, wenn wir mehr Feature als Daten haben.
Wahrscheinlichkeitsinterpretation von Regularisierung
Wenn wir annehmen, dass \[ P(w) \sim \mathcal{N}(0, \frac{1}{\lambda}) \] dann ist Regularisierung Maximum Likelihood Estimation.
$\lambda$ nennen wir einen Hyperparameter
Parameter, die nicht direkt vom Modell gelernt werden sind Hyperparameter.
Hyperparameter
Wie stellen wir die Hyperparameter ein?
Was für uns am Ende zählt ist nicht, wie gut das Modell auf den Trainingsdaten ist, sondern wie gut es in Produktion läuft.
Generalization Error: Fehler des Modells auf neuen Daten
Wie kommen wir an den Generalization Error?
Wir brauchen ein separates Testset $\mathcal{D}_\text{test}$, das nicht zum trainieren der Daten verwendet wird.
Vorgehen: Teile alle Daten auf in $\mathcal{D}_\text{train}$ und $\mathcal{D}_\text{test}$
Wie groß sollte das Testset sein?
Faustregel: 20%
Wenn wir sehr viele Daten haben, reicht auch ein kleinerer Anteil
Wie optimieren wir die Hyperparameter?
Wir brauchen noch ein Datenset (Validation- oder Developmentset): $\mathcal{D}_\text{val}$
Hold-out Cross Validation
Nachdem wir die Hyperparameter bestimmt haben, macht es Sinn, nochmal auf $\mathcal{D}_\text{train} \bigcup \mathcal{D}_\text{val}$ zu trainieren, um keine Daten zu verschwenden.
Aus Versehen doch das Testset verwenden kann leicht passieren.
Beispiel: Kaggle-Challenge
Es machen 1000 Teams mit und das beste (auf dem Testset) gewinnt.
Best practice
Testset direkt am Anfang herausschneiden und in eigener Datei speichern.
Best practice
Bei einem produktiven ML System sollten wir versuchen die Modell Performance auf neuen Daten zu messen.
Vorsicht mit Time Series Data:
| Datum | Temp. t-4 | Temp. t-3 | Temp. t-2 | Temp. t-1 | Temp. heute |
|---|---|---|---|---|---|
| 27.8.2022 | 26.9° C | 29.1° C | 27° C | 24.7° C | 20.6° C |
| 28.8.2022 | 29.1° C | 27° C | 24.7° C | 20.6° C | 19.7° C |
| 29.8.2022 | 27° C | 24.7° C | 20.6° C | 19.7° C | 22.1° C |
| 30.8.2022 | 24.7° C | 20.6° C | 19.7° C | 22.1° C | 21.4° C |
Können wir da einfach zufällig ein Testset rausholen?
Die einzelnen Daten sind nicht unabhängig!
Besser: Mehrere zusammenhängende Zeiträume als Testset verwenden.
Wenn wir sehr wenige Daten haben können wir das Validierungsset ökonomischer machen:
k-fold Cross Validation
Vorteil:
Nachteil:
Wenn wir wenige Daten haben gilt generell:
Wir sollten möglichst viele Hyperparameter durch Domänen-Wissen festlegen.
In sklearn: KFold
Anderer Ansatz: Reduziere Anzahl an Features um Overfitting zu vermeiden.
Sequential Feature Selection
Stoppe wenn
In sklearn: SequentialFeatureSelector