ML Atlas

Machine Learning von Grund auf · Lektion 1.2 · 3 von 33 fertigen Lektionen · 10 Min.

Daten, Merkmale, Labels und Aufteilung

Kurz gesagt

Ein Datensatz ist eine Tabelle aus Beispielen, Merkmalen und Labels. Warum die Testdaten verborgen bleiben müssen und warum ihre Größe zählt.

Aufwärmen Zwei Fragen aus früheren Lektionen. Eine Minute, und sie blockiert die Lektion nicht.
Aus Lektion 1.1: Was ist maschinelles Lernen? Ein Modell liegt bei diesen Tumordaten in etwa 60 % der Fälle richtig. Warum ist das nicht beeindruckend?

Antwort anzeigen

Richtige Antwort: Weil die Antwort „immer gutartig“ schon in fast zwei Dritteln der Fälle stimmt

Die meisten Tumoren im Datensatz sind gutartig, also muss ein Modell erst die triviale Mehrheitsantwort schlagen, bevor es nützlich ist.

Aus Lektion 1.1: Was ist maschinelles Lernen? Du passt eine Regel so lange an, bis sie bei jedem Trainingsbeispiel stimmt. Was sagt dir das über die nächste Patientin?

Antwort anzeigen

Richtige Antwort: Sehr wenig – nur ungesehene Daten zeigen, wie sie mit neuen Fällen klarkommt

Die Trainingsgenauigkeit misst die Passung an bekannte Fälle; nur zurückgehaltene Daten schätzen die Leistung bei neuen.

Wenn eine Lehrerin der Klasse genau die Fragen gibt, die in der Abschlussprüfung drankommen, und alle die volle Punktzahl erreichen – was hat die Prüfung dann gemessen? Das Gedächtnis für diese Fragen, sonst nichts. Maschinelles Lernen steht jedes Mal vor demselben Problem, und die Lösung ist überraschend einfach: Ein Teil der Fragen bleibt in der Schublade eingeschlossen. Probier es zuerst selbst aus, bevor du die Erklärung liest.

Erst vorhersagen, dann prüfen Dasselbe Modell, 20 verschiedene zufällige Aufteilungen (30 % der Biopsien im Test, also 171 Stück). Wie stark schwankt die Testgenauigkeit zwischen den Aufteilungen?
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: Deutlich: die schlechteste und die beste Aufteilung liegen mehrere Prozentpunkte auseinander

Bei 30 % im Test schwankt die Genauigkeit zwischen 90,1 % und 96,5 % (6,4 Punkte), obwohl Modell und Daten dieselben sind; nur welche Biopsien im Test landen, ändert sich. Ein einzelner Testwert ist also nicht die ganze Wahrheit.

Probier es aus

  • Stell den Regler für den Testanteil auf einen kleinen Wert und schieb dann den Seed-Regler durch mehrere Positionen. Beobachte, wie stark sich die Testgenauigkeit ändert, obwohl Modell und Daten gleich bleiben.
  • Stell jetzt den Testanteil auf einen großen Wert und wiederhole das Seed-Experiment. Springt die Testgenauigkeit stärker oder schwächer als vorher?
  • Lass den Seed fest und schieb den Testanteil von einem Ende zum anderen. Achte darauf, wie die Zahl der Trainingszeilen schrumpft, während die Testdaten wachsen.
  • Such den Seed mit der besten Testgenauigkeit – und frag dich dann, ob du diese Zahl berichten dürftest.

Die Idee in einfachen Worten

Fast jeder Datensatz in diesem Kurs ist eine Tabelle. Jede Zeile ist ein Beispiel: ein Tumor, eine Patientin, ein Passagier, ein Wein. Jede Spalte ist ein Merkmal (Feature): eine gemessene Eigenschaft wie ein Radius, ein Blutdruck, ein Alter oder ein Alkoholgehalt. Eine besondere Spalte enthält das Label – die Antwort, die das Modell vorhersagen soll, etwa „bösartig“ oder „überlebt“. Ein Modell ist eine Regel, die die Merkmale einer Zeile auf ihr Label abbildet.

Bevor gelernt wird, werden die Zeilen gemischt und aufgeteilt. Der größere Teil, die Trainingsdaten, ist das, woraus das Modell lernt. Der kleinere Teil, die Testdaten, wird weggeschlossen und erst ganz am Ende einmal benutzt, um abzuschätzen, wie das Modell bei Zeilen abschneidet, die es nie gesehen hat. Er spielt die Rolle der Fragen in der Schublade.

