Introducción
En este laboratorio, aprenderemos a usar la clase IterativeImputer de Scikit-Learn para imputar valores faltantes en un conjunto de datos. Compararemos diferentes estimadores para ver cuál es el mejor para el IterativeImputer cuando se utiliza un estimador BayesianRidge en el conjunto de datos de viviendas de California con un solo valor eliminado al azar de cada fila.
Consejos sobre la VM
Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.
A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.
Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.
Importar bibliotecas
Primero importaremos las bibliotecas necesarias para este laboratorio.
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
Cargar el conjunto de datos
Cargaremos el conjunto de datos de viviendas de California de Scikit-Learn. Solo usaremos 2k muestras para reducir el tiempo de cómputo.
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
Agregar valores faltantes
Agregaremos un solo valor faltante a cada fila del conjunto de datos.
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 faltantes con SimpleImputer
Usaremos la clase SimpleImputer de Scikit-Learn para imputar valores faltantes utilizando estrategias de media y 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 faltantes con Iterative Imputer
Usaremos la clase IterativeImputer de Scikit-Learn para imputar valores faltantes utilizando 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
Compararemos los resultados de diferentes estrategias de imputación utilizando un 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("California Housing Regression with Different Imputation Methods")
ax.set_xlabel("MSE (smaller is better)")
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()
Resumen
En este laboratorio, aprendimos cómo usar la clase IterativeImputer de Scikit-Learn para imputar valores faltantes en un conjunto de datos. Comparamos diferentes estrategias de imputación utilizando imputación por media y mediana con SimpleImputer y diferentes estimadores con IterativeImputer. Encontramos que BayesianRidge y RandomForestRegressor dieron los mejores resultados para este patrón particular de valores faltantes en el conjunto de datos de viviendas de California.