ML Atlas

Machine Learning von Grund auf · Lektion 2.6 · 13 von 33 fertigen Lektionen · 12 Min.

Metrik und Schwelle nach den Kosten der Fehler

Kurz gesagt

Die Schwelle folgt dem Preis der Fehler, nicht der Gewohnheit. Kostet ein Übersehen 10-mal so viel wie ein Fehlalarm, liegt die beste Schwelle nahe 0,09.

Aufwärmen Zwei Fragen aus früheren Lektionen. Eine Minute, und sie blockiert die Lektion nicht.
Aus Lektion 2.5: Unausgewogene Klassen Bei 8 bösartigen zum Lernen heben Klassengewichte die Sensitivität von 61,5 % auf 80,0 %. Was tun sie nicht?

Antwort anzeigen

Richtige Antwort: Sie fügen keine neuen Beispiele hinzu, also fehlt zu allen Daten noch etwas

Gewichte ändern nur, wie viel ein Fehler bei jeder Klasse kostet. Alle Daten mit Gewichten ergeben eine Sensitivität von 86,8 %, bei 8 bösartigen fehlen also 6,8 Prozentpunkte.

Aus Lektion 2.4: Kalibrierung: Heißt 0,8 auch 80 %? Was bedeutet es, dass ein Modell kalibriert ist?

Antwort anzeigen

Richtige Antwort: Dass unter den Fällen mit Score 0,8 etwa 80 % zur positiven Klasse gehören

Kalibrierung betrifft Prozente, nicht das Sortieren. Ein Zuverlässigkeitsdiagramm prüft das Band für Band: Ein kalibriertes Modell liegt auf der Diagonale.

In Lektion 2.3 haben die Kurven ein Menü von Schwellen gezeigt, und in Lektion 2.4 hast du geprüft, wann die Zahlen eines Modells echte Prozente sind. Jetzt wählst du aus diesem Menü eine Schwelle. Nicht aus Gewohnheit (0,5) und nicht für eine Lieblingsmetrik, sondern danach, was jeder Fehler wirklich kostet.

Erst vorhersagen, dann prüfen Einen bösartigen Tumor zu übersehen kostet 10-mal so viel wie ein Fehlalarm. Das Modell ist gut kalibriert. Wo liegt die günstigste Entscheidungsschwelle?
Wie sicher bist du?

Interaktives Labor

Dieses interaktive Labor läuft im Browser mit aktiviertem JavaScript. Der Text drumherum beschreibt, was es zeigt.

Antwort anzeigen

Richtige Antwort: Näher an 0,1, denn ein Alarm lohnt sich schon bei kleinem Risiko

Entscheidungstheorie: Ein Alarm lohnt sich, wenn p · 10 > (1 − p) · 1, also p > 1/11 ≈ 0,09. Im Lab kommt die Schwelle 0,09 auf Kosten von 125 und die übliche 0,5 auf ganze 254. Die günstigste Schwelle auf der Validierung, 0,06, kostet 111, aber nur auf denselben Scores, auf denen sie gewählt wurde.

Probier es aus

  • Lass die Preise bei 10 und 1 und schiebe die Schwelle von 0,5 nach unten. Wo sind die Kosten am niedrigsten? Wie viele Übersehene und wie viele Fehlalarme gibt es dann?
  • Setze beide Kosten auf 1. Wo liegt jetzt die günstigste Schwelle? Vergleiche sie mit der Schwelle mit dem besten F1.
  • Mach einen Fehlalarm teurer als ein Übersehen. Auf welcher Seite von 0,5 landet die günstigste Schwelle?
  • Geh zurück zu den Preisen 10 und 1 und vergleiche drei Kosten: die der günstigsten Schwelle, die der ehrlichen Prüfung und die der Schwelle aus der Theorie. Welche Wahl ist auf Biopsien am günstigsten, die für die Wahl nicht benutzt wurden?

Wenn du es im Lab geprüft hast, geben wir dem, was du siehst, einen Namen.

Die Idee in einfachen Worten

