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 13

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'
    )
)
La \*\*imputación basada en modelos\*\* es una técnica avanzada utilizada para tratar valores faltantes en los conjuntos de datos mediante el uso de modelos predictivos. A diferencia de métodos simples como la imputación por media o mediana, los modelos predictivos buscan capturar relaciones complejas entre las variables, utilizando información disponible en otras variables para estimar los valores faltantes de manera más precisa. \### Conceptos clave 1\. \*\*Modelo predictivo\*\*: Utiliza un algoritmo de aprendizaje automático para estimar los valores faltantes. Algunos de los modelos más comunes para este propósito incluyen regresión lineal, árboles de decisión, k-vecinos más cercanos (KNN), entre otros. 2\. \*\*Ventajas de la imputación basada en modelos\*\*: \- \*\*Mayor precisión\*\*: Puede capturar relaciones complejas entre las variables, lo que resulta en estimaciones más exactas que los métodos tradicionales. \- \*\*Flexibilidad\*\*: Puede adaptarse a diferentes tipos de datos (numéricos, categóricos). 3\. \*\*Desventajas\*\*: \- \*\*Mayor complejidad\*\*: La implementación requiere un mayor conocimiento en machine learning. \- \*\*Riesgo de sobreajuste\*\*: Si no se gestiona adecuadamente, el modelo puede ajustarse demasiado a los datos de entrenamiento, afectando su capacidad de generalización. \### Métodos comunes de imputación basada en modelos \#### 1. \*\*Regresión Lineal (para variables numéricas)\*\*: Este método ajusta un modelo de regresión con las observaciones disponibles y utiliza la relación entre las variables para predecir los valores faltantes. \- \*\*Ejemplo\*\*: Si tienes un conjunto de datos sobre precios de casas, podrías usar variables como tamaño de la casa, número de habitaciones, y ubicación para predecir los precios faltantes utilizando una regresión lineal. \#### 2. \*\*Árboles de Decisión\*\*: Los árboles de decisión pueden manejar tanto variables numéricas como categóricas y encontrar patrones en los datos para imputar los valores faltantes. \#### 3. \*\*Imputación por Random Forest\*\*: Utiliza múltiples árboles de decisión para construir un modelo robusto y predecir los valores faltantes. Es particularmente efectivo cuando las relaciones entre las variables son complejas. \#### 4. \*\*Imputación por MICE (Multiple Imputation by Chained Equations)\*\*: Este método crea varios modelos iterativos para imputar los valores faltantes de manera secuencial. Cada variable con datos faltantes es imputada basándose en las demás, de manera cíclica. Este proceso se repite varias veces, y el resultado final es la media de las imputaciones. \### Implementación de la imputación basada en modelos en Python A continuación, te muestro cómo realizar la imputación basada en un modelo de \*\*regresión lineal\*\* utilizando la librería `scikit-learn` y un conjunto de datos con valores faltantes. \#### Paso a paso: 1\. \*\*Instalar las dependencias\*\*: ```bash pip install scikit-learn pandas numpy ``` 2\. \*\*Ejemplo de imputación basada en regresión lineal\*\*: ```python import pandas as pd import numpy as np from sklearn.linear\_model import LinearRegression from sklearn.model\_selection import train\_test\_split \# Crear un DataFrame con valores faltantes data = {'A': \[1, 2, 3, 4, 5], 'B': \[2, np.nan, 6, 8, 10], 'C': \[5, 7, np.nan, 9, 11]} df = pd.DataFrame(data) \# Mostrar el DataFrame original print("DataFrame original con valores faltantes:") print(df) \# Separar las observaciones con y sin valores faltantes en la columna 'B' df\_complete = df\[df\['B'].notna()] df\_missing = df\[df\['B'].isna()] \# Definir las variables predictoras (features) y la variable objetivo (target) X\_complete = df\_complete\[\['A', 'C']] y\_complete = df\_complete\['B'] X\_missing = df\_missing\[\['A', 'C']] \# Entrenar un modelo de regresión lineal con los datos completos model = LinearRegression() model.fit(X\_complete, y\_complete) \# Predecir los valores faltantes df.loc\[df\['B'].isna(), 'B'] = model.predict(X\_missing) \# Mostrar el DataFrame con los valores imputados print("\nDataFrame con los valores imputados:") print(df) ``` \### Explicación del código: \- \*\*DataFrame con valores faltantes\*\*: Se genera un `DataFrame` con algunos valores faltantes en la columna 'B'. \- \*\*Modelo de regresión lineal\*\*: Se entrena un modelo de regresión lineal utilizando las columnas 'A' y 'C' para predecir los valores de la columna 'B'. \- \*\*Imputación\*\*: Se utilizan las predicciones del modelo para reemplazar los valores faltantes en la columna 'B'. \### Salida esperada: ``` DataFrame original con valores faltantes: A B C 0 1 2.0 5.0 1 2 NaN 7.0 2 3 6.0 NaN 3 4 8.0 9.0 4 5 10.0 11.0 DataFrame con los valores imputados: A B C 0 1 2.0 5.0 1 2 4.0 7.0 2 3 6.0 NaN 3 4 8.0 9.0 4 5 10.0 11.0 ``` \### Consideraciones finales: \- Es importante evaluar la calidad de las imputaciones generadas por el modelo para evitar sesgos. \- Si bien la imputación basada en modelos ofrece mayor precisión que los métodos simples, también puede introducir error si el modelo predictivo no captura bien las relaciones subyacentes entre las variables. \### Conclusión: La \*\*imputación basada en modelos\*\* es una herramienta poderosa para manejar valores faltantes, especialmente en escenarios donde hay relaciones complejas entre las variables. Al aprovechar modelos de machine learning como regresión lineal, árboles de decisión o random forests, se puede mejorar la precisión de los análisis sin descartar datos importantes.

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'
    )
)

