Amanecer de los Denoisers Modelos de Aprendizaje Automático de Múltiples Salidas para la Imputación de Datos Tabulares
'Dawn of Multi-Output Denoiser Machine Learning Models for Tabular Data Imputation'
Trabajar con valores faltantes en datos tabulares es un problema fundamental en la ciencia de datos. Si los valores faltantes no pueden ser ignorados u omitidos por alguna razón, entonces podemos intentar imputarlos, es decir, reemplazar los valores faltantes por otros valores. Existen enfoques simples (pero simplistas) para la imputación y enfoques más avanzados (más precisos pero complejos y potencialmente intensivos en recursos). Este artículo presenta un enfoque novedoso para la imputación de datos tabulares que busca lograr un equilibrio entre simplicidad y utilidad.
Específicamente, veremos cómo el concepto de eliminación de ruido (normalmente asociado con datos no estructurados) puede ser utilizado para convertir rápidamente cualquier algoritmo de aprendizaje automático con múltiples salidas en un imputador de datos tabulares que sea adecuado para su uso en la práctica. Primero cubriremos algunos conceptos básicos sobre eliminación de ruido, imputación y algoritmos de múltiples salidas, y luego nos sumergiremos en los detalles de cómo convertir algoritmos de múltiples salidas en imputadores utilizando la eliminación de ruido. Luego, examinaremos brevemente cómo se puede aplicar este enfoque novedoso en la práctica con un ejemplo de la industria. Finalmente, discutiremos la relevancia futura de la imputación basada en la eliminación de ruido de datos tabulares en la era de la IA generativa y los modelos fundamentales. Para facilitar la explicación, los ejemplos de código solo se mostrarán en Python, aunque el enfoque conceptual en sí mismo es independiente del lenguaje.
De la Eliminación de Ruido a la Imputación
La eliminación de ruido se trata de eliminar el ruido de los datos. Los algoritmos de eliminación de ruido toman datos ruidosos como entrada, realizan un procesamiento inteligente para reducir el ruido tanto como sea posible y devuelven los datos desruidizados. Los casos de uso típicos de la eliminación de ruido incluyen la eliminación de ruido de datos de audio y el enfoque de imágenes borrosas. Los algoritmos de eliminación de ruido se pueden construir utilizando varios enfoques, que van desde filtros gaussianos y medianos hasta autoencoders.
Aunque el concepto de eliminación de ruido tiende a estar asociado principalmente con casos de uso que involucran datos no estructurados (por ejemplo, audio, imágenes), la imputación de datos tabulares estructurados es un concepto estrechamente relacionado. Existen muchas formas de reemplazar (o imputar) valores faltantes en datos tabulares. Por ejemplo, los datos podrían simplemente ser reemplazados por ceros (u algún valor equivalente en el contexto dado), o por alguna estadística de la fila o columna relevante para datos numéricos (por ejemplo, media, mediana, moda, mínimo, máximo) – pero hacer esto puede distorsionar los datos y, si se usa como un paso de preprocesamiento en un flujo de trabajo de entrenamiento de aprendizaje automático, esta imputación simplista podría afectar negativamente el rendimiento predictivo. Otros enfoques como K Vecinos más Cercanos (KNN) o minería de reglas de asociación pueden funcionar mejor, pero dado que no tienen la noción de entrenamiento y trabajan directamente en datos de prueba, pueden tener problemas de velocidad cuando el tamaño de los datos de prueba se vuelve grande; esto es especialmente problemático para casos de uso que requieren inferencia en línea rápida.
Ahora bien, uno podría simplemente entrenar un modelo de aprendizaje automático que establezca la característica con los valores faltantes como salida y use el resto de las características como predictores (o entradas). Si tenemos varias características con valores faltantes, construir modelos de salida única para cada una de ellas podría ser engorroso, sin mencionar costoso, por lo que podríamos intentar construir un modelo de salida múltiple que prediga los valores faltantes para todas las características afectadas a la vez. Es crucial destacar que si los valores faltantes se pueden considerar como ruido, entonces es posible aplicar conceptos de eliminación de ruido para imputar datos tabulares, y esta es la idea clave en la que nos basaremos en las secciones siguientes.
- Trabajando con los conjuntos de datos de Hugging Face
- ¿Cómo convertirse en científico de datos de Amazon en 2023?
- Diferencia entre Ciencia de Datos y Estadística
Algoritmos de Aprendizaje Automático con Múltiples Salidas
Como su nombre lo indica, los algoritmos de aprendizaje automático con múltiples salidas (o múltiples objetivos) se pueden utilizar para entrenar modelos que predicen múltiples características de salida/target simultáneamente. El sitio web de Scikit-learn ofrece una gran visión general de los algoritmos de múltiples salidas para clasificación y regresión (ver aquí).
Aunque algunos algoritmos de aprendizaje automático permiten la modelización de múltiples salidas de manera nativa, otros pueden admitir solo la modelización de salida única de manera nativa. Bibliotecas como Scikit-learn ofrecen formas de aprovechar algoritmos de salida única para la modelización de múltiples salidas mediante la provisión de envoltorios que implementan las funciones habituales como ajuste (fit) y predecir (predict), y aplicando estos a modelos de salida única por separado de manera independiente bajo el capó. El siguiente código de ejemplo muestra cómo envolver la implementación de una Regresión Vectorial de Soporte Lineal (Linear SVR) en Scikit-learn, que nativamente solo admite la modelización de salida única, en un regresor de múltiples salidas utilizando el envoltorio MultiOutputRegressor.
from sklearn.datasets import make_regressionfrom sklearn.svm import LinearSVRfrom sklearn.multioutput import MultiOutputRegressor# Construir un conjunto de datos de pruebaRANDOM_STATE = 100xs, ys = make_regression( n_samples=2000, n_features=7, n_informative=5, n_targets=3, random_state=RANDOM_STATE, noise=0.2)# Envolver el Linear SVR para habilitar la modelización de múltiples salidasmodelo_envuelto = MultiOutputRegressor( LinearSVR(random_state=RANDOM_STATE)).fit(xs, ys)
Mientras que esta estrategia de envoltura nos permite usar al menos algoritmos de salida única en casos de uso de múltiples salidas, puede que no tenga en cuenta las correlaciones o dependencias entre las características de salida (es decir, si un conjunto de características de salida predicho tiene sentido como un todo). En cambio, algunos algoritmos de ML que admiten nativamente el modelado de múltiples salidas parecen tener en cuenta las relaciones entre las salidas. Por ejemplo, cuando se utiliza un árbol de decisiones en Scikit-learn para modelar n salidas basadas en algunos datos de entrada, todos los valores de salida n se almacenan en las hojas y se utilizan criterios de división que consideran todos los valores de salida n como un conjunto, por ejemplo, promediando sobre ellos (ver aquí). El siguiente código de ejemplo muestra cómo se puede construir un regresor de árbol de decisiones de múltiples salidas, notarás que, superficialmente, los pasos son bastante similares a los mostrados anteriormente para entrenar el Linear SVR con un envoltorio.
from sklearn.datasets import make_regressionfrom sklearn.tree import DecisionTreeRegressor# Construir un conjunto de datos de jugueteRANDOM_STATE = 100xs, ys = make_regression( n_samples=2000, n_features=7, n_informative=5, n_targets=3, random_state=RANDOM_STATE, noise=0.2)# Entrenar un modelo de múltiples salidas directamente usando un árbol de decisionesmodel = DecisionTreeRegressor(random_state=RANDOM_STATE).fit(xs, ys)
Entrenamiento de modelos de ML de múltiples salidas como denoizadores para la imputación de datos tabulares
Ahora que hemos cubierto los conceptos básicos de la eliminación de ruido, la imputación y los algoritmos de ML de múltiples salidas, estamos listos para unir todos estos elementos. En general, el entrenamiento de modelos de ML de múltiples salidas para imputar datos tabulares utilizando la eliminación de ruido consiste en los siguientes pasos. Es importante tener en cuenta que, a diferencia de los ejemplos de código en la sección anterior, no diferenciaremos explícitamente entre predictores y objetivos en lo siguiente, esto se debe a que, en el contexto de la imputación de datos tabulares, las características pueden servir como predictores si están presentes en los datos y como objetivos si faltan.
Paso 1: Crear conjuntos de datos de entrenamiento y validación
Dividir los datos en un conjunto de entrenamiento y un conjunto de validación, por ejemplo, utilizando una proporción de división de 80:20. Llamemos a estos conjuntos df_entrenamiento y df_validación, respectivamente.
Paso 2: Crear copias ruidosas/enmascaradas de los conjuntos de datos de entrenamiento y validación
Hacer una copia de df_entrenamiento y df_validación y agregar ruido a los datos en estas copias, por ejemplo, enmascarando valores al azar. Llamemos a las copias enmascaradas df_entrenamiento_enmascarado y df_validación_enmascarado, respectivamente. La elección de la función de enmascaramiento puede tener un impacto en la precisión predictiva del imputador que se entrena al final, por lo que veremos algunas estrategias de enmascaramiento en la siguiente sección. Además, si el tamaño de df_entrenamiento es pequeño, puede tener sentido aumentar el número de filas en un factor k, de modo que si df_entrenamiento tiene n filas y m columnas, entonces el conjunto de datos df_entrenamiento_enmascarado aumentado tendrá n*k filas (y m columnas como antes).
Paso 3: Entrenar un modelo de múltiples salidas como imputador basado en la eliminación de ruido
Seleccione un algoritmo de múltiples salidas de su elección y entrene un modelo que prediga los datos de entrenamiento originales utilizando la copia ruidosa/enmascarada. Conceptualmente, harías algo como model.fit(predictores = df_entrenamiento_enmascarado, objetivos = df_entrenamiento).
Paso 4: Aplicar el imputador al conjunto de datos de validación enmascarado
Pase df_validación_enmascarado al modelo entrenado para predecir df_validación. Conceptualmente, esto se verá algo como df_validación_imputado = model.predict(df_validación_enmascarado). Ten en cuenta que algunas funciones de ajuste pueden tomar directamente los conjuntos de datos de validación como argumentos para calcular el error de validación durante el proceso de ajuste (por ejemplo, para redes neuronales en TensorFlow), si es así, recuerda usar el conjunto de validación enmascarado/ruidoso (df_validación_enmascarado) para los predictores y el conjunto de validación original (df_validación) para los objetivos al calcular el error de validación.
Paso 5: Evaluar la precisión de la imputación para el conjunto de datos de validación
Evalue la precisión de la imputación comparando df_validación_imputado (lo que el modelo predijo) con df_validación (la verdad básica). La evaluación se puede hacer por columna (para determinar la precisión de la imputación por característica) o por fila (para verificar la precisión por instancia de predicción). Para evitar obtener resultados de precisión inflados por columna, se pueden filtrar las filas donde el valor de la columna a predecir no está enmascarado en df_validación_enmascarado antes de calcular la precisión.
Finalmente, experimenta con los pasos anteriores para optimizar el modelo (por ejemplo, utiliza otra estrategia de enmascaramiento o elige un algoritmo de aprendizaje automático multi-salida diferente).
A continuación se muestra un ejemplo simplificado de cómo se podrían implementar los Pasos 1-5.
import pandas as pdimport numpy as npfrom sklearn.datasets import make_classificationfrom sklearn.tree import DecisionTreeClassifier# Construye un conjunto de datos de ejemploRANDOM_STATE = 100data = make_classification(n_samples=2000, n_features=7, n_classes=1, random_state=RANDOM_STATE, class_sep=2, n_informative=3)df = pd.DataFrame(data[0]).applymap(lambda x: int(abs(x)))###### Paso 1: Crear conjuntos de entrenamiento y validación#####TRAIN_TEST_SPLIT_FRAC = 0.8n = int(df.shape[0]*TRAIN_TEST_SPLIT_FRAC)df_entrenamiento, df_validacion = df.iloc[:n, :], df.iloc[n:, :].reset_index(drop=True)###### Paso 2: Crear copias ruidosas/enmascaradas de los conjuntos de entrenamiento y validación###### Ejemplo de enmascaramiento aleatorio donde cada decisión de enmascarar un valor se plantea como una moneda al aire (evento Bernoulli)def enmascaramiento_aleatorio(valor): return -1 if np.random.binomial(n=1, p=0.5) else valor df_entrenamiento_enmascarado = df_entrenamiento.applymap(enmascaramiento_aleatorio)df_validacion_enmascarado = df_validacion.applymap(enmascaramiento_aleatorio)###### Paso 3: Entrenar un modelo multi-salida para ser utilizado como un imputador basado en denoising###### Observa que los datos enmascarados se utilizan para modelar los datos originalesmodelo = DecisionTreeClassifier(random_state=RANDOM_STATE).fit(X=df_entrenamiento_enmascarado, y=df_entrenamiento)###### Paso 4: Aplicar el imputador al conjunto de validación enmascarado#####df_validacion_imputado = pd.DataFrame(modelo.predict(df_validacion_enmascarado))###### Paso 5: Evaluar la precisión de la imputación en el conjunto de validación###### Comprueba la métrica básica de precisión superior al 1, teniendo en cuenta los resultados infladosdiccionario_precisión_característica = {}for i in range(df_validacion_enmascarado.shape[1]): # Obtén la lista de índices de fila donde la característica i fue enmascarada, es decir, necesitaba ser imputada índices_enmascarados = df_validacion_enmascarado.index[df_validacion_enmascarado[i] == -1] # Calcula la precisión de la imputación solo para esas filas de la característica i diccionario_precisión_característica[i] = (df_validacion_imputado.iloc[índices_enmascarados, i] == df_validacion.iloc[índices_enmascarados, i]).mean()print(diccionario_precisión_característica)
Estrategias de Enmascaramiento de Datos
En general, se pueden emplear varias estrategias para enmascarar los datos de entrenamiento y validación. A grandes rasgos, podríamos distinguir entre tres estrategias de enmascaramiento: exhaustiva, aleatoria y basada en el dominio.
Enmascaramiento exhaustivo
Esta estrategia implica generar todas las combinaciones posibles de enmascaramiento para cada fila en el conjunto de datos. Supongamos que tenemos un conjunto de datos con n filas y m columnas. Luego, el enmascaramiento exhaustivo expandiría cada fila en un máximo de 2^ m filas, una por cada combinación de enmascaramiento de los m valores en la fila; el número total máximo de combinaciones para la fila es equivalente a la suma de la fila m en el triángulo de Pascal, aunque podemos optar por omitir algunas combinaciones que no sean útiles para un caso de uso dado (por ejemplo, la combinación donde todos los valores están enmascarados). Por lo tanto, el conjunto de datos enmascarado final tendría como máximo n *(2^ m ) filas y m columnas. Si bien la estrategia exhaustiva tiene la ventaja de ser bastante exhaustiva, puede no ser muy práctica en casos donde m es grande, ya que el conjunto de datos enmascarado resultante podría ser demasiado grande para que la mayoría de las computadoras lo manejen fácilmente hoy en día. Por ejemplo, si el conjunto de datos original tiene solo 1000 filas y 50 columnas, el conjunto de datos enmascarado de forma exhaustiva tendría aproximadamente 10¹⁸ filas (es decir, un quintillón de filas).
Enmascaramiento aleatorio
Como su nombre sugiere, esta estrategia funciona enmascarando valores utilizando alguna función aleatoria. En una implementación simple, por ejemplo, la decisión de enmascarar cada valor en el conjunto de datos podría plantearse como eventos Bernoulli independientes con probabilidad p de enmascaramiento. El beneficio obvio de la estrategia de enmascaramiento aleatorio es que, a diferencia del enmascaramiento exhaustivo, el tamaño de los datos enmascarados será manejable. Sin embargo, especialmente a partir de conjuntos de datos pequeños, para lograr una precisión de imputación suficientemente alta, puede ser necesario aumentar el muestreo de las filas del conjunto de datos de entrenamiento antes de aplicar el enmascaramiento aleatorio para que se reflejen más combinaciones de enmascaramiento en el conjunto de datos enmascarados resultante.
Enmascaramiento basado en el dominio
Esta estrategia tiene como objetivo aplicar el enmascaramiento de una manera que se aproxime al patrón de valores faltantes en la vida real, es decir, dentro del dominio o caso de uso donde se utilizará el imputador. Para identificar estos patrones, puede ser útil analizar datos cuantitativos y observacionales, así como incorporar conocimientos de expertos en el dominio.
Aplicaciones Prácticas
Los imputadores basados en la eliminación de ruido, como los discutidos en este artículo, pueden ofrecer un “camino intermedio” pragmático en la práctica, donde otros enfoques pueden ser demasiado simplistas o demasiado complejos y consumir muchos recursos. Más allá de su uso en la limpieza de datos como paso previo en flujos de trabajo de ML más grandes, la imputación basada en la eliminación de ruido de datos tabulares puede potencialmente utilizarse para impulsar la funcionalidad principal del producto en ciertos casos de uso prácticos.
La finalización asistida por IA de formularios en línea es un ejemplo de la industria. Con la creciente digitalización de varios procesos empresariales, los formularios en papel están siendo reemplazados por versiones digitales en línea. Procesos como enviar una solicitud de empleo, crear una requisición de compra, reservar un viaje corporativo y registrarse en eventos generalmente implican completar un formulario en línea de algún tipo. Completar manualmente dicho formulario puede ser tedioso, consumir mucho tiempo y potencialmente propenso a errores, especialmente si el formulario tiene varios campos que deben completarse. Sin embargo, con la ayuda de un asistente de IA, la tarea de completar dicho formulario en línea puede ser mucho más fácil, rápida y precisa, al proporcionar recomendaciones de entrada a los usuarios basadas en la información contextual disponible. Por ejemplo, a medida que un usuario comienza a completar algunos campos en el formulario, el asistente de IA podría inferir los valores más probables para los campos restantes y sugerirlos en tiempo real al usuario. Un caso de uso como este se puede plantear fácilmente como un problema de imputación basado en la eliminación de ruido y con múltiples salidas, donde los datos ruidosos/mascarados se dan por el estado actual del formulario (con algunos campos completos y otros vacíos/faltantes) y el objetivo es predecir los campos faltantes. El modelo se puede ajustar según sea necesario para satisfacer varios requisitos del caso de uso, como la precisión predictiva y el tiempo de respuesta de extremo a extremo (según lo percibido por el usuario).
Relevancia en la Era de la IA Generativa y los Modelos Fundamentales
Con los avances recientes en la IA generativa y los modelos fundamentales, y la creciente conciencia de su potencial, incluso entre audiencias no técnicas, desde que ChatGPT irrumpió en escena a fines de 2022, es justo preguntarse qué relevancia tendrán los imputadores basados en la eliminación de ruido en el futuro. Por ejemplo, los grandes modelos de lenguaje (LLMs) podrían manejar tareas de imputación para datos tabulares. Después de todo, predecir los tokens faltantes en oraciones es un objetivo de aprendizaje típico utilizado para entrenar LLMs como Bidirectional Encoder Representations from Transformers (BERT).
Sin embargo, es poco probable que los imputadores basados en la eliminación de ruido, u otros enfoques más simples para la imputación de datos tabulares que existen actualmente, se vuelvan obsoletos en la era de la IA generativa y los modelos fundamentales en el corto plazo. Las razones de esto se pueden apreciar al considerar la situación a fines de la década de 2010, momento en el cual las redes neuronales se habían vuelto opciones más técnicamente factibles y económicamente viables para varios casos de uso que anteriormente confiaban en algoritmos más simples como regresiones logísticas, árboles de decisión y bosques aleatorios. Si bien las redes neuronales reemplazaron a estos otros algoritmos para algunos casos de uso de gama alta donde se disponía de datos de entrenamiento lo suficientemente grandes y el costo de entrenar y mantener redes neuronales se consideraba justificable, muchos otros casos de uso no se vieron afectados. De hecho, la creciente facilidad de acceso a recursos de almacenamiento y computación más baratos que impulsó la adopción de redes neuronales también benefició a los otros algoritmos más simples. Desde este punto de vista, consideraciones como el costo, la complejidad, la necesidad de explicabilidad, los tiempos de respuesta rápidos para casos de uso en tiempo real y la amenaza de quedar atrapado en un conjunto potencialmente oligopólico de proveedores externos de modelos pre-entrenados, parecen apuntar hacia un futuro en el cual innovaciones pragmáticas como los imputadores basados en la eliminación de ruido para datos tabulares encuentren una forma de coexistir significativamente con la IA generativa y los modelos fundamentales en lugar de ser reemplazados por ellos.