Jeder Fehler hat einen Preis. Ein übersehener bösartiger Tumor (FN) ist eine zu spät entdeckte Krankheit. Ein Fehlalarm (FP) ist eine unnötige Biopsie und Stress. Wenn du die Preise kennst, sind die Kosten einer Schwelle eine einfache Summe: Übersehene mal Preis eines Übersehens plus Fehlalarme mal Preis eines Alarms. Die beste Schwelle ist die mit der kleinsten Summe auf den Validierungsdaten.

Bei den Preisen 10 und 1 ergibt die Schwelle 0,5 24 Übersehene und 14 Fehlalarme, also Kosten von 254. Die günstigste Schwelle auf der Validierung ist 0,06: 2 Übersehene und 91 Alarme, Kosten 111. Diese Zahl ist allerdings zu optimistisch, denn die Schwelle wurde auf denselben Scores gewählt und bewertet (mehr unter „Warum es funktioniert“). Zum Vergleich: eine Biopsie für alle kostet 357, gar keine Biopsie 2120.

Ist das Modell kalibriert, lässt sich die Schwelle auch ohne Suchen berechnen. Eine Biopsie hat die Wahrscheinlichkeit p, bösartig zu sein. Ein Alarm kostet dann im Mittel (1 − p) · 1, kein Alarm p · 10. Ein Alarm lohnt sich, wenn p · 10 > (1 − p) · 1, also wenn p > 1/11 ≈ 0,09. Allgemein ist die Schwelle c_FP / (c_FP + c_FN). Das ist ein Ergebnis der Entscheidungstheorie, keine Messung: Es setzt voraus, dass die Zahlen des Modells echte Prozente sind (Lektion 2.4). Dieses Modell ist gut kalibriert (ECE 0,010). Im Lab kommt die Schwelle 0,09 auf Kosten von 125, weniger als die Hälfte der Kosten der Schwelle 0,5, und niemand hat sie auf diesen Daten abgestimmt.

Jak to policzono
  • Biopsien: Breast Cancer Wisconsin (Diagnostic), UCI, Lizenz CC BY 4.0. 569 Biopsien (212 bösartig, 357 gutartig), je 10 „mean“-Messwerte.
  • Scores aus 5-facher Kreuzvalidierung (StratifiedKFold(5) in scikit-learn): Jede Biopsie bewertet ein Modell, das sie nie gesehen hat.
  • Modell: Standardisierung und logistische Regression (C = 1). Schwellen von 0,01 bis 0,99 in Schritten von 0,01.
  • Preise der Fehler: ein Übersehen 10, ein Fehlalarm 1. Das ist ein Beispiel, keine medizinische Bewertung.

Warum es funktioniert

Lab und Theorie stimmen fast überein: Die günstigste Schwelle ergibt 0,06, die Theorie sagt 0,09. Der Unterschied kommt daher, dass 569 Biopsien wenig sind, während ein Übersehen so viel wiegt wie 10 Alarme, also springt die Kostenkurve. Ihr Boden ist flach und zackig: Die Schwelle 0,13 kostet genauso viel wie 0,06 (111), und 0,09 kostet 125. Auf 20 anderen Aufteilungen in Teile (Code unten) liegt die günstigste Schwelle zwischen 0,04 und 0,13, im Mittel bei 0,08. Die Theorie trifft die Mitte dieses Bereichs, und das Lab zeigt, wie breit der Boden ist.

Die günstigste Schwelle hat aber einen Haken. Das Lab probiert 99 Schwellen und nimmt die, die auf diesen 569 Biopsien am besten abschnitt, auch dank zufälliger Treffer. Die Kosten 111 sind also zu optimistisch: Das ist derselbe Fluch des Siegers wie beim Abstimmen (Lektion 3.5). Eine ehrliche Prüfung: Wähle die Schwelle auf 4/5 der Biopsien und berechne ihre Kosten auf dem übrigen 1/5, fünfmal. So gewählt kostet die Schwelle 141, mehr als die Schwelle aus der Theorie 0,09 (125), die niemand abgestimmt hat. Auf 20 anderen Aufteilungen liegen die ehrlichen Kosten der gewählten Schwelle zwischen 106 und 153 (im Mittel 129), die Schwelle aus der Theorie kostet zwischen 105 und 136 (im Mittel 117) und ist in 16 von 20 günstiger. Fazit: Bei einem kalibrierten Modell ist die Schwelle aus der Theorie ein starker, günstiger Ausgangspunkt, und eine auf denselben Daten abgestimmte Schwelle übertreibt die Ersparnis.