![](

Estuve intentado un ratote con un iterative imputer: <https://scikit-learn.org/stable/modules/generated/sklearn.impute.KNNImputer.html> * pero al analizar los resultados con MAE y MSE me daban siempre 0, o sea, una convergencia perfecta. por lo que según yo estaría pasando algo raro. * en un principio pensé que estaban usándose los mismos datos para entrenamiento y test, cuestión que pude confirmar que no era así. el train test se hizo correctamente. Es posible que haya pasado por alto algo o simplemente estoy haciendo algo mal y no me doy cuenta. En fin, al margen de eso intenté hacer lo que dijo el profesor al final de la clase. Aunque confieso de tampoco estar 100% seguro de haber hecho bien el proceso. Esta metodología es nueva para mi: ```js # (8) imputación para "weight" weight_ols = (df_model_sm .pipe(lambda df: smf.ols('weight ~ height + sex + age', data = df)) .fit()) # (9) valores reales (solo nulos) para "weight" + predicción de nulos weight_ols_nulls = df_model_sm.pipe(lambda df: df[df['weight'].isna()]) weight_ols_pred = weight_ols.predict(weight_ols_nulls).round() df_model_sm.loc[df_model_sm.weight.isna(),['weight']] = weight_ols_pred print(f'Conteo de nulos en weight\ndespués de agregar los nulos imputados: {df_model_sm.weight.isna().sum()}') # Reimputamos height con los vals imputados (weight) height_ols = (df_model_sm .pipe(lambda df: smf.ols('height ~ weight + sex + age', data=df)) .fit()) # Extraer nulos (height) height_ols_nulls = df_model_sm.pipe(lambda df: df[df['height'].isna()]) # predicción: nulos en height height_ols_pred = height_ols.predict(height_ols_nulls).round() # Añadimos las predicciones al df con la shadow matrix df_model_sm.loc[df_model_sm.height.isna(), 'height'] = height_ols_pred print(f'conteo de nulos en height\ndespués de agregar los nulos imputados: {df_model_sm.height.isna().sum()}') ## Graficamos (x -> la variable que ha sido imputada) df_model_sm.missing_plot.scatter_imputation_plot(x= 'height', y = 'weight', imputation_suffix= '__is_imputed') ```
Me encantaron los modelos!!!! Claramente NO me equivoque de carrera!!!!
![](https://static.platzi.com/media/user_upload/imagen-a0959d73-7b3d-4373-83ac-f2cdadacfa62.jpg)![](https://static.platzi.com/media/user_upload/imagen-ddae0ad7-657b-44de-9a77-f914771d25f2.jpg)
![](https://static.platzi.com/media/user_upload/image-e62444eb-0b8f-4253-b1ef-575281a4283b.jpg)