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:

  • $\lambda = 0$: Keine Regularisierung, overfitting
  • $\lambda \to \infty$: $w=0$, underfitting

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

  • $\lambda$ (Regularisierung)
  • Grad an polynomiellen Features
  • Größe des Dictionaries bei Bag of words Modellen
  • $N$ bei $N$-Grammen
  • Logistische Regression oder Decision Tree?
  • Standard vs Robust Scaler
  • ...

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?

  • Minimaler Error auf Trainingsdaten: Dann maximieren wir die Modell Komplexität
  • Minimaler Error auf Testdaten: Dann trainieren wir das Modell auf den Testdaten

Wir brauchen noch ein Datenset (Validation- oder Developmentset): $\mathcal{D}_\text{val}$

Hold-out Cross Validation

  • Teile Daten in 3 Teile: $\mathcal{D}_\text{train}$, $\mathcal{D}_\text{val}$, $\mathcal{D}_\text{test}$
  • Für verschiedene Kombinationen an Hyperparametern:
    • Trainiere auf $\mathcal{D}_\text{train}$
    • Evaluiere auf $\mathcal{D}_\text{val}$
  • Wähle Hyperparameter mit kleinstem Error auf $\mathcal{D}_\text{val}$
  • Evaluiere auf $\mathcal{D}_\text{test}$

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

  • Teile Trainingsdaten in $k$ Teile $\mathcal{D}_\text{val}^i$
  • Für $i = 1, \ldots, k$:
    • Trainiere auf Daten $\mathcal{D}_\text{train} \setminus \mathcal{D}_\text{val}^i$
  • Nimm Mittelwert über alle $k$ Errors

    Vorteil:

  • Wir kommen mit weniger Daten aus
  • Nachteil:

  • Mehr Rechenaufwand

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

  • Starte mit $F = \emptyset$
  • Wiederhole:
    • Für alle Feature $f$ noch nicht in $F$:
      • Evaluiere Modell mit Features $F \bigcup \{f\}$
    • Füge bestes $f$ zu $F$ hinzu.

Stoppe wenn

  • sich der Error nicht mehr verbessert.
  • nach einer Obergrenze an Iterationen.

In sklearn: SequentialFeatureSelector

Zuviel Bias

    Fehler auf Trainingsdaten ist höher als wir akzeptieren können.

  • Mehr Features
  • Mehr Feature Engineering
  • Komplexeres Modell
  • Weniger Regularisierung

Zuviel Variance

    Fehler auf Testdaten ist (deutlich) höher als auf den Trainingsdaten

  • Weniger Features
  • Simpleres Modell
  • Mehr Regularisierung
  • Mehr Daten