Scikit-Learn Iterative Imputer

Beginner

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

Введение

В этом практическом занятии мы научимся использовать класс IterativeImputer библиотеки Scikit-Learn для заполнения пропущенных значений в наборе данных. Мы сравним разные методы заполнения, чтобы определить, какой из них наиболее эффективен при использовании BayesianRidge в наборе данных о недвижимости в Калифорнии, где из каждой строки случайным образом удалено одно значение.

Советы по использованию ВМ

После запуска виртуальной машины кликните в левом верхнем углу, чтобы переключиться на вкладку Notebook и приступить к практике в Jupyter Notebook.

Иногда может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импорт библиотек

Сначала мы импортируем необходимые библиотеки для этого практического занятия.

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

Загрузка набора данных

Мы загрузим набор данных о недвижимости в Калифорнии из Scikit-Learn. Мы будем использовать только 2000 образцов, чтобы сократить вычислительное время.

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

Добавление пропущенных значений

Мы добавим одно пропущенное значение в каждую строку набора данных.

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

Заполнение пропущенных значений с использованием SimpleImputer

Мы будем использовать класс SimpleImputer библиотеки Scikit-Learn для заполнения пропущенных значений с использованием стратегий среднего и медианы.

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
    )

Заполнение пропущенных значений с использованием Iterative Imputer

Мы будем использовать класс IterativeImputer библиотеки Scikit-Learn для заполнения пропущенных значений с использованием различных оценщиков.

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
    )

Сравнение результатов

Мы сравним результаты различных стратегий заполнения пропущенных значений с использованием столбчатой диаграммы.

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 (меньше лучше)")
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()

Резюме

В этом практическом занятии мы узнали, как использовать класс IterativeImputer библиотеки Scikit-Learn для заполнения пропущенных значений в наборе данных. Мы сравнили разные стратегии заполнения пропущенных значений, используя заполнение средним и медианой с использованием SimpleImputer и разные оценщики с использованием IterativeImputer. Мы обнаружили, что BayesianRidge и RandomForestRegressor дали наилучшие результаты для этого конкретного паттерна пропущенных значений в наборе данных по недвижимости в Калифорнии.