No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Introducción a la imputación basada en modelos

14/17
Recursos

Aportes 9

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Proceso para la Imputacion basada en Modelos

Cuando se utiliza un modelo para imputar, en principio no aceptan valores faltantes por lo que el primer paso es imputar los valores faltantes con dummies. Luego se utiliza el modelo y se va iterando hasta que los valores que hemos sustituido con dummies no cambien. Justo alli se llega a una optima imputacion.

  • Preparacion de los datos
# preparamos los datos de la variable a imputar

nhanes_model_df= (
    nhanes_df
    .select_columns('height', 'weight', 'gender', 'age')    # seleccionamos columnas
    .sort_values(by='height')   # ordenamos en funcion de height
    #   sustituir los valores faltantes con dummies
    .transform_column(  
        'weight',   # variable de interes
        lambda x: x.ffill(),
        elementwise = False
    )   #   matriz de sombra con el sufijo imp
    .missing.bind_shadow_matrix2(
        True,
        False,
        suffix='_imp',
        only_missing=False   # matriz de sombra para todas las variables
    )
)

nhanes_model_df
  • Preparacion del modelo
# para este ejemplo vamos a utilizar la regresion lineal como modelo

height_ols = (
    nhanes_model_df
    .pipe(
        lambda df: smf.ols('height ~ weight + gender + age', data=df)
    )
    .fit()
)
  • Generacion de los valores imputados mediante el modelo
# obtener solo las observaciones con valores nulos en la variable height

(
    nhanes_model_df
    .pipe(
        lambda df: df[df.height.isna()]
    )
)
# utilizamos el modelo para generar los valores imputados

ols_imputed_values = (
    nhanes_model_df
    .pipe(
        lambda df: df[df.height.isna()]
    )
    # aplicamos el modelo. Los valores imputados se redondean debido a que son enteros
    .pipe( 
    lambda df: height_ols.predict(df).round()
    )
)

ols_imputed_values
  • Sustitucion de los valores imputados en el Dataset
# sustituimos los valores imputados generados con 
# el modelo en la variable asociada

nhanes_model_df.loc[nhanes_model_df.height.isna(), ['height']] = ols_imputed_values

nhanes_model_df
  • Visualizacion de los valores imputados
(
    nhanes_model_df
    .missing
    .scatter_imputation_plot(
        x = 'weight',   # variable independiente
        y = 'height'    # variable objetivo
    )
)

La grafica nos muestra la imputacion de la variable height en funcion de la variable weight. Observamos dos bloques de datos lo que podria indicar que se trata de la diferencia en peso entre mujeres y hombres.

El siguiente paso para aprovechar mejor el modelo es repetir todos los pasos anteriores pero en la preparacion de los datos, en vez de utilizar los valores dummies para weight, utilizamos la variable height con los valores imputados por el modelo. De esta manera ahora se busca imputar los valores de la variable weight en vez de los de height que ya han sido imputados.

Imputacion basada en Modelos

Ventajas

  • Mejora sobre la imputacion basada en donantes sencilla
  • Presenta gran variedad de opciones para imputar. Puedes elegir tecnicas de Machine Learning como puede ser un SVM o tecnicas de Deep Learning como Redes Neuronales.
  • Preserva la relacion entre las variables

Desventajas

  • Puede subestimar la varianza. Tambien arrastra todos los defecto que presente el modelo.
  • Los modelos funcionan mal si las variables observadas y faltantes son independientes.
  • Es mas complicado que la imputacion basada en donantes

Lo que entendí del proceso fue:

  1. Se ordeno el dataset, se rellenaron los valores de weigth con un ffill() y se anadireon las columnas “_imp”.
  2. Se creo height_ols que es un modelo predictivo para la variable height tomando en cuenta weight, gender y age basado en Ordinary Least Squares (OLS, una regrecion lineal).
  3. Del dataset se seleccionaron solo las tuplas donde faltaba la altura y se lleno usando el modelo predictivo.
  4. Finalmente se llenaron los valores faltantes del dataset original con los valores calculados.
***Proceso general*** > * Hacer imputación con valores dummies (ffill o bfill) a una (o más) de las variables con datos faltantes con la matriz de confusión -> esta/s variable/s no son las que se van a predecir (imputar) sino se rellenan porque la regresión linean no permite NaN, (sirven de relleno provisional) > * Ajustar un modelo de regresión lineal (ajustar ecuación de la recta) para la variables a predecir (la que no fue imputada con valores dummies) > * Se aplica el modelo de regresión lineal (previamente ajustado ) para predecir la variable con datos faltantes > * Se le pasa al DF original los nuevos valores imputados de la variable que se esta prediciendo (la que tenía valores faltantes) > * Se grafica con un scatter plot la imputación para revisar *Se continua con la imputación de las otras variables* > * Se hace otra copia del DF original > * Se le pasan a la columna correspondiente los valores imputados de la variable anterior predicha > * Crear en el nuevo DF una matriz de sombra > * Nota: Si son 2 variables no hay necesidad de imputar con dummies porque ya una de las dos fue imputada con regresión lineal y sirve de "soporte" para imputar la que previamente se relleno con dummies. Si hay más de 2 variables, se deben rellenar con dummies, dejar una como variable a imputar por ols y pasar al nuevo DF la variable recien imputada > * Se ajusta el modelo de regresión a la nueva variable a predecir (imputar) > * Se imputa (se predice) la variable con la regresión lineal ajustada > * Se le pasan los valores recien imputados al DF > * Se grafica para revisar

