Machine Learning von Grund auf · Lektion 5.6 · 31 von 33 fertigen Lektionen · 12 Min.
Welches Modell wann?
Kurz gesagt
Fünf Modelle, fünf Datensätze, 20 Aufteilungen. Kein Modell liegt überall vorn, und 0,3 Punkte können ein Remis sein: 10 gegen 7.
Aufwärmen Zwei Fragen aus früheren Lektionen. Eine Minute, und sie blockiert die Lektion nicht.
Du kennst jetzt fünf Modellfamilien: logistische Regression, k nächste Nachbarn (kNN), den Random Forest, Gradient Boosting und die SVM mit RBF-Kern. Welches nimmst du? Die ehrliche Antwort: das, das in der Validierung auf deinen Daten am besten abschneidet. Diese Lektion prüft, wie stark das Ergebnis von den Daten abhängt und wie man einen echten Unterschied von Rauschen unterscheidet. Wir bauen einen Modell-Zoo: jedes der fünf Modelle mit seinen Standardeinstellungen, ohne Tuning, auf fünf Datensätzen, und auf jedem Datensatz mit denselben 20 Aufteilungen. Jedes Mal gehen 75 % der Zeilen ins Lernen und 25 % in die Validierung.
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: Nein: Die SVM schlägt die Regression bei den Ziffern, verliert bei den Pinguinen
Nein. Bei den Ziffern ist die SVM auf 17 von 20 Aufteilungen öfter richtig als die logistische Regression, die Regression öfter als die SVM auf 3. Bei den Pinguinen ist die Regression auf 9 Aufteilungen öfter richtig, die SVM auf keiner, und 11 sind gleichauf. Den besten Mittelwert haben auf verschiedenen Datensätzen auch verschiedene Modelle, aber auf vier Datensätzen ist der Spitzenreiter höchstens auf 10 von 20 Aufteilungen öfter richtig als der Zweite. Wer dort vorn liegt, hängt weitgehend von den Aufteilungen ab.
Probier es aus
- Zum Start: Ziffern, kNN gegen die SVM. Der Abstand der Mittelwerte ist kleiner als die Streuung von kNN zwischen den Aufteilungen. Auf wie vielen der 20 Aufteilungen ist die SVM öfter richtig?
- Geh zu den Brusttumoren und vergleiche die SVM mit Gradient Boosting. Wie groß ist der Abstand der Mittelwerte, und wie teilen sich die Aufteilungen auf?
- Finde ein Modellpaar, bei dem eines bei den Ziffern vorn liegt und das andere bei den Pinguinen.
- Prüfe auf jedem Datensatz, wie weit die schlechteste und die beste Aufteilung eines Modells auseinanderliegen.
Wenn du es im Lab geprüft hast, geben wir dem, was du siehst, einen Namen.
Die Idee in einfachen Worten
Dasselbe Modell bekommt auf demselben Datensatz bei verschiedenen Aufteilungen verschiedene Ergebnisse, weil in die Validierung mal leichtere, mal schwerere Beispiele geraten. Bei den Brusttumoren erreicht die logistische Regression auf einzelnen Aufteilungen 89,4 % bis 96,5 %. Unterschiede zwischen Modellen sind oft viel kleiner. Eine Aufteilung reicht also nicht, um sie zu ordnen.
Besser vergleicht man Modelle paarweise: Auf derselben Aufteilung haben es beide gleich leicht oder gleich schwer. Wir zählen, auf wie vielen Aufteilungen jedes öfter richtig ist. Bei den Tumoren erreicht die SVM im Mittel 94,2 % und Gradient Boosting 93,9 %. Die SVM ist auf 10 Aufteilungen öfter richtig, Boosting auf 7, und 3 sind gleichauf. So ein Abstand von 0,3 Punkten ist ein Remis, kein Sieg. Es geht auch umgekehrt. Bei den Ziffern liegt die SVM nur 0,7 Punkte vor kNN, während das Ergebnis von kNN zwischen den Aufteilungen von 96,0 % bis 99,1 % springt. Trotzdem ist die SVM auf 16 von 20 Aufteilungen öfter richtig, kNN auf 2. Es zählt, ob sich der Vorsprung wiederholt, nicht, wie groß der Mittelwert ist.
Wann wiederholt sich ein Vorsprung? Wären beide Modelle gleich gut, wäre jede Aufteilung ohne Gleichstand wie ein Münzwurf. Eine Münze liefert 16 zu 2 seltener als in einer von 100 Serien, 10 zu 7 dagegen oft. Das Lab nennt einen Vorsprung wiederholt, wenn so ein Ergebnis seltener als in einer von 100 Serien vorkäme. Das ist der Vorzeichentest. Gleichstände belasten ihn nicht: Sie werden einfach nicht gezählt.
Am wichtigsten: Die Reihenfolge hängt von den Daten ab. Bei den Ziffern ist die SVM auf 17 von 20 Aufteilungen öfter richtig als die logistische Regression, die Regression öfter als die SVM auf 3. Bei den Pinguinen ist es umgekehrt: Die Regression ist auf 9 Aufteilungen öfter richtig, die SVM auf keiner, und 11 sind gleichauf. Beide Vorsprünge bestehen den Vorzeichentest. Bei den Ziffern ist die SVM auf mindestens 16 Aufteilungen öfter richtig als jedes der anderen Modelle.
All das gilt mit Standardeinstellungen, ohne Tuning, auf kleinen Datensätzen (150 bis 1797 Zeilen) mit nur numerischen Merkmalen. Es ist kein Urteil über die Modelle im Allgemeinen. Auf größeren Tabellen, mit Merkmalen verschiedener Art und nach dem Tuning, kann die Reihenfolge anders aussehen (Boosting behandelt Lektion 5.3). Der Schluss ist ein anderer: Eine Rangliste übernimmt man nicht aus fremden Tabellen, man prüft sie auf den eigenen Daten.
Auch den Spitzenreiter überschätzt man leicht. Nimm das Modell mit dem besten Mittelwert auf den Aufteilungen 1–10 und prüfe, wer auf den Aufteilungen 11–20 vorn liegt. Bei den Iris, den Weinen und den Pinguinen ist es dort schon ein anderes Modell. Liegen mehrere Modelle nah beieinander, entscheidet zu einem großen Teil das Rauschen, welches vorn landet, wie bei der Wahl der Einstellungen in Lektion 3.5.
Jak to policzono
- Daten: Iris (Fisher, 1936), Wine (Aeberhard und Forina, 1992), Breast Cancer Wisconsin (Wolberg et al., 1993; 10 „mean“-Messungen) und Digits (Alpaydin und Kaynak, 1998), alle von UCI unter der Lizenz CC BY 4.0; Palmer Penguins (Gorman et al., 2014; Horst et al., 2020; Lizenz CC0 1.0), 342 Pinguine mit 4 Körpermaßen.
- Modelle: Standardeinstellungen von scikit-learn ohne Tuning. Logistische Regression (C = 1), kNN (k = 5), Random Forest (100 Bäume), Gradient Boosting (100 Bäume, Lernrate 0,1, Tiefe 3), SVM mit RBF-Kern (C = 1). Regression, kNN und SVM bekommen Merkmale, die auf jeder Aufteilung nur mit dem Lernteil skaliert werden.
- Übereinstimmung mit scikit-learn auf denselben 20 Aufteilungen: Die SVM trifft auf jeder Aufteilung dieselben Zeilen, Regression und kNN weichen höchstens um 3 Zeilen pro Aufteilung ab. Die Bäume im Lab zerlegen jedes Merkmal in höchstens 32 Intervalle, scikit-learn baut exakte Bäume, daher sind die Unterschiede hier größer: Bei den Tumoren hat der Forest auf 3 von 20 Aufteilungen dasselbe Ergebnis, Boosting auf 4. Mit exakten Bäumen hat bei den Tumoren Boosting den besten Mittelwert, nicht die SVM. Die Schlüsse über Paare in dieser Lektion fallen in beiden Versionen gleich aus.
- Aufteilungen: 20 geschichtete Aufteilungen, 75 % zum Lernen und 25 % zur Validierung, für jedes Modell dieselben. Einen Test gibt es hier nicht. Alle 500 Ergebnisse hat der Code des Labs berechnet, und der Test rechnet sie neu nach. Der Vorzeichentest ist zweiseitig, auf den Aufteilungen ohne Gleichstand, mit einer Schwelle von 1 %.
Warum es funktioniert
Das „No-Free-Lunch“-Theorem (Wolpert, 1996) besagt, dass gemittelt über alle möglichen Aufgaben kein Lernalgorithmus besser ist als ein anderer. Ein Modell gewinnt nur, wenn seine Annahmen zu den konkreten Daten passen: gerade Grenzen zur logistischen Regression, ähnliche Nachbarn zu kNN, Schwellen auf einzelnen Merkmalen zu Bäumen. Deshalb ist die Wahl eines Modells eine Messung, kein Tabellenwissen.
Der paarweise Vergleich funktioniert, weil die Schwierigkeit einer Aufteilung beide Modelle zugleich trifft und sich in der Differenz aufhebt. Ein Vorbehalt: 20 Aufteilungen desselben Datensatzes teilen sich Zeilen, also sind es keine 20 unabhängigen Münzwürfe. Übliche statistische Tests auf solchen Ergebnissen sind oft zu selbstsicher (Dietterich, 1998). Darum ist die Schwelle streng, und ein wiederholter Vorsprung ist ein guter Hinweis, kein Beweis.
Ein Modell kann auch eigenen Zufall haben. Der Forest lost für jeden Baum Zeilen und Merkmale aus. Bei den Ziffern ist der Forest auf denselben 20 Aufteilungen mit dem Zufallsstartwert 1 auf 15 Aufteilungen öfter richtig als die Regression und auf 5 seltener, mit dem Startwert 4 auf 11 öfter und auf 9 seltener. Bei keinem Startwert von 1 bis 5 besteht dieser Vorsprung den Vorzeichentest. Darum stützen sich die Beispiele dieser Lektion auf Modelle ohne Zufall: Regression, kNN und SVM.
Der Code unten tut dasselbe in scikit-learn, auf anderen Aufteilungen und mit exakten Bäumen. Die Spitze ändert sich: Dort hat die SVM auf vier Datensätzen den besten Mittelwert und die logistische Regression bei den Pinguinen. Die Richtung der Paare dieser Lektion bleibt, aber nicht jeder Vorsprung besteht dort den Vorzeichentest. Ein weiterer Grund, Unterschiede im Rauschen nicht Sieg zu nennen.
Ein häufiger Fehler
Richtig oder falsch: „Ein Modell mit einem um 0,3 Punkte höheren Mittelwert ist besser.“ Falsch. Bei den Tumoren erreicht die SVM 94,2 % und Gradient Boosting 93,9 %, aber die SVM ist nur auf 10 von 20 Aufteilungen öfter richtig, Boosting auf 7. Im Code unten teilt sich dasselbe Paar die Aufteilungen 10 zu 7, und der Abstand der Mittelwerte ist 0,002.
Ein zweiter häufiger Fehler: „Nimm immer Boosting, zum Beispiel XGBoost.“ In diesem Zoo ist mit Standardeinstellungen bei den Weinen die logistische Regression auf 15 von 20 Aufteilungen öfter richtig als Gradient Boosting, Boosting öfter als sie auf 2. Das ist kein Urteil gegen Boosting, nur gegen eine Wahl ohne Validierung.
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
- Kein Modell liegt überall vorn: Die SVM schlägt die logistische Regression bei den Ziffern (17 Aufteilungen zu 3) und verliert bei den Pinguinen (9 zu 0).
- Die Aufteilung allein verschiebt das Ergebnis um ein paar Punkte, daher kann ein Abstand der Mittelwerte von 0,3 Punkten ein Remis sein (10 Aufteilungen zu 7).
- Vergleiche Modelle auf denselben Aufteilungen und zähle, auf wie vielen jedes gewinnt; auch ein kleiner, aber wiederholter Vorsprung zählt (die SVM vor kNN bei den Ziffern: 0,7 Punkte, 16 zu 2).
- Wähle per Validierung auf deinen Daten, nimm bei einem Remis das einfachere Modell und sieh dir den Test einmal an, am Ende.
Tiefer: Formel, Code, Praxis
Die Mathematik
Für die Aufteilungen k = 1, …, K ist die Differenz in einem Paar d_k = acc_A(k) − acc_B(k); wir betrachten den Mittelwert d̄ = (1/K) · Σ_k d_k und die Zahl der Aufteilungen mit d_k > 0.
Varianz der Differenz: Var(A − B) = Var(A) + Var(B) − 2 · Cov(A, B). Ist eine Aufteilung für beide Modelle zugleich schwer, ist die Kovarianz groß, also schwankt die Differenz viel weniger als jedes Ergebnis für sich.
Vorzeichentest: Modell A gewinnt auf w Aufteilungen, B auf l, Gleichstände zählen nicht. Bei gleich guten Modellen folgt die Zahl der Siege von A Bin(w + l, ½), und p = min(1, 2 · P(X ≤ min(w, l))). Für 16 zu 2 ergibt das p ≈ 0,001.
Im Code (Python)
Dasselbe Experiment in scikit-learn: fünf Modelle mit Standardeinstellungen auf fünf Datensätzen und 20 Aufteilungen, dann vier Paare Aufteilung für Aufteilung, mit dem Vorzeichentest.
import pandas as pd
from scipy.stats import binomtest
from sklearn.datasets import load_iris, load_wine, load_breast_cancer, load_digits
from sklearn.model_selection import StratifiedShuffleSplit, cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.svm import SVC
body = ["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g"]
peng = pd.read_csv("data/raw/penguins.csv").dropna(subset=body)
cancer = load_breast_cancer()
data = {"iris": load_iris(return_X_y=True), "wine": load_wine(return_X_y=True), "cancer": (cancer.data[:, :10], cancer.target),
"penguins": (peng[body].values, peng["species"].values), "digits": load_digits(return_X_y=True)}
# der Skalierer steckt in jeder Pipeline, also lernt er seine Mittelwerte nur aus dem Lernteil jeder Aufteilung
models = {"logistic": make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000)),
"kNN": make_pipeline(StandardScaler(), KNeighborsClassifier()),
"forest": RandomForestClassifier(random_state=0),
"boosting": GradientBoostingClassifier(random_state=0),
"SVM": make_pipeline(StandardScaler(), SVC())}
splits = StratifiedShuffleSplit(n_splits=20, test_size=0.25, random_state=0)
acc = {}
for name, (X, y) in data.items():
acc[name] = {m: cross_val_score(model, X, y, cv=splits) for m, model in models.items()}
row = " | ".join(f"{m} {a.mean():.3f}" for m, a in acc[name].items())
best = max(acc[name], key=lambda m: acc[name][m].mean())
print(f"{name:8s} {row} best: {best}")
# Vorzeichentest: nur die Aufteilungen ohne Gleichstand; bei gleich guten Modellen wäre jede ein Münzwurf
for name, a, b in [("digits", "SVM", "kNN"), ("digits", "SVM", "logistic"), ("penguins", "logistic", "SVM"), ("cancer", "SVM", "boosting")]:
d = acc[name][a] - acc[name][b]
win, lose = (d > 0).sum(), (d < 0).sum()
print(f"{name}: {a} beats {b} in {win} of 20 splits, loses in {lose}; sign test p = {binomtest(win, win + lose).pvalue:.3f}; mean difference {d.mean():.3f}")
Ausgabe
iris logistic 0.955 | kNN 0.945 | forest 0.949 | boosting 0.947 | SVM 0.959 best: SVM
wine logistic 0.982 | kNN 0.964 | forest 0.981 | boosting 0.946 | SVM 0.986 best: SVM
cancer logistic 0.931 | kNN 0.938 | forest 0.930 | boosting 0.939 | SVM 0.942 best: SVM
penguins logistic 0.988 | kNN 0.985 | forest 0.978 | boosting 0.973 | SVM 0.983 best: logistic
digits logistic 0.969 | kNN 0.974 | forest 0.975 | boosting 0.964 | SVM 0.979 best: SVM
digits: SVM beats kNN in 14 of 20 splits, loses in 4; sign test p = 0.031; mean difference 0.006
digits: SVM beats logistic in 17 of 20 splits, loses in 3; sign test p = 0.003; mean difference 0.010
penguins: logistic beats SVM in 7 of 20 splits, loses in 1; sign test p = 0.070; mean difference 0.005
cancer: SVM beats boosting in 10 of 20 splits, loses in 7; sign test p = 0.629; mean difference 0.002
Aufteilungen und Baum-Implementierung sind andere als im Lab, also auch die Spitze: Die SVM hat auf vier Datensätzen den besten Mittelwert, die logistische Regression bei den Pinguinen. Auch hier gewinnt kein Modell überall. Die Richtung der Paare aus der Lektion bleibt: Bei den Ziffern schlägt die SVM die Regression auf 17 von 20 Aufteilungen und kNN auf 14, bei den Pinguinen schlägt die Regression die SVM auf 7 und verliert auf 1. Den Vorzeichentest besteht hier nur das erste Paar (p = 0,003). Die anderen beiden haben dieselbe Richtung, aber auf diesen Aufteilungen zu wenige Siege, also lohnt es sich, einen Schluss aus einem Satz Aufteilungen an einem zweiten zu prüfen. SVM und Boosting teilen sich bei den Tumoren wieder die Aufteilungen 10 zu 7.
Notebook herunterladen (.ipynb). Öffne es in Jupyter oder lade es in Google Colab hoch; fehlende Daten lädt es selbst.
Für die Praxis
- Beginne mit einer Baseline (Lektion 1.3), dann nimm einige Modelle verschiedener Art: linear, Nachbarn, Bäume, ein Kern. Bewerte alle auf denselben Aufteilungen (
cross_validatemit einem einzigencv) und mit der Vorverarbeitung in einer Pipeline (Lektion 4.6). - Schau auf die Streuung und auf die Paare, nicht nur auf die Mittelwerte. Prüfe einen Vorsprung mit dem Vorzeichentest (
binomtestaus SciPy) auf den Aufteilungen ohne Gleichstand. Bei einem Remis nimm das Modell, das billiger zu pflegen oder leichter zu erklären ist. - Tune erst die Finalisten (Lektion 3.5). Standardeinstellungen können weit vom Besten entfernt sein, besonders bei Boosting und SVMs.
- Behandle Ranglisten „welches Modell wann“ aus dem Internet als Kandidatenliste für die Validierung, nicht als Urteil. Heb den Test fürs Ende auf und sieh ihn dir einmal an.
War das hilfreich?
Danke! Das hilft uns, besser zu werden.
Mehr im Atlas
Einträge der Enzyklopädie zu den Ideen dieser Lektion: