Imputador Iterativo Scikit-Learn

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Neste laboratório, aprenderemos a utilizar a classe IterativeImputer do Scikit-Learn para imputar valores ausentes num conjunto de dados. Compararemos diferentes estimadores para verificar qual é o melhor para o IterativeImputer quando se utiliza um estimador BayesianRidge no conjunto de dados de habitação da Califórnia com um único valor removido aleatoriamente de cada linha.

Dicas da Máquina Virtual

Após o arranque da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.

Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante o aprendizado, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos o problema rapidamente para si.

Importar Bibliotecas

Primeiro, importamos as bibliotecas necessárias para este laboratório.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

from sklearn.experimental import enable_iterative_imputer
from sklearn.datasets import fetch_california_housing
from sklearn.impute import SimpleImputer
from sklearn.impute import IterativeImputer
from sklearn.linear_model import BayesianRidge, Ridge
from sklearn.kernel_approximation import Nystroem
from sklearn.ensemble import RandomForestRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import cross_val_score

Carregar Conjunto de Dados

Carregaremos o conjunto de dados de habitação da Califórnia do Scikit-Learn. Usaremos apenas 2.000 amostras para reduzir o tempo de computação.

N_SPLITS = 5

rng = np.random.RandomState(0)

X_full, y_full = fetch_california_housing(return_X_y=True)
X_full = X_full[::10]
y_full = y_full[::10]
n_samples, n_features = X_full.shape

Adicionar Valores Ausentes

Vamos adicionar um único valor ausente a cada linha do conjunto de dados.

X_missing = X_full.copy()
y_missing = y_full
missing_samples = np.arange(n_samples)
missing_features = rng.choice(n_features, n_samples, replace=True)
X_missing[missing_samples, missing_features] = np.nan

Imputar Valores Ausentes com Simple Imputer

Usaremos a classe SimpleImputer do Scikit-Learn para imputar valores ausentes usando estratégias de média e mediana.

score_simple_imputer = pd.DataFrame()
for strategy in ("mean", "median"):
    estimator = make_pipeline(
        SimpleImputer(missing_values=np.nan, strategy=strategy), BayesianRidge()
    )
    score_simple_imputer[strategy] = cross_val_score(
        estimator, X_missing, y_missing, scoring="neg_mean_squared_error", cv=N_SPLITS
    )

Imputar Valores Ausentes com Iterative Imputer

Usaremos a classe IterativeImputer do Scikit-Learn para imputar valores ausentes usando diferentes estimadores.

estimators = [
    BayesianRidge(),
    RandomForestRegressor(
        n_estimators=4,
        max_depth=10,
        bootstrap=True,
        max_samples=0.5,
        n_jobs=2,
        random_state=0,
    ),
    make_pipeline(
        Nystroem(kernel="polynomial", degree=2, random_state=0), Ridge(alpha=1e3)
    ),
    KNeighborsRegressor(n_neighbors=15),
]
score_iterative_imputer = pd.DataFrame()
tolerances = (1e-3, 1e-1, 1e-1, 1e-2)
for impute_estimator, tol in zip(estimators, tolerances):
    estimator = make_pipeline(
        IterativeImputer(
            random_state=0, estimator=impute_estimator, max_iter=25, tol=tol
        ),
        BayesianRidge(),
    )
    score_iterative_imputer[impute_estimator.__class__.__name__] = cross_val_score(
        estimator, X_missing, y_missing, scoring="neg_mean_squared_error", cv=N_SPLITS
    )

Comparar Resultados

Vamos comparar os resultados de diferentes estratégias de imputação usando um gráfico de barras.

scores = pd.concat(
    [score_full_data, score_simple_imputer, score_iterative_imputer],
    keys=["Original", "SimpleImputer", "IterativeImputer"],
    axis=1,
)

fig, ax = plt.subplots(figsize=(13, 6))
means = -scores.mean()
errors = scores.std()
means.plot.barh(xerr=errors, ax=ax)
ax.set_title("Regressão de Habitação da Califórnia com Diferentes Métodos de Imputação")
ax.set_xlabel("MSE (menor é melhor)")
ax.set_yticks(np.arange(means.shape[0]))
ax.set_yticklabels([" w/ ".join(label) for label in means.index.tolist()])
plt.tight_layout(pad=1)
plt.show()

Resumo

Neste laboratório, aprendemos a utilizar a classe IterativeImputer do Scikit-Learn para imputar valores ausentes num conjunto de dados. Comparámos diferentes estratégias de imputação utilizando a imputação pela média e mediana com SimpleImputer e diferentes estimadores com IterativeImputer. Concluímos que BayesianRidge e RandomForestRegressor produziram os melhores resultados para este padrão específico de valores ausentes no conjunto de dados de habitação da Califórnia.