Posterior a de esta larga búsqueda de datos hemos podido solucionar este atasco que pueden tener muchos de nuestros lectores. Te compartimos la respuesta y nuestro deseo es servirte de gran apoyo.
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 regularizadaDecisionTreeRegressor
: regresión no linealExtraTreesRegressor
: similar a missForest en RKNeighborsRegressor
: 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.
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)
Download Python source code: plot_iterative_imputer_variants_comparison.py
Download Jupyter notebook: plot_iterative_imputer_variants_comparison.ipynb
No se te olvide comunicar este tutorial si te fue de ayuda.