![]() |
Bias & Variance |
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.
$\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
Zuviel Bias
Fehler auf Trainingsdaten ist höher als wir akzeptieren können.
Zuviel Variance
Fehler auf Testdaten ist (deutlich) höher als auf den Trainingsdaten