Introduction
Dans ce laboratoire, nous allons apprendre à utiliser la classe IterativeImputer de Scikit-Learn pour imputer les valeurs manquantes dans un ensemble de données. Nous comparerons différents estimateurs pour voir lequel est le meilleur pour l'IterativeImputer lorsqu'on utilise un estimateur BayesianRidge sur l'ensemble de données du logement californien en supprimant aléatoirement une seule valeur de chaque ligne.
Conseils sur la machine virtuelle
Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour passer à l'onglet Carnet de notes pour accéder à Jupyter Notebook pour pratiquer.
Parfois, vous devrez peut-être attendre quelques secondes pour que Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limites de Jupyter Notebook.
Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez des commentaires après la session, et nous réglerons rapidement le problème pour vous.
Importation des bibliothèques
Nous allons tout d'abord importer les bibliothèques nécessaires pour ce laboratoire.
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
Chargement de l'ensemble de données
Nous allons charger l'ensemble de données du logement californien à partir de Scikit-Learn. Nous n'utiliserons que 2 000 échantillons pour réduire le temps de calcul.
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
Ajout de valeurs manquantes
Nous allons ajouter une seule valeur manquante à chaque ligne de l'ensemble de données.
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
Imputation des valeurs manquantes avec SimpleImputer
Nous allons utiliser la classe SimpleImputer de Scikit-Learn pour imputer les valeurs manquantes en utilisant les stratégies de moyenne et de médiane.
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
)
Imputation des valeurs manquantes avec Iterative Imputer
Nous allons utiliser la classe IterativeImputer de Scikit-Learn pour imputer les valeurs manquantes en utilisant différents estimateurs.
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
)
Comparer les résultats
Nous allons comparer les résultats de différentes stratégies d'imputation en utilisant un graphique à barres.
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 (plus petit est mieux)")
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()
Sommaire
Dans ce laboratoire, nous avons appris à utiliser la classe IterativeImputer de Scikit-Learn pour imputer les valeurs manquantes dans un ensemble de données. Nous avons comparé différentes stratégies d'imputation en utilisant l'imputation par moyenne et médiane avec SimpleImputer et différents estimateurs avec IterativeImputer. Nous avons constaté que BayesianRidge et RandomForestRegressor ont donné les meilleurs résultats pour ce modèle particulier de valeurs manquantes dans l'ensemble de données sur le logement en Californie.