Die Richtung ist immer dieselbe: Je teurer ein Übersehen, desto niedriger die Schwelle, und je teurer ein Fehlalarm, desto höher. Bei gleichen Preisen ist die günstigste Schwelle 0,65 (Kosten 33). Kostet ein Alarm mehr als ein Übersehen, landet die günstigste Schwelle über 0,5.

Häufiger Fehler

Richtig oder falsch: „F1 ist eine gute Metrik für alles.“ Falsch. F1 = 2·TP / (2·TP + FN + FP), also gewichtet F1 ein Übersehen und einen Fehlalarm gleich, auch wenn ihre Preise verschieden sind. Im Lab ist die Schwelle mit dem besten F1 0,65 (F1 0,918). Bei den Preisen 10 und 1 kostet sie 276: mehr als die übliche 0,5 (254) und fast 2,5-mal so viel wie die günstigste Schwelle (111). Auf 20 anderen Aufteilungen kostet die Schwelle mit dem besten F1 das 1,6- bis 2,9-Fache der günstigsten.

Selbst bei gleichen Preisen ist F1 nicht dasselbe wie die Kosten. Im Lab fällt bei den Preisen 1 und 1 die günstigste Schwelle zufällig dorthin, wo F1 am besten ist (0,65), aber das ist keine Regel. Die Kosten bei gleichen Preisen sind einfach die Zahl der Fehler, F1 dagegen ist ein Bruch, in dem richtige „Nein“ (TN) gar nicht zählen. Auf 20 anderen Aufteilungen unterscheiden sich die beiden Schwellen in 3.

Wenn du die Preise der Fehler kennst, rechne die Kosten aus. Wenn nicht, frag danach, bevor du eine Metrik wählst: Die Wahl einer Metrik ist auch eine Entscheidung über Preise, nur eine unausgesprochene.

Quiz

Drei Fragen zur Selbstkontrolle. Wähle eine Antwort oder klappe die Lösung unter der Frage auf. Mit der Tastatur: Pfeiltasten wählen, Enter oder Leertaste bestätigt.

1. Ein Übersehen kostet 10, ein Fehlalarm 1, und das Modell ist kalibriert. Welche Schwelle folgt aus der Entscheidungstheorie?
Antwort anzeigen

Richtige Antwort: 1 / (1 + 10) ≈ 0,09, denn ein Alarm lohnt sich schon bei kleinem Risiko

Ein Alarm lohnt sich, wenn p · 10 > (1 − p) · 1, also p > 1/11. Im Lab kommt die Schwelle 0,09 auf Kosten von 125. Die günstigste Schwelle 0,06 kostet 111 nur auf den Scores, auf denen sie gewählt wurde.

2. Ein Spamfilter: Eine gute Mail im Spam kostet 5-mal so viel wie Spam im Posteingang. Wohin gehört die Schwelle für P(Spam)?
Antwort anzeigen

Richtige Antwort: Hoch, etwa 5 / (5 + 1) ≈ 0,83: In den Spam kommen nur sichere Fälle

Hier ist der Fehlalarm der teurere Fehler, also steigt die Schwelle: c_FP / (c_FP + c_FN) = 5/6 ≈ 0,83, wenn das Modell kalibriert ist. Im Lab schiebt ein teurerer Alarm die günstigste Schwelle ebenfalls über 0,5.

3. Das Modell hat sein bestes F1 bei der Schwelle 0,65. Ein Übersehen kostet 10, ein Alarm 1. Was ist mit dieser Schwelle?
Antwort anzeigen

Richtige Antwort: Sie ist teuer: Sie kostet 276, die günstigste Schwelle 0,06 dagegen 111