Stell dir eine Köchin vor, die eine neue Suppe entwickelt. Beim Kochen probiert sie ständig – das ist das Training. Aber um zu wissen, ob die Suppe den Gästen schmeckt, serviert sie sie ein paar Leuten, die sie noch nie probiert haben und keinen Grund haben, höflich zu sein. Deren Urteil ist der Testwert. Würde sie nur sich selbst fragen, fände sie die Suppe immer perfekt.

Warum es funktioniert

Die Testdaten sind nur deshalb nützlich, weil das Modell sie nie gesehen hat. Solange Trainings- und Testzeilen aus derselben Quelle stammen und zufällig aufgeteilt wurden, verhalten sich die Testzeilen wie künftige Fälle, und die Testgenauigkeit ist eine faire Schätzung der künftigen Genauigkeit.

Aber eben nur eine Schätzung – und diesen Teil hören Anfänger selten. Der Testwert hängt davon ab, welche Zeilen zufällig in den Testdaten gelandet sind. Misch die Daten mit einem anderen Zufallsstartwert (Seed), und du bekommst andere Testdaten und einen anderen Wert – mit genau demselben Modell und denselben Daten. Bei kleinen Testdaten kann der Wert spürbar springen, weil eine Handvoll ungewöhnlicher Zeilen den Prozentsatz stark beeinflusst. Die Statistik liefert eine grobe Größe für dieses Wackeln. Für eine Genauigkeit p, gemessen an n Testzeilen, beträgt der Standardfehler etwa

SE ≈ √(p · (1 − p) / n)

Viermal so viele Testzeilen halbieren das Wackeln also nur. Deshalb ist ein einzelner Testwert nie die ganze Wahrheit.

Dazu kommt ein Zielkonflikt. Jede Zeile, die du in die Testdaten steckst, ist eine Zeile, aus der das Modell nicht lernen kann. Sehr große Testdaten geben eine verlässliche Note für ein Modell, das aus zu wenig gelernt hat; winzige Testdaten geben einem gut trainierten Modell eine unzuverlässige Note. Üblich ist, zwischen einem Fünftel und einem Drittel der Zeilen für den Test zu reservieren, und die nächsten Lektionen zeigen geschicktere Auswege aus diesem Dilemma.

Häufiger Fehler

Der verlockendste Fehler ist, viele Aufteilungen auszuprobieren und die mit dem schönsten Testwert zu behalten. Dann wurden die Testdaten für eine Entscheidung benutzt, und der berichtete Wert ist zu optimistisch. Eine leisere Variante desselben Fehlers heißt Data Leakage (Datenleck): Informationen aus den Testzeilen sickern ins Training, etwa wenn man Mittelwerte zum Skalieren oder zum Auffüllen fehlender Werte auf der ganzen Tabelle berechnet, bevor man aufteilt. Die Regel ist streng: zuerst aufteilen, dann alles Weitere nur mit den Trainingszeilen erledigen.

Mit einer sauberen Aufteilung können wir endlich ein echtes Modell bauen. In der nächsten Lektion passen wir das einfachste an, das es gibt – eine Gerade durch eine Punktwolke.

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. Warum müssen die Testdaten bis zum Schluss unberührt bleiben?
Antwort anzeigen

Richtige Antwort: Weil ihr Wert nur dann etwas aussagt, wenn keine Entscheidung auf ihm beruhte

Sobald die Testdaten eine Wahl beeinflusst haben, ist ihr Wert kein ehrlicher Stellvertreter für künftige Daten mehr.

2. Du änderst nur den Zufallsstartwert der Aufteilung, und die Testgenauigkeit verschiebt sich. Was zeigt das?
Antwort anzeigen

Richtige Antwort: Der Testwert ist eine Schätzung und hängt von der Aufteilung der Zeilen ab

Andere Seeds liefern andere Testzeilen, also schwankt der Wert zufällig – umso mehr, je kleiner die Testdaten sind.

3. Was kostet es, die Testdaten sehr groß zu machen?
Antwort anzeigen

Richtige Antwort: Das Modell hat weniger Zeilen, aus denen es lernen kann

Jede Zeile, die in die Testdaten wandert, fehlt dem Modell beim Lernen, also bedeuten größere Testdaten ein schwächer trainiertes Modell.

