Menu
CoddyTech

Imputación en una canalización

Parte de la sección Aprendizaje supervisado del Journey de Machine Learning de Coddy. Lección 47 de 58.

Los registros reales tienen huecos, y la mayoría de los modelos no los aceptan. SimpleImputer rellena cada hueco con la media, la mediana o el valor más frecuente de su columna.

Rellena antes de dividir, y las filas de prueba ayudan a elegir ese valor: una filtración. Siete profundidades de inmersión y un espacio vacío:

Dos copias de una columna con 8 profundidades de inmersión; las dos últimas están marcadas como filas de prueba y una celda está vacía. A la izquierda, rellenar y después dividir: el espacio vacío recibe 21.3, la media de las 7 profundidades conocidas, incluidas las filas de prueba; una filtración. A la derecha, dividir y después aplicar el pipeline: el espacio vacío recibe 18.0, la media solo de las filas de entrenamiento

En una canalización, fit aprende los valores de relleno solo a partir de las filas de entrenamiento:

from sklearn.impute import SimpleImputer

pipe = make_pipeline(SimpleImputer(strategy="median"), StandardScaler(), model)
pipe.fit(X_train, y_train)
print(pipe[0].statistics_)  # los valores de relleno del primer paso

Para un registro de inmersión (profundidad, minutos, temperatura del agua), esto imprime:

[19. 44. 21.]

También con palabras, los pasos de los números se convierten en un carril del ColumnTransformer:

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

Desafío

Intermedio

Un servicio forestal predice qué rayos provocan incendios, pero faltan algunas mediciones. El código inicial divide wildfire.csv y lee una estrategia, mean o median.

  1. Ajusta una canalización con un imputador que use esa estrategia, un escalador y una regresión logística. Imprime su precisión de prueba.
  2. Para cada columna, imprime el valor de relleno de la canalización y el que se obtendría usando todas las filas de X, con 1 decimal.

Otro bosque, 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

Dondequiera que los dos valores difieran, rellenar antes de la división habría permitido que las filas de prueba influyeran en los datos de entrenamiento.

Pruébalo tú mismo

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

# Rayos en un bosque seco: ¿alguno provocó un incendio (1) o no (0)?
# Faltan algunas mediciones meteorológicas.
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()

# Escribe tu código a continuación
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Aprendizaje supervisado

Practica por tu cuenta: Compilador de Python online