F1 gewichtet ein Übersehen und einen Fehlalarm gleich. Ist ein Übersehen 10-mal so teuer, kostet die Schwelle mit dem besten F1 sogar mehr als die übliche 0,5 (254).

Das Wichtigste

  • Die Schwelle wählst du nach den Preisen der Fehler: Die Kosten sind Übersehene mal ihr Preis plus Fehlalarme mal ihr Preis, berechnet auf der Validierung.
  • Für ein kalibriertes Modell liefert die Theorie die Schwelle c_FP / (c_FP + c_FN); bei den Preisen 10 und 1 sind das etwa 0,09. Das ist ein starker Ausgangspunkt: Eine auf denselben Daten abgestimmte Schwelle wirkt günstiger, als sie ist.
  • Teurere Übersehene senken die Schwelle, teurere Fehlalarme heben sie.
  • F1 gewichtet beide Fehler gleich und übergeht richtige „Nein“; kennst du die Preise, rechne die Kosten aus.

Tiefer: Formel, Code, Praxis

Die Mathematik

Kosten einer Schwelle t: K(t) = c_FN · FN(t) + c_FP · FP(t). Die günstigste Schwelle auf der Validierung ist t = argmin K(t). Ihre Kosten K(t), auf denselben Daten berechnet, sind zu optimistisch; die ehrlichen Kosten berechnest du auf Daten, die für die Wahl von t* nicht benutzt wurden.

Eine Biopsie ist mit Wahrscheinlichkeit p bösartig. Ein Alarm kostet im Mittel (1 − p) · c_FP, kein Alarm p · c_FN. Ein Alarm lohnt sich, wenn p · c_FN > (1 − p) · c_FP, also p > c_FP / (c_FP + c_FN). Für c_FN = 10 und c_FP = 1 ist das 1 / 11 ≈ 0,09.

F1 = 2·TP / (2·TP + FN + FP): FN und FP haben im Nenner dasselbe Gewicht 1.

Im Code (Python)

Dasselbe Experiment in scikit-learn: Scores aus der Kreuzvalidierung, die Kosten jeder Schwelle von 0,01 bis 0,99, die ehrlichen Kosten der gewählten Schwelle und dann dasselbe auf 20 anderen Aufteilungen in Teile.

import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import StratifiedKFold, cross_val_predict
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import f1_score

X, y = load_breast_cancer(return_X_y=True)
X, y = X[:, :10], 1 - y  # die 10 „mean“-Messwerte, wie im Lab; 1 = bösartig
model = make_pipeline(StandardScaler(), LogisticRegression())
t = np.arange(1, 100) / 100  # Schwellen 0.01 ... 0.99, wie im Lab
def costs(p, i=slice(None), c_fn=10, c_fp=1):  # ein Übersehen kostet 10, ein Fehlalarm 1; i = welche Biopsien
    return np.array([c_fn * ((p[i] < s) & (y[i] == 1)).sum() + c_fp * ((p[i] >= s) & (y[i] == 0)).sum() for s in t])
def scores(cv):  # jede Biopsie bewertet ein Modell, das sie nie gesehen hat
    return cross_val_predict(model, X, y, cv=cv, method="predict_proba")[:, 1]
def held_out(p, cv):  # günstigste Schwelle auf 4/5 der Biopsien gewählt, Kosten auf dem übrigen 1/5, fünfmal
    return sum(costs(p, b)[costs(p, a).argmin()] for a, b in cv.split(X, y))
p = scores(StratifiedKFold(5))
c, f1 = costs(p), np.array([f1_score(y, p >= s) for s in t])
print(f"cheapest threshold {t[c.argmin()]:.2f} (cost {c.min()}); theory 1/11 = {1 / 11:.2f} (cost {c[8]}); 0.5 costs {c[49]}; best F1 at {t[f1.argmax()]:.2f} costs {c[f1.argmax()]}")
print(f"picked on 4/5, priced on the other 1/5: {held_out(p, StratifiedKFold(5))}; theory 1/11: {c[8]}")
r = []
for s in range(20):  # 20 andere Aufteilungen in 5 Teile
    cv = StratifiedKFold(5, shuffle=True, random_state=s)
    q = scores(cv)
    cq, fq = costs(q), np.array([f1_score(y, q >= u) for u in t])
    r.append((t[cq.argmin()], cq[fq.argmax()] / cq.min(), cq[49] / cq.min(), held_out(q, cv), cq[8], costs(q, c_fn=1).argmin() != fq.argmax()))
