Menu
CoddyTech

Imputazione in una pipeline

Fa parte della sezione Apprendimento supervisionato del percorso Machine Learning di Coddy. Lezione 47 di 58.

I registri reali hanno lacune e la maggior parte dei modelli non le accetta. Un SimpleImputer riempie ogni lacuna con la media, la mediana o il valore più frequente della colonna.

Completa prima della divisione, e le righe di test contribuiscono a scegliere quel valore: una fuga di dati. Sette profondità d’immersione e un dato mancante:

Due copie di una colonna con 8 profondità d’immersione, le ultime due contrassegnate come righe di test e una cella con un dato mancante. A sinistra, completa e poi dividi: al dato mancante viene assegnato 21.3, la media di tutte le 7 profondità note, contando le righe di test: una fuga di dati. A destra, dividi e poi usa la pipeline: al dato mancante viene assegnato 18.0, la media delle sole righe di addestramento

In una pipeline, fit apprende i valori di riempimento solo dalle righe di addestramento:

from sklearn.impute import SimpleImputer

pipe = make_pipeline(SimpleImputer(strategy="median"), StandardScaler(), model)
pipe.fit(X_train, y_train)
print(pipe[0].statistics_)  # i valori di riempimento del primo passaggio

Per un registro di immersione (profondità, minuti, temperatura dell'acqua), stampa:

[19. 44. 21.]

Anche con le parole, i passaggi relativi ai numeri diventano una corsia del ColumnTransformer:

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

Sfida

Medio

Un servizio forestale prevede quali fulmini appiccano incendi, ma mancano alcune rilevazioni. Il codice iniziale suddivide wildfire.csv e legge una strategia, mean o median.

  1. Adatta una pipeline composta da un imputatore con quella strategia, uno scaler e una regressione logistica. Stampa la sua accuratezza sul test.
  2. Per ogni colonna, stampa il valore usato per il riempimento dalla pipeline e quello che si otterrebbe usando tutte le righe di X, con 1 cifra decimale.

Un'altra foresta, con 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

Nei casi in cui i due valori differiscono, riempire prima della suddivisione avrebbe permesso alle righe del test di influenzare i dati di addestramento.

Provalo tu

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

# Fulmini in una foresta secca: il fulmine ha provocato un incendio (1) oppure no (0)?
# Mancano alcune rilevazioni meteorologiche.
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()

# Scrivi il tuo codice qui sotto
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Apprendimento supervisionato

Esercitati da solo: Compilatore Python online