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
| Begriff | Was er bedeutet |
|---|---|
| Genauigkeit | der Anteil aller Nachrichten, die das Modell richtig eingeordnet hat |
| Unausgewogen | ein Etikett kommt viel häufiger vor als das andere |
| Verwechslungsmatrix | eine Tabelle der richtigen und falschen Antworten je Etikett |
| Präzision | von den gemeldeten Nachrichten der Anteil, der wirklich Spam war |
| Recall | vom echten Spam der Anteil, der gemeldet wurde |
| Schwellenwert | der 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
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 gemeldet | Nicht gemeldet | |
|---|---|---|
| Wirklich Spam (40) | Erkannt: 30 | Verpasst: 10 |
| Kein Spam (960) | Fehlalarme: 20 | Richtig abgelehnt: 940 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Matrix, Präzision und Recall ausgeben
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
# 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
| Schwelle | Erkannt | Fehlalarme | Verpasst | Präzision | Recall |
|---|---|---|---|---|---|
| 0.9 | 2 | 0 | 2 | 1.0 | 0.5 |
| 0.7 | 3 | 1 | 1 | 0.75 | 0.75 |
| 0.5 | 4 | 2 | 0 | 0.667 | 1.0 |
| 0.3 | 4 | 4 | 0 | 0.5 | 1.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?