Menu
CoddyTech

Uzupełnianie braków w potoku

Część sekcji Uczenie nadzorowane ścieżki Machine Learning w Coddy. Lekcja 47 z 58.

Rzeczywiste logi mają braki, a większość modeli ich nie akceptuje. SimpleImputer wypełnia każdy brak średnią, medianą lub najczęściej występującą wartością w danej kolumnie.

Uzupełnianie przed podziałem, a wiersze testowe pomagają wybrać tę wartość: wyciek. Siedem głębokości nurkowania i jedna luka:

Dwie kopie kolumny zawierającej 8 głębokości nurkowania, z których dwie ostatnie oznaczono jako wiersze testowe, a jedna komórka zawiera lukę. Po lewej: uzupełnij, a potem podziel — luka otrzymuje wartość 21.3, czyli średnią ze wszystkich 7 znanych głębokości, z uwzględnieniem wierszy testowych; to wyciek. Po prawej: podziel, a potem użyj potoku — luka otrzymuje wartość 18.0, czyli średnią wyłącznie z wierszy treningowych

W potoku fit uczy się wartości uzupełniających wyłącznie na podstawie wierszy treningowych:

from sklearn.impute import SimpleImputer

pipe = make_pipeline(SimpleImputer(strategy="median"), StandardScaler(), model)
pipe.fit(X_train, y_train)
print(pipe[0].statistics_)  # wartości używane do uzupełniania braków w pierwszym kroku

W przypadku dziennika nurkowania (głębokość, minuty, temperatura wody) wyświetla:

[19. 44. 21.]

Również w przypadku słów kroki dla liczb stają się jednym torem w ColumnTransformer:

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

Wyzwanie

Średni

Służby leśne przewidują, które uderzenia pioruna wywołują pożary, ale brakuje niektórych odczytów. Kod startowy dzieli dane z wildfire.csv i odczytuje strategię: mean lub median.

  1. Dopasuj potok składający się z imputera używającego tej strategii, skalera i regresji logistycznej. Wyświetl jego dokładność na zbiorze testowym.
  2. Dla każdej kolumny wyświetl wartość uzupełnienia z potoku oraz wartość, jaką dałyby wszystkie wiersze X, z dokładnością do 1 miejsca po przecinku.

Inny las, ze strategią 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

Wszędzie tam, gdzie te wartości się różnią, uzupełnienie danych przed podziałem sprawiłoby, że wiersze testowe wpłynęłyby na dane treningowe.

Spróbuj swoich sił

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

# Uderzenia piorunów w suchym lesie: czy uderzenie wywołało pożar (1), czy nie (0)?
# Brakuje niektórych odczytów pogodowych.
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()

# Napisz swój kod poniżej
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Uczenie nadzorowane

Poćwicz samodzielnie: Kompilator Python online