Menu
CoddyTech

Imputação em um pipeline

Parte da seção Aprendizado supervisionado do Journey de Machine Learning da Coddy. Lição 47 de 58.

Registros reais têm lacunas, e a maioria dos modelos não aceita esses dados. Um SimpleImputer preenche cada lacuna com a média, a mediana ou o valor mais frequente da coluna.

Preencha antes da divisão, e as linhas de teste ajudam a escolher esse valor: um vazamento. Sete profundidades de mergulho e uma lacuna:

Duas cópias de uma coluna com 8 profundidades de mergulho; as duas últimas estão marcadas como linhas de teste, e uma célula é uma lacuna. À esquerda, preencher e depois dividir: a lacuna recebe 21.3, a média de todas as 7 profundidades conhecidas, incluindo as linhas de teste, um vazamento. À direita, dividir e depois usar o pipeline: a lacuna recebe 18.0, a média apenas das linhas de treinamento

Em um pipeline, fit aprende os preenchimentos usando apenas as linhas de treinamento:

from sklearn.impute import SimpleImputer

pipe = make_pipeline(SimpleImputer(strategy="median"), StandardScaler(), model)
pipe.fit(X_train, y_train)
print(pipe[0].statistics_)  # os valores de preenchimento da primeira etapa

Para um registro de mergulho (profundidade, minutos, temperatura da água), isto exibe:

[19. 44. 21.]

Com palavras também, as etapas numéricas se tornam uma faixa do ColumnTransformer:

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

Desafio

Médio

Um serviço florestal prevê quais descargas elétricas iniciam incêndios, mas algumas medições estão ausentes. O código inicial divide wildfire.csv e lê uma estratégia, mean ou median.

  1. Ajuste um pipeline com um imputador que use essa estratégia, um escalonador e uma regressão logística. Imprima a acurácia no conjunto de teste.
  2. Para cada coluna, imprima o valor de preenchimento do pipeline e o que todas as linhas de X produziriam, com 1 casa decimal.

Outra floresta, com 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

Onde os dois diferem, preencher antes da divisão teria permitido que as linhas de teste influenciassem os dados de treinamento.

Experimente você mesmo

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

# Descargas elétricas em uma floresta seca: a descarga iniciou um incêndio (1) ou não (0)?
# Algumas medições meteorológicas estão ausentes.
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()

# Escreva seu código abaixo
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Aprendizado supervisionado

Pratique por conta própria: Compilador de Python online