Menu
CoddyTech

Fehlende Werte in einer Pipeline imputieren

Teil des Abschnitts Überwachtes Lernen der Machine Learning-Journey von Coddy. Lektion 47 von 58.

In echten Protokollen gibt es Lücken, und die meisten Modelle können damit nicht umgehen. Ein SimpleImputer füllt jede Lücke mit dem Mittelwert, Median oder häufigsten Wert der jeweiligen Spalte.

Vor der Aufteilung auffüllen, und die Testzeilen helfen bei der Wahl dieses Werts: ein Leak. Sieben Tauchtiefen und eine Lücke:

Zwei Kopien einer Spalte mit 8 Tauchtiefen; die letzten beiden sind als Testzeilen markiert, und eine Zelle enthält eine Lücke. Links: erst auffüllen, dann aufteilen: Die Lücke erhält den Wert 21.3, den Mittelwert aller 7 bekannten Tiefen; die Testzeilen werden mitgezählt, ein Leak. Rechts: erst aufteilen, dann Pipeline: Die Lücke erhält den Wert 18.0, den Mittelwert nur der Trainingszeilen

In einer Pipeline lernt fit die Ersatzwerte ausschließlich aus den Trainingszeilen:

from sklearn.impute import SimpleImputer

pipe = make_pipeline(SimpleImputer(strategy="median"), StandardScaler(), model)
pipe.fit(X_train, y_train)
print(pipe[0].statistics_)  # die Auffüllwerte des ersten Schritts

Für ein Tauchprotokoll (Tiefe, Minuten, Wassertemperatur) wird Folgendes ausgegeben:

[19. 44. 21.]

Auch bei Wörtern werden die Zahlen-Schritte zu einer Spur des ColumnTransformer:

lane = make_pipeline(SimpleImputer(strategy="median"), StandardScaler())
("numbers", lane, ["depth_m", "minutes"])
challenge icon

Aufgabe

Mittel

Ein Forstdienst sagt voraus, welche Blitzeinschläge Brände auslösen, aber einige Messwerte fehlen. Der Starter-Code teilt wildfire.csv auf und liest eine Strategie ein: mean oder median.

  1. Trainiere eine Pipeline aus einem Imputer mit dieser Strategie, einem Skalierer und einer logistischen Regression. Gib ihre Testgenauigkeit aus.
  2. Gib für jede Spalte den Füllwert der Pipeline und den Wert aus, den alle Zeilen von X ergeben würden, auf 1 Dezimalstelle.

Ein weiterer Wald mit median:

Test accuracy: 0.840
humidity_pct: fill 46.0, all rows would give 46.0
wind_kmh: fill 29.0, all rows would give 32.0
temp_c: fill 25.0, all rows would give 26.0
days_without_rain: fill 23.0, all rows would give 23.0

Überall dort, wo die beiden Werte abweichen, hätten die Testzeilen beim Füllen vor der Aufteilung die Trainingsdaten beeinflusst.

Probier es selbst

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline

# Blitzeinschläge in einem trockenen Wald: Hat der Blitzeinschlag ein Feuer ausgelöst (1) oder nicht (0)?
# Einige Wetterdaten fehlen.
strikes = pd.read_csv("wildfire.csv")
columns = ["humidity_pct", "wind_kmh", "temp_c", "days_without_rain"]
X = strikes[columns]
y = strikes["fire"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
strategy = input()

# Schreibe deinen Code unten
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Überwachtes Lernen

Übe selbstständig: Online-Python-Compiler