Caso práctico de enfermedad renal I: imputador categórico
Ahora continuarás explorando el uso de pipelines con un conjunto de datos que requiere bastante más preparación. El conjunto de datos de enfermedad renal crónica contiene tanto características categóricas como numéricas, pero también muchos valores ausentes. El objetivo es predecir quién tiene enfermedad renal crónica a partir de varios indicadores en sangre como características.
Como Sergey mencionó en el vídeo, conocerás una biblioteca nueva, sklearn_pandas, que te permite encadenar muchos más pasos de procesado dentro de un pipeline de los que actualmente admite scikit-learn. En concreto, podrás usar la clase DataFrameMapper() para aplicar cualquier transformador compatible con sklearn sobre columnas de un DataFrame, donde la salida resultante puede ser un array de NumPy o un DataFrame.
También hemos creado un transformador llamado Dictifier que encapsula la conversión de un DataFrame usando .to_dict("records") sin que tengas que hacerlo de forma explícita (y para que funcione dentro de un pipeline). Por último, también te proporcionamos la lista de nombres de características en kidney_feature_names, el nombre del objetivo en kidney_target_name, las características en X y el objetivo en y.
En este ejercicio, tu tarea es aplicar SimpleImputer de sklearn para imputar todas las columnas categóricas del conjunto de datos. Puedes tomar como plantilla cómo se creó el mapper de imputación numérica. ¿Ves los argumentos con nombre input_df=True y df_out=True? Sirven para que puedas trabajar con DataFrames en lugar de arrays. De forma predeterminada, a los transformadores se les pasa un array de numpy de las columnas seleccionadas como entrada y, en consecuencia, la salida del DataFrame mapper también es un array. Los transformadores de scikit-learn históricamente se han diseñado para funcionar con arrays de numpy, no con DataFrames de pandas, aunque sus interfaces básicas de indexación sean similares.
Este ejercicio forma parte del curso
Extreme Gradient Boosting con XGBoost
Instrucciones del ejercicio
- Aplica el imputador categórico usando
DataFrameMapper()ySimpleImputer().SimpleImputer()no necesita que le pases argumentos. Las columnas están encategorical_columns. Asegúrate de indicarinput_df=Trueydf_out=True, y usacategory_featurecomo tu variable iteradora en la list comprehension.
Ejercicio interactivo práctico
Prueba este ejercicio y completa el código de muestra.
# Import necessary modules
from sklearn_pandas import DataFrameMapper
from sklearn.impute import SimpleImputer
# Check number of nulls in each feature column
nulls_per_column = X.isnull().sum()
print(nulls_per_column)
# Create a boolean mask for categorical columns
categorical_feature_mask = X.dtypes == object
# Get list of categorical column names
categorical_columns = X.columns[categorical_feature_mask].tolist()
# Get list of non-categorical column names
non_categorical_columns = X.columns[~categorical_feature_mask].tolist()
# Apply numeric imputer
numeric_imputation_mapper = DataFrameMapper(
[([numeric_feature], SimpleImputer(strategy="median")) for numeric_feature in non_categorical_columns],
input_df=True,
df_out=True
)
# Apply categorical imputer
categorical_imputation_mapper = ____(
[(category_feature, ____) for ____ in ____],
input_df=____,
df_out=____
)