Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Einen Klassifikator ehrlich beurteilen

Nach dieser Lektion: Ich kann einen Klassifikator mit einer Verwechslungsmatrix, Präzision und Recall beurteilen, nicht nur mit der Genauigkeit.

Lektion, 60 Min.2 BefehleJupyterLab-Lab für Data Science: pandas, Matplotlib und scikit-learn im Browser

Sechsundneunzig Prozent, und nutzlos

Ein Spamfilter wird an 1000 Nachrichten getestet. Er liegt 960-mal richtig, also erreicht er 96 Prozent. Das Team freut sich.

Dann stellt jemand fest: Der Filter sagt zu jeder einzelnen Nachricht „kein Spam“. Vierzig der 1000 waren aber Spam. Ein einziger Wert hat den ganzen Fehler versteckt.

Am Ende dieser Lektion

Notiz

Ich kann einen Klassifikator mit einer Verwechslungsmatrix, Präzision und Recall beurteilen, nicht nur mit der Genauigkeit.

Schlüsselwörter

BegriffWas er bedeutet
Genauigkeitder Anteil aller Nachrichten, die das Modell richtig eingeordnet hat
Unausgewogenein Etikett kommt viel häufiger vor als das andere
Verwechslungsmatrixeine Tabelle der richtigen und falschen Antworten je Etikett
Präzisionvon den gemeldeten Nachrichten der Anteil, der wirklich Spam war
Recallvom echten Spam der Anteil, der gemeldet wurde
Schwellenwertder Wert, ab dem eine Nachricht gemeldet wird

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Genauigkeit: eine Zahl für zwei Fehlerarten

Die Genauigkeit zählt jede richtige Antwort gleich. Das passt, wenn die Etiketten etwa gleich häufig sind.

Es versagt bei einer unausgewogenen Tabelle. Sind 40 von 1000 Nachrichten Spam, liegt ein Modell, das nie „Spam“ sagt, 960-mal richtig. Es liegt zu 96 Prozent richtig und findet keinen Spam.

Ein Modell bewerten, das nie Spam sagt

Befehl
docker exec jupyter python3 -c "t=[1]*40+[0]*960; g=[0]*1000; print(sum(a==b for a,b in zip(t,g))/1000)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die vier Arten von Antworten zählen

Spam ist das, was wir suchen. Nennen Sie es positiv. Jede Nachricht landet in einem von vier Feldern.

Erkannt: Spam, gemeldet. Fehlalarm: kein Spam, gemeldet. Verpasst: Spam, nicht gemeldet. Richtig abgelehnt: kein Spam, nicht gemeldet. Die vier Zahlen zusammen sind die Verwechslungsmatrix.

Beispiel: ein Filter bei 1000 Nachrichten

Als Spam gemeldetNicht gemeldet
Wirklich Spam (40)Erkannt: 30Verpasst: 10
Kein Spam (960)Fehlalarme: 20Richtig abgelehnt: 940

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Matrix, Präzision und Recall ausgeben

Befehl
docker exec jupyter python3 -c "from sklearn.metrics import confusion_matrix, precision_score, recall_score; t=[1]*40+[0]*960; g=[1]*30+[0]*10+[1]*20+[0]*940; print(confusion_matrix(t,g)); print(round(precision_score(t,g),3), round(recall_score(t,g),3), (30+940)/1000)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Präzision und Recall fragen Verschiedenes

Die Präzision fragt: Wenn der Filter Spam sagt, wie oft hat er recht? Hier sind es 30 von den 50 gemeldeten, also 0.6.

Der Recall fragt: Wie viel vom echten Spam hat der Filter gefunden? Hier sind es 30 von 40, also 0.75. Die Genauigkeit lag bei 0.97. Der Filter ist besser als der, der nie Spam sagt, doch die Genauigkeit zeigt kaum, um wie viel.

Der Schwellenwert tauscht das eine gegen das andere

Die meisten Modelle geben einen Wert, und ein Schwellenwert macht daraus ein Etikett. Senken Sie ihn, werden mehr Nachrichten gemeldet. Man erkennt mehr Spam, meldet aber auch mehr gute Post.

Präzision und Recall ziehen also in verschiedene Richtungen, und ein Mensch muss wählen. Starten Sie den Code und sehen Sie die Zahlen wandern.

Vier Schwellen bei zehn Nachrichten

Code: python
# Zehn Nachrichten: der Wert, den ein Modell gab (0 bis 1), und ob es wirklich Spam war.
nachrichten = [
    (0.95, 1), (0.9, 1), (0.8, 0), (0.7, 1), (0.6, 0),
    (0.5, 1), (0.4, 0), (0.3, 0), (0.2, 0), (0.1, 0),
]
for schwelle in [0.9, 0.7, 0.5, 0.3]:
    erkannt = 0
    fehlalarme = 0
    verpasst = 0
    for nachricht in nachrichten:
        wert = nachricht[0]
        spam = nachricht[1]
        gemeldet = wert >= schwelle
        if gemeldet and spam == 1:
            erkannt = erkannt + 1
        if gemeldet and spam == 0:
            fehlalarme = fehlalarme + 1
        if not gemeldet and spam == 1:
            verpasst = verpasst + 1
    print("Schwelle", schwelle, "erkannt", erkannt, "Fehlalarme", fehlalarme, "verpasst", verpasst)
# Welche Schwelle würden Sie für ein Postfach wählen? Und für eine Bank?

Beispiel: was jede Schwelle ergibt

SchwelleErkanntFehlalarmeVerpasstPräzisionRecall
0.92021.00.5
0.73110.750.75
0.54200.6671.0
0.34400.51.0

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein häufiger Fehler

Warnung

Viele denken, die beste Schwelle sei die mit dem besten Wert bei einer einzigen Zahl. Ohne die Kosten zu kennen, gibt es keine beste Schwelle. Ein Postfach kann mit etwas Spam leben. Eine Betrugsprüfung kann sich nichts durchlassen.

Weiter: die Kosten jedes Fehlers

Angenommen, ein verpasster Spam kostet 1 Minute Lesezeit, und ein Fehlalarm kostet 5 Minuten Suche nach verlorener Post. Nehmen Sie die Tabelle der vier Schwellen.

Berechnen Sie die verlorenen Minuten bei jeder Schwelle. Welche Schwelle kostet am wenigsten? Würde sich das ändern, wenn ein Fehlalarm nur 1 Minute kostete?

Über dieses Lab und seinen Quellcode: JupyterLab-Lab für Data Science: pandas, Matplotlib und scikit-learn im Browser

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.