Ein zu guter Wert
Ein Team testet ein Modell mit zurückgehaltenen Zeilen. Es heißt, das Modell liegt neunmal von zehn richtig. Im Einsatz liegt es siebenmal von zehn richtig.
Am Modell war nichts falsch. Die Testzeilen waren nicht wirklich neu. Wenn ein Wert zu gut aussieht, fragen Sie zuerst: Was hat das Modell vielleicht schon gesehen?
Am Ende dieser Lektion
Notiz
Ich kann einen Testsatz sauber halten und erkennen, wenn Information in ihn geflossen ist.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Testsatz | zurückgehaltene Zeilen, die man nur einmal ansieht, ganz am Ende |
| Validierungssatz | Zeilen, mit denen man zwischen Modellen und Einstellungen wählt |
| Datenleck | Information aus dem Test oder aus der Antwort erreicht das Modell vor dem Test |
| Duplikat | eine Zeile, die mehrfach vorkommt |
| Basislinie | der Wert eines sehr einfachen Ratens, zum Vergleichen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Drei Sätze, drei Aufgaben
In der letzten Lektion haben Sie einen Validierungssatz zurückgehalten. Sie haben ihn oft angesehen, um zu entscheiden, wann man stoppt und welche Einstellungen man nimmt.
Dadurch ist er bei jedem Blick ein wenig weniger neu. Darum hält ein sorgfältiges Team einen dritten Satz zurück, den Testsatz. Er wird nur einmal benutzt, am Ende, für den Wert, den man meldet.
Beispiel: ein Jahr in drei Sätzen
| Satz | Anteil | Tage | Wofür |
|---|---|---|---|
| Trainingssatz | 60 Prozent | 219 | Die Gewichte einstellen |
| Validierungssatz | 20 Prozent | 73 | Ein Modell und seine Einstellungen wählen |
| Testsatz | 20 Prozent | 73 | Der eine ehrliche Wert am Ende |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Die drei Größen ausrechnen
docker exec jupyter python3 -c "print(int(365 * 0.6), int(365 * 0.2), 365 - int(365 * 0.6) - int(365 * 0.2))"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Datenleck: der Test ist nicht wirklich neu
Ein Datenleck ist jeder Weg, auf dem das Modell Testinformation vor dem Test sieht. Das einfachste ist ein Duplikat: dieselbe Zeile im Trainingssatz und im Testsatz.
Ein Modell, das sich nur Zeilen merkt, sieht dann ausgezeichnet aus. Starten Sie den Code und sehen Sie es mit einem Modell, das nichts tut außer sich zu merken.
Ein Modell, das sich nur etwas merkt
# Acht Tage: (Temperatur, Regen) und ob der Tag voll oder ruhig war.
tage = [
((3, 0), "ruhig"), ((8, 0), "voll"), ((12, 2), "ruhig"), ((15, 0), "voll"),
((18, 0), "voll"), ((9, 5), "ruhig"), ((21, 0), "voll"), ((6, 3), "ruhig"),
]
training = tage[:6]
neu = tage[6:]
kopien = tage[:2] + tage[6:]
def auswendiglerner(tag):
# Merkt sich jeden Trainingstag genau. Ein unbekannter Tag bekommt "ruhig".
for bekannt, etikett in training:
if bekannt == tag:
return etikett
return "ruhig"
def punktzahl(zeilen):
richtig = 0
for tag, etikett in zeilen:
if auswendiglerner(tag) == etikett:
richtig = richtig + 1
return richtig / len(zeilen)
print("auf den eigenen Trainingstagen:", punktzahl(training))
print("auf zwei neuen Tagen:", punktzahl(neu))
print("auf zwei Kopien und zwei neuen Tagen:", punktzahl(kopien))
# Welcher Punktzahl würden Sie glauben? Ändern Sie einen neuen Tag und starten Sie erneut.
Derselbe Test an einer echten Tabelle
Jetzt dieselbe Idee mit den Fahrradausleihen des Labs. Ein Nächster-Nachbar-Modell antwortet mit dem Etikett des nächsten bekannten Tages, es ist also fast ein Auswendiglerner. Ein belebter Tag hat 300 Ausleihen oder mehr.
Schreiben Sie zuerst ein kleines Skript ins Lab. Es nimmt ein Wort: ehrlich, doppelt oder antwort.
Das Skript ins Lab schreiben
docker exec jupyter sh -c "printf '%s\n' 'import sys' 'import pandas as pd' 'from sklearn.model_selection import train_test_split' 'from sklearn.neighbors import KNeighborsClassifier' '' 'hires = pd.read_csv(\"hires.csv\")' 'art = sys.argv[1]' 'if art == \"doppelt\":' ' hires = pd.concat([hires, hires], ignore_index=True)' 'spalten = [\"temp_c\", \"rain_mm\"]' 'if art == \"antwort\":' ' spalten = spalten + [\"hires\"]' 'etikett = hires[\"hires\"] >= 300' 'X_lern, X_test, y_lern, y_test = train_test_split(hires[spalten], etikett, test_size=0.25, random_state=1)' 'modell = KNeighborsClassifier(n_neighbors=1).fit(X_lern, y_lern)' 'print(art, \"gelernt:\", round(modell.score(X_lern, y_lern), 3), \"zurückgehalten:\", round(modell.score(X_test, y_test), 3))' > steps/leck.py"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Es ehrlich starten
docker exec jupyter python3 steps/leck.py ehrlichHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Jeden Tag zweimal schreiben, dann trennen
docker exec jupyter python3 steps/leck.py doppeltHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Spalte, die die Antwort verrät
Das andere häufige Leck ist eine Spalte, die die Antwort enthält oder etwas, das man erst hinterher weiß. Eine Rückerstattungs-Markierung in einer Tabelle, die Rückerstattungen vorhersagt, ist so eine. Eine Summe, die nach dem Ereignis gebildet wird, auch.
Im Lab ist hires die Zahl, aus der das Etikett gemacht wird. Nehmen Sie sie unter die Eingaben und sehen Sie nach.
Dem Modell die Spalte hires geben
docker exec jupyter python3 steps/leck.py antwortHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, ein hoher Wert beweise ein gutes Modell. Er kann nur beweisen, dass der Test leicht war. Ein perfekter Wert auf zurückgehaltenen Zeilen ist ein Grund, nach einem Leck zu suchen, nicht zu feiern.
Beispiel: drei Lecks und ihre Kontrollen
| Was passiert ist | Warum es leckt | Wie man es prüft |
|---|---|---|
| Jeder Tag zweimal geschrieben, dann getrennt | Eine Testzeile hat einen Zwilling im Training | Die Testzeilen zählen, die auch im Training stehen |
| Die Spalte hires sagt ein Etikett voraus, das aus hires gemacht ist | Die Eingabe enthält die Antwort | Von jeder Spalte fragen: Ist sie vor der Antwort bekannt? |
| Zehn Modelle probiert, den besten Testwert gemeldet | Der Testsatz hat zum Wählen gedient | Mit der Validierung wählen, einmal testen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Weiter: das Leck in Ihrem Notebook
Nehmen Sie die hires.csv des Labs und ein Modell Ihrer Wahl. Notieren Sie den Wert auf den gelernten und auf den zurückgehaltenen Tagen.
Fügen Sie dann eine Spalte hinzu, die Ihrer Meinung nach leckt, und starten Sie erneut. Wie weit bewegt sich der Wert? Schreiben Sie einen Satz: Warum gäbe es diese Spalte nicht an dem Tag, an dem Sie die Vorhersage wirklich brauchen?