feature(notes): add l5 validation notes
This commit is contained in:
@@ -393,3 +393,70 @@ Untersuche den Einfluss des **Standardisierens der Features** auf:
|
|||||||
- Score
|
- Score
|
||||||
|
|
||||||
Optional/zu Hause: Einfluss des **Logarithmierens des Targets** auf die Performance der linearen Regression.
|
Optional/zu Hause: Einfluss des **Logarithmierens des Targets** auf die Performance der linearen Regression.
|
||||||
|
|
||||||
|
> *(eigene Bearbeitung — bewusst nicht vorgelöst)*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Validierung — Klassifikationsmetriken (Foliensatz 14)
|
||||||
|
|
||||||
|
> Bewertung von **Klassifikations**modellen (Ergänzung zu den Regressionsmetriken oben).
|
||||||
|
|
||||||
|
## Konfusionsmatrix
|
||||||
|
|
||||||
|
Gegenüberstellung tatsächlicher vs. vorhergesagter Klassen:
|
||||||
|
|
||||||
|
- **TP** (True Positive): positiver Fall korrekt als positiv erkannt
|
||||||
|
- **TN** (True Negative): negativer Fall korrekt als negativ erkannt
|
||||||
|
- **FP** (False Positive): negativer Fall fälschlich als positiv → **Fehler Typ I**
|
||||||
|
- **FN** (False Negative): positiver Fall fälschlich als negativ → **Fehler Typ II**
|
||||||
|
|
||||||
|
Konvention: **Zeilen = tatsächliche** Klasse, **Spalten = vorhergesagte** Klasse.
|
||||||
|
|
||||||
|
> ⚠️ Achtung: Das genaue Layout variiert je nach Quelle (welche Klasse oben/links steht — in diesem Foliensatz sind sogar zwei verschiedene Anordnungen abgebildet). `sklearn.metrics.confusion_matrix` liefert für binär [0,1] die Reihenfolge `[[TN, FP], [FN, TP]]` (Labels aufsteigend sortiert). → immer Achsenbeschriftung prüfen, bevor man Zellen interpretiert.
|
||||||
|
|
||||||
|
**Nutzen:** detaillierte Fehleranalyse (nicht nur Gesamt-Accuracy), Modelloptimierung (Schwachstellen sichtbar machen), Modellvergleich, Basis für abgeleitete Metriken (Precision, Recall, F1).
|
||||||
|
|
||||||
|
> Warum nicht nur Accuracy? Bei **unausgeglichenen** Klassen ist Accuracy irreführend: immer „negativ" raten bei 99 % Negativen → 99 % Accuracy, aber 0 % der positiven Fälle erkannt. Darum Precision/Recall/F1.
|
||||||
|
|
||||||
|
## Precision
|
||||||
|
|
||||||
|
$$\text{Precision} = \frac{TP}{TP + FP} = \frac{TP}{\text{alle als positiv vorhergesagten}}$$
|
||||||
|
|
||||||
|
- *Wie viele der als positiv vorhergesagten Fälle sind wirklich positiv?*
|
||||||
|
- einsetzen, wenn **positive Vorhersagen genau** sein müssen (FP teuer; z.B. Spam-Filter: lieber Spam durchlassen als wichtige Mail fälschlich blocken)
|
||||||
|
- steigt, wenn die FP sinken
|
||||||
|
|
||||||
|
## Recall (Sensitivität)
|
||||||
|
|
||||||
|
$$\text{Recall} = \frac{TP}{TP + FN} = \frac{TP}{\text{alle tatsächlich positiven}}$$
|
||||||
|
|
||||||
|
- *Wie viele der tatsächlich positiven Fälle wurden erkannt?*
|
||||||
|
- einsetzen, wenn **FN teurer** sind als FP (z.B. Krankheitsdiagnose: kranke Person nicht übersehen)
|
||||||
|
- steigt, wenn die FN sinken
|
||||||
|
|
||||||
|
## Precision vs. Recall
|
||||||
|
|
||||||
|
- **Zielkonflikt** (Trade-off): mit steigender Precision sinkt i.d.R. der Recall — und umgekehrt.
|
||||||
|
- steuerbar über den Entscheidungs-Schwellenwert (Threshold) des Klassifikators.
|
||||||
|
|
||||||
|
## F1-Score
|
||||||
|
|
||||||
|
$$F_1 = 2 \cdot \frac{\text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}}$$
|
||||||
|
|
||||||
|
- **harmonisches Mittel** von Precision und Recall (nicht arithmetisch!) → bestraft Ungleichgewicht: ist *einer* der beiden klein, wird auch F1 klein.
|
||||||
|
- balanciert beide; besonders wertvoll bei **unausgeglichenen** Datensätzen.
|
||||||
|
|
||||||
|
## Praxis: Kreuzvalidierung (Stabilität)
|
||||||
|
|
||||||
|
```python
|
||||||
|
from sklearn.model_selection import cross_val_score
|
||||||
|
scores = cross_val_score(model, X, y, cv=kfold) # kfold default = 5
|
||||||
|
print("mean:", np.mean(scores), "std:", np.std(scores))
|
||||||
|
sns.boxplot(x=scores)
|
||||||
|
```
|
||||||
|
|
||||||
|
- `cross_val_score` gibt ein **Array** mit dem Score je Fold zurück und macht das Splitten **selbst** (kein manueller Train-Test-Split nötig).
|
||||||
|
- **mean** → durchschnittliche Performance.
|
||||||
|
- **std** → **Stabilität** des Learners: wie stark hängt die Performance von der zufälligen Datenaufteilung (random_state) ab.
|
||||||
|
- **kleine std = stabileres** Resultat der Methode.
|
||||||
|
|||||||
Reference in New Issue
Block a user