Scikit-Learn Iterative Imputer

Machine LearningMachine LearningBeginner
Jetzt üben

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

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden wir lernen, wie man die IterativeImputer-Klasse von Scikit-Learn verwendet, um fehlende Werte in einem Datensatz zu ergänzen. Wir werden verschiedene Schätzer vergleichen, um zu sehen, welcher am besten geeignet ist für die IterativeImputer, wenn ein BayesianRidge-Schätzer auf dem Kalifornien-Hauspreis-Datensatz verwendet wird, wobei von jeder Zeile ein einziger Wert zufällig entfernt wird.

Tipps für die VM

Nachdem der Start der VM abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen von Jupyter Notebook nicht automatisiert werden.

Wenn Sie während des Lernens Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.

Bibliotheken importieren

Wir werden zunächst die erforderlichen Bibliotheken für dieses Lab importieren.

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

Datensatz laden

Wir werden den Kalifornien-Hauspreis-Datensatz von Scikit-Learn laden. Wir werden nur 2.000 Stichproben verwenden, um die Rechenzeit zu reduzieren.

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

Fehlende Werte hinzufügen

Wir werden jedem Datensatz eine einzige fehlende Zahl hinzufügen.

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

Fehlende Werte mit SimpleImputer ergänzen

Wir werden die SimpleImputer-Klasse von Scikit-Learn verwenden, um fehlende Werte mit Mittelwert- und Medianstrategien zu ergänzen.

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
    )

Fehlende Werte mit IterativeImputer ergänzen

Wir werden die IterativeImputer-Klasse von Scikit-Learn verwenden, um fehlende Werte mit verschiedenen Schätzern zu ergänzen.

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
    )

Ergebnisse vergleichen

Wir werden die Ergebnisse verschiedener Imputationsstrategien mithilfe eines Balkendiagramms vergleichen.

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()

Zusammenfassung

In diesem Lab haben wir gelernt, wie man die IterativeImputer-Klasse von Scikit-Learn verwendet, um fehlende Werte in einem Datensatz zu ergänzen. Wir haben verschiedene Imputationsstrategien verglichen, indem wir Mittelwert- und Median-Imputation mit SimpleImputer und verschiedene Schätzer mit IterativeImputer verwendet haben. Wir haben festgestellt, dass BayesianRidge und RandomForestRegressor die besten Ergebnisse für diesen speziellen Muster von fehlenden Werten im California Housing-Datensatz liefern.