feature(notes): add l5 validation notes
This commit is contained in:
@@ -393,3 +393,70 @@ Untersuche den Einfluss des **Standardisierens der Features** auf:
|
||||
- Score
|
||||
|
||||
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