Evaluation von ML-Modellen¶
Warum ist die Modellbewertung wichtig?¶
Die Evaluation von ML-Modellen stellt sicher, dass das Modell zuverlässig und generalisierbar ist.
Ein gut evaluiertes Modell verhindert Overfitting und hilft, die besten Algorithmen und Parameter auszuwählen.
Wichtige Metriken und Tools für Klassifikationsprobleme¶
Die einfachste Form der Klassifikation ist die binäre Klassifikation (binary classification) und besteht aus zwei Zuständen.
Beispiel Covid-Schnelltest: Wir wollen untersuchen, wie gut der Infektionsstatus eines Patienten durch Corona-Schnelltests wiedergespiegelt wird. Hier würde der Corona-Schnelltest als der Klassifikator von genau zwei Zuständen dienen: infiziert oder nicht-infiziert.
Aus diesen zwei Klassen können sich genau 4 Kombinationen ergeben, je nach dem, was das Modell vorhergesagt hat und ob das mit der Realität übereinstimmt:
- True Positive (TP):
Der Schnelltest klassifiziert die Person als infiziert (Positive) und ein anschließender PCR-Test bestätigt dieses Ergebnis (True prediction). Somit war der Schnelltest korrekt.
- False Positive (FP):
Der Schnelltest klassifiziert die Person als infiziert (Positive), jedoch ergibt ein anschließender PCR-Test, dass die Person nicht infiziert ist (False prediction).
- True Negative (TN):
Der Schnelltest klassifiziert die Person als nicht-infiziert (Negative) und die Person ist tatsächlich nicht infiziert (True prediction).
- False Negative (FN):
Der Corona-Schnelltest klassifiziert die Person als nicht-infiziert (Negative), jedoch ist die Person infiziert und sollte somit einen positiven Schnelltest haben (False prediction).
Konfusionsmatrix / Wahrheitsmatrix (Confusion Matrix)¶
siehe auch: confusion matrix IBM, Wahrheitsmatrix
Ein weiteres Tool, um diese 4 Kombinationen leicht sichtbar zu machen, ist die Konfusionsmatrix:
True Class ↓ / Predicted Class → |
Positive |
Negative |
|---|---|---|
Positive (Actual Positive) |
True Positive (TP) |
False Negative (FN) |
Negative (Actual Negative) |
False Positive (FP) |
True Negative (TN) |
Anhand unseres Corona-Schnelltest-Beispiels:
Nehmen wir an, wir haben 100 Personen für den Testdatensatz mit Corona-Schnelltests erfasst und die Ergebnisse wie folgt aufgeteilt:
True Class ↓ / Predicted Class → |
Positive |
Negative |
|---|---|---|
Positive (Actual Positive) |
60 (TP) |
20 (FN) |
Negative (Actual Negative) |
10 (FP) |
10 (TN) |
Daraus lässt sich folgendes „ablesen“:
- True Positive (TP) = 60:
60 Personen sind laut Schnelltest infiziert (Positive) und sind tatsächlich infiziert (True).
- False Positive (FP) = 10:
10 Personen sind laut Schnelltest infiziert (Positive), sind in Wirklichkeit aber nicht infiziert (False).
- True Negative (TN) = 10:
10 Personen sind laut Schnelltest nicht-infiziert (Negative), und sind in Wirklichkeit auch wirklich gesund (True).
- False Negative (FN) = 20:
20 Personen sind laut Schnelltest nicht-infiziert (Negative), sind aber tatsächlich infiziert (False).
Die Konfusionsmatrix hilft stark dabei festzustellen, welche Art des Fehlers beim Klassifikator häufig(er) vorkommt.
In unserem Beispiel ist der Corona-Schnelltest in 70 % der Fälle korrekt ((60 + 10) / 100), was erst mal kein schlechter Wert ist.
Jedoch kommt in 10 % (20 / 100) aller Fälle ein False Negative Fehler vor. Das bedeutet, dass in 10 % aller Fälle, die Person als gesund ausgewiesen wird, obwohl sie eigentlich krank und ansteckend ist.
Im Fall einer Viruserkrankung ist also nicht nur die Genauigkeit entscheidend, sondern vor allem die False Negative Rate.
Die wichtigsten (und meist genutzten) Metriken¶
In der Industrie werden aktuell für Klassifikationsprobleme vor allem folgende Metriken genutzt (basierend auf den oben genannten Konzepten):
Accuracy (Genauigkeit)¶
Prozentsatz der korrekten Vorhersagen:
Precision (Präzision)¶
Precision ist der Anteil der tatsächlich positiven Vorhersagen unter allen als positiv klassifizierten Instanzen:
Precision wird vor allem bevorzugt, wenn falsch-positive Fehler besonders kritisch sind (z.B. Spam-Erkennung).
Recall (Sensitivität)¶
Recall ist der Anteil der korrekten positiven Vorhersagen unter allen tatsächlichen positiven Fällen:
Recall ist eine wichtige Metrik, wenn es entscheidend ist, möglichst alle positiven Fälle zu erfassen (z.B. Krebsdiagnosen).
F1-Score¶
Der F1-Score ist das harmonische Mittel von Präzision und Recall, um ein ausgewogenes Maß zu erhalten:
Der F1-Score ist besonders nützlich bei unausgewogenen Datensätzen (engl.: imbalanced data sets).
False Negative Rate (FNR)¶
Die False Negative Rate (FNR) wird in der Business-Welt nicht so häufig verwendet, sondern vor allem in speziellen Domänen wie in unserem Beispiel der medizinischen Tests:
Die FNR ist also beim Evaluieren eines Tests einer hoch-ansteckenden Viruserkrankung ein wichtiger Indikator, da es fatale Konsequenzen haben könnte, wenn zu viele False Negatives ausgelassen werden.
Wichtige Metriken für Regressionsprobleme¶
Mean Squared Error, MSE (Mittlerer quadratischer Fehler)¶
Der MSE berechnet den Durchschnitt der quadrierten Fehler zwischen vorhergesagten und tatsächlichen Werten:
Somit bestraft der MSE große Fehler stärker als kleine Fehler.
Mean Absolute Error, MAE (Mittlerer absoluter Fehler)¶
Der MAE berechnet den Durchschnitt der absoluten Differenzen zwischen vorhergesagten und tatsächlichen Werten:
R²-Koeffizient (Bestimmtheitsmaß)¶
Zeigt, wie gut das Modell die Varianz der Zielvariable erklärt.
Wertebereich: 0 (keine Erklärung) bis 1 (perfekte Erklärung).
siehe auch: Bestimmtheitsmaß-Wiki
Praktische Anwendung: Evaluierung eines Modells in Python¶
Ein Beispiel zur Berechnung dieser Metriken mit scikit-learn:
1from sklearn.metrics import (
2 accuracy_score,
3 precision_score,
4 recall_score,
5 f1_score,
6)
7
8# Beispiel: Tatsächliche Labels und Vorhersagen
9true_labels = [1, 0, 1, 1, 0, 1, 0, 0, 1, 0]
10predicted_labels = [1, 0, 1, 0, 0, 1, 0, 1, 1, 0]
11
12# Berechnung der Metriken
13accuracy = accuracy_score(true_labels, predicted_labels)
14precision = precision_score(true_labels, predicted_labels)
15recall = recall_score(true_labels, predicted_labels)
16f1 = f1_score(true_labels, predicted_labels)
17
18print(
19 f"Accuracy: {accuracy}, Precision: {precision}, Recall: {recall}, F1-Score: {f1}"
20)