Copien y presten atención a la explicación!!

nhanes_model_df = (
    nhanes_df.select_columns('height','weight','gender','age')
    .sort_values(by='height')
    .transform_column(
        'weight',
        lambda x: x.ffill(),
        elementwise=False
    )
    .missing.bind_shadow_matrix(
        True,
        False,
        suffix='_imp',
        only_missing=False
    )
)
nhanes_model_df
height_ols = (
    nhanes_model_df
    .pipe(lambda df: smf.ols('height ~ weight + gender + age', data=df))
    .fit()
)
ols_imputed_values = (
    nhanes_model_df
    .pipe(
        lambda df: df[df.height.isna()]
    )
    .pipe(
        lambda df: height_ols.predict(df).round()
    )
)
ols_imputed_values
nhanes_model_df.loc[nhanes_model_df.height.isna(), ['height']] = ols_imputed_values
nhanes_model_df
(
    nhanes_model_df.missing.scatter_imputation_plot(
        x='weight',
        y='height'
    )
)

Al menos hasta acá el que menos ha afectado a la curtosis es ffill en estos ejemplos:

La imputación de datos faltantes basada en modelos es una técnica avanzada que utiliza modelos estadísticos o de aprendizaje automático para estimar y reemplazar los valores ausentes en un conjunto de datos. A diferencia de métodos más simples, que pueden depender de la media, mediana o modos, este enfoque intenta aprovechar las relaciones subyacentes entre las variables del conjunto de datos para realizar estimaciones más precisas y coherentes. Los modelos comúnmente empleados incluyen la regresión lineal, regresión logística, árboles de decisión, k-nearest neighbors (KNN), y redes neuronales, entre otros. ## Sintaxis o Etimología * **Imputación**: Proceso de reemplazo de datos faltantes con valores estimados. * **Modelos Estadísticos o de Aprendizaje Automático**: Herramientas que permiten establecer relaciones entre variables y hacer predicciones o estimaciones basadas en datos existentes. * **Variables**: Características o atributos medidos en un conjunto de datos. ## Ejemplos 1. **Imputación Mediante Regresión**: Si se identifica una relación lineal entre la variable con datos faltantes y otras variables en el conjunto de datos, se puede emplear un modelo de regresión lineal para estimar los valores faltantes. 2. **Imputación con K-Nearest Neighbors (KNN)**: Este método selecciona los k registros más similares (donde "k" es un número definido por el usuario) para un registro con datos faltantes y utiliza el promedio (para variables continuas) o la moda (para variables categóricas) de estos registros cercanos para imputar el valor faltante. ## Puntos de Buena Práctica * **Selección del Modelo**: Elegir el modelo de imputación más apropiado basado en el tipo de datos (continuos vs. categóricos), la distribución de los datos, y la relación entre variables. * **Validación Cruzada**: Utilizar técnicas de validación cruzada para ajustar y evaluar la precisión del modelo de imputación, minimizando así el riesgo de sobreajuste. * **Manejo de Variables Categóricas**: En el caso de variables categóricas, considerar el uso de codificación previa (como one-hot encoding) para facilitar la imputación mediante modelos. * **Evaluación del Impacto de la Imputación**: Analizar cómo la imputación afecta los análisis subsiguientes, verificando que las conclusiones no se vean sesgadas o alteradas significativamente debido a las estimaciones de los valores faltantes. * **Documentación y Transparencia**: Registrar detalladamente el proceso de imputación, incluyendo la selección del modelo, los parámetros utilizados y cualquier supuesto relevante, para asegurar que el proceso sea reproducible y transparente. La imputación basada en modelos ofrece una forma sofisticada de manejar datos faltantes, permitiendo a los investigadores y analistas de datos aprovechar al máximo su conjunto de datos y realizar análisis más precisos y confiables.

Vamos a predecir e imputar los nuevos valores de ‘weight’:

nhanes_model_df2 = nhanes_df.copy(deep=True)

nhanes_model_df2.loc[nhanes_model_df2.height.isna(), 'height'] = ols_imputed_values
nhanes_model_df2
nhanes_model_df2 = (
    nhanes_model_df2
    .select_columns(
        'height',
        'weight',
        'age',
        'gender'
    )
    .missing.bind_shadow_matrix(True, False, suffix='_imp')
)

weight_ols = (
    nhanes_model_df2
    .pipe(
        lambda df: smf.ols('weight ~ height + gender + age', data=df)
    )
    .fit()
)
ols_weight_imputed_values = (
    nhanes_model_df2
    .pipe(
        lambda df: df[df.weight.isna()]
    )
    .pipe(
        lambda df: weight_ols.predict(df).round()
    )
)

ols_weight_imputed_values
nhanes_model_df2.loc[nhanes_model_df2.weight.isna(), 'weight'] = ols_weight_imputed_values
nhanes_model_df2
(
    nhanes_model_df2
    .missing
    .scatter_imputation_plot(
        x='height',
        y='weight'
    )
)

![](

![](https://static.platzi.com/media/user_upload/image-e62444eb-0b8f-4253-b1ef-575281a4283b.jpg)