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.