Das Wichtigste

  • Ein Datensatz ist eine Tabelle: Zeilen sind Beispiele, Spalten sind Merkmale, eine Spalte ist das Label.
  • Zuerst aufteilen; das Modell lernt aus den Trainingsdaten und wird einmal auf den Testdaten benotet.
  • Ein Testwert ist eine Schätzung: Eine andere Zufallsaufteilung liefert eine andere Zahl, besonders bei wenigen Testzeilen.
  • Wer die Aufteilung mit dem besten Wert wählt oder Daten auf der ganzen Tabelle vorbereitet, lässt die Testdaten ins Training sickern.

Tiefer: Formel, Code, Praxis

Die Mathematik

Eine Testgenauigkeit ist der Durchschnitt von n Ergebnissen „richtig oder falsch“. Ist die wahre Genauigkeit p, schwankt der gemessene Wert von Aufteilung zu Aufteilung mit dem Standardfehler SE ≈ √(p · (1 − p) / n).

  • n ist die Anzahl der Test-Zeilen, nicht die Größe der ganzen Tabelle.
  • SE schrumpft mit √n: Viermal so viele Testzeilen halbieren ihn.
  • Er ist bei p = 0.5 am größten und wird kleiner, wenn p sich 0 oder 1 nähert.
  • Etwa zwei Drittel der Werte liegen innerhalb von einem SE um p, etwa 95 % innerhalb von zwei.
  • Dieser SE erfasst nur die Wahl der Testzeilen. Er sagt nichts über eine Verschiebung zwischen den Daten, die du hast, und den Daten, die dir später begegnen.
Im Code (Python)

Der Aufbau des Labs: logistische Regression auf den 10 „mean“-Merkmalen, 30 % der Biopsien im Testset (171 Zeilen), 20 verschiedene Aufteilungen:

import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

X, y = load_breast_cancer(return_X_y=True, as_frame=True)
X = X.filter(like="mean ")  # die 10 „mean“-Merkmale, wie im Lab
accs = []
for seed in range(20):  # dasselbe Modell, 20 verschiedene Aufteilungen
    Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, stratify=y, random_state=seed)
    model = make_pipeline(StandardScaler(), LogisticRegression()).fit(Xtr, ytr)
    accs.append(model.score(Xte, yte))
n, p = len(yte), float(np.mean(accs))
print(f"test rows: {n}")
print(f"test accuracy: min {min(accs):.1%}, max {max(accs):.1%}")
print(f"standard error: {np.sqrt(p * (1 - p) / n):.1%} (n={n}), {np.sqrt(p * (1 - p) / (4 * n)):.1%} (n={4 * n})")

Ausgabe

test rows: 171
test accuracy: min 90.6%, max 97.1%
standard error: 1.8% (n=171), 0.9% (n=684)

scikit-learn mischt anders als das Lab, deshalb weichen Minimum und Maximum leicht von den 90,1 % und 96,5 % des Labs ab. Die 684 ist hypothetisch: Sie bräuchte mehr Zeilen als die 569 der Daten und zeigt deshalb nur die Formel. Die Botschaft bleibt dieselbe: Der Wert schwankt um mehrere Punkte, obwohl Modell und Daten gleich bleiben, und vier Mal so viele Testzeilen halbieren den Standardfehler.

Für die Praxis
  • Teile zuerst auf, passe dann Scaler und Imputer nur auf den Trainingszeilen an. Eine Pipeline erledigt das für dich und hält die Testzeilen aus jedem angepassten Schritt heraus.
  • Lege random_state fest, damit sich ein Ergebnis wiederholen lässt, wähle ihn aber einmal und bevor du Werte siehst. Seeds auszuprobieren, bis einer gut aussieht, ist ein Blick auf das Testset.
  • Übergib bei Klassifikation stratify=y, damit eine seltene Klasse nicht aus einem kleinen Testset verschwindet.
  • Zeilen, die zusammengehören, müssen zusammenbleiben. Mehrere Zeilen derselben Patientin sollten alle auf dieselbe Seite, und Daten mit Zeitordnung teilt man nach der Zeit auf, nicht zufällig. Sonst leckt das Testset.
  • Nenne einen Wert immer zusammen mit der Testgröße, und zeige bei kleinen Daten die Streuung, indem du die Aufteilung wiederholst oder Kreuzvalidierung nutzt (Lektion 8).

Mehr im Atlas

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