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.
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.
Wähle eine Antwort und wie sicher du bist.
Antworte, um das Labor freizuschalten.
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.
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.
Notebook herunterladen (.ipynb). Öffne es in Jupyter oder lade es in Google Colab hoch; fehlende Daten lädt es selbst.
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
TunedThresholdClassifierCVmit eigenemscoring(zum Beispiel übermake_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.
War das hilfreich?
Danke! Das hilft uns, besser zu werden.
Mehr im Atlas
Einträge der Enzyklopädie zu den Ideen dieser Lektion: