los IterativeImputer La clase es muy flexible: se puede usar con una variedad de estimadores para realizar regresiones por turnos, tratando cada variable como una salida a su vez.

En este ejemplo, comparamos algunos estimadores con el propósito de imputar características faltantes con IterativeImputer:

  • BayesianRidge: regresión lineal regularizada
  • DecisionTreeRegressor: regresión no lineal
  • ExtraTreesRegressor: similar a missForest en R
  • KNeighborsRegressor: comparable a otros enfoques de imputación KNN

De particular interés es la capacidad de IterativeImputer para imitar el comportamiento de missForest, un paquete de imputación popular para R. En este ejemplo, hemos optado por utilizar ExtraTreesRegressor en lugar de RandomForestRegressor (como en missForest) debido a su mayor velocidad.

Tenga en cuenta que KNeighborsRegressor es diferente de la imputación KNN, que aprende de las muestras con valores perdidos mediante el uso de una métrica de distancia que tiene en cuenta los valores perdidos, en lugar de imputarlos.

El objetivo es comparar diferentes estimadores para ver cuál es el mejor para el IterativeImputer cuando se usa un BayesianRidge estimador en el conjunto de datos de vivienda de California con un único valor eliminado al azar de cada fila.

Para este patrón particular de valores perdidos, vemos que ExtraTreesRegressor y BayesianRidge dar los mejores resultados.

Regresión de vivienda de California con diferentes métodos de imputación

print(__doc__)import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# To use this experimental feature, we need to explicitly ask for it:from sklearn.experimental import enable_iterative_imputer  # noqafrom sklearn.datasets import fetch_california_housing
from sklearn.impute import SimpleImputer
from sklearn.impute import IterativeImputer
from sklearn.linear_model import BayesianRidge
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import ExtraTreesRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import cross_val_score

N_SPLITS =5

rng = np.random.RandomState(0)

X_full, y_full = fetch_california_housing(return_X_y=True)# ~2k samples is enough for the purpose of the example.# Remove the following two lines for a slower run with different error bars.
X_full = X_full[::10]
y_full = y_full[::10]
n_samples, n_features = X_full.shape

# Estimate the score on the entire dataset, with no missing values
br_estimator = BayesianRidge()
score_full_data = pd.DataFrame(
    cross_val_score(
        br_estimator, X_full, y_full, scoring='neg_mean_squared_error',
        cv=N_SPLITS
    ),
    columns=['Full Data'])# Add a single missing value to each row
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

# Estimate the score after imputation (mean and median strategies)
score_simple_imputer = pd.DataFrame()for strategy in('mean','median'):
    estimator = make_pipeline(
        SimpleImputer(missing_values=np.nan, strategy=strategy),
        br_estimator
    )
    score_simple_imputer[strategy]= cross_val_score(
        estimator, X_missing, y_missing, scoring='neg_mean_squared_error',
        cv=N_SPLITS
    )# Estimate the score after iterative imputation of the missing values# with different estimators
estimators =[
    BayesianRidge(),
    DecisionTreeRegressor(max_features='sqrt', random_state=0),
    ExtraTreesRegressor(n_estimators=10, random_state=0),
    KNeighborsRegressor(n_neighbors=15)]
score_iterative_imputer = pd.DataFrame()for impute_estimator in estimators:
    estimator = make_pipeline(
        IterativeImputer(random_state=0, estimator=impute_estimator),
        br_estimator
    )
    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)# plot california housing results
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()

Tiempo total de ejecución del script: (0 minutos 25,845 segundos)

Carpeta de lanzamiento

Download Python source code: plot_iterative_imputer_variants_comparison.py

Download Jupyter notebook: plot_iterative_imputer_variants_comparison.ipynb