r = np.array(r)
print(f"20 other cuts: cheapest threshold {r[:, 0].min():.2f} to {r[:, 0].max():.2f} (mean {r[:, 0].mean():.2f}); best F1 costs {r[:, 1].min():.1f} to {r[:, 1].max():.1f} times the cheapest, 0.5 costs {r[:, 2].min():.1f} to {r[:, 2].max():.1f} times")
print(f"20 other cuts, held out: the picked threshold costs {r[:, 3].min():.0f} to {r[:, 3].max():.0f} (mean {r[:, 3].mean():.0f}), theory 1/11 costs {r[:, 4].min():.0f} to {r[:, 4].max():.0f} (mean {r[:, 4].mean():.0f}); theory is cheaper in {(r[:, 4] < r[:, 3]).sum():.0f} of 20; at equal prices the cheapest and the best-F1 threshold differ in {r[:, 5].sum():.0f} of 20")

Ausgabe

cheapest threshold 0.06 (cost 111); theory 1/11 = 0.09 (cost 125); 0.5 costs 254; best F1 at 0.65 costs 276
picked on 4/5, priced on the other 1/5: 141; theory 1/11: 125
20 other cuts: cheapest threshold 0.04 to 0.13 (mean 0.08); best F1 costs 1.6 to 2.9 times the cheapest, 0.5 costs 2.0 to 2.5 times
20 other cuts, held out: the picked threshold costs 106 to 153 (mean 129), theory 1/11 costs 105 to 136 (mean 117); theory is cheaper in 16 of 20; at equal prices the cheapest and the best-F1 threshold differ in 3 of 20

Mit der Aufteilung StratifiedKFold(5) sind die Zahlen die des Labs: günstigste Schwelle 0,06 (Kosten 111), Theorie 0,09 (125), die Schwelle 0,5 kostet 254 und die mit dem besten F1 276. Auf 20 anderen Aufteilungen liegt die günstigste Schwelle zwischen 0,04 und 0,13, im Mittel bei 0,08, und die übliche 0,5 kostet das 2,0- bis 2,5-Fache der günstigsten. Die auf 4/5 der Biopsien gewählte und auf dem übrigen 1/5 bewertete Schwelle kostet 141, wie im Lab. Auf 20 anderen Aufteilungen kostet eine solche Wahl zwischen 106 und 153 (im Mittel 129), die Schwelle aus der Theorie zwischen 105 und 136 (im Mittel 117), und die Theorie ist in 16 von 20 günstiger. Bei gleichen Preisen unterscheiden sich die günstigste Schwelle und die mit dem besten F1 in 3 von 20 Aufteilungen.

Für die Praxis
  • Lege die Preise der Fehler mit den Menschen fest, die ihre Folgen tragen (eine Ärztin, ein Risikoteam), bevor du die Ergebnisse des Modells siehst. Sonst wählt man leicht Preise, die zu einer Schwelle passen, die einem schon gefällt.
  • In scikit-learn stimmt TunedThresholdClassifierCV mit eigenem scoring (zum Beispiel über make_scorer) die Schwelle auf Kosten ab. Eine Schwelle wendest du selbst so an: predict_proba(X)[:, 1] >= t.
  • Stimme die Schwelle auf der Validierung ab und prüfe ihre Kosten auf Daten, die du für die Wahl nicht benutzt hast (dem Test oder einem zurückgelegten Teil wie im Lab). Nenne die Kosten neben zwei einfachen Vergleichspunkten: „alle zur Biopsie“ und „niemand“.
  • Verwende die Formel c_FP / (c_FP + c_FN) nur für ein kalibriertes Modell (Lektion 2.4). Ist das Modell übertrieben sicher, suche die Schwelle auf der Kostenkurve.

Mehr im Atlas

Einträge der Enzyklopädie zu den Ideen dieser Lektion: