Encontrar segmentos de datos en datos no estructurados

Encontrar segmentos de datos en datos no estructurados' can be condensed to 'Segmentar datos no estructurados'.

Una breve introducción a los métodos de fragmentación de datos, incluyendo ejemplos prácticos en el conjunto de datos CIFAR-100.

Fragmentos de datos en CIFAR100. Fuente: creado por el autor.

tl;dr:

Los fragmentos de datos son subconjuntos semánticamente significativos de los datos, donde el modelo se comporta de manera anómala. Cuando se trata de un problema de datos no estructurados (por ejemplo, imágenes, texto), encontrar estos fragmentos es una parte importante del trabajo de todo científico de datos. En la práctica, esta tarea implica mucha experiencia individual y trabajo manual. En este artículo, presentamos algunos métodos y herramientas para hacer que la búsqueda de fragmentos de datos sea más sistemática y eficiente. Discutimos los desafíos actuales y demostramos algunos flujos de trabajo prácticos basados en herramientas de código abierto.

Hay una demostración interactiva basada en el conjunto de datos CIFAR100 disponible.

Introducción

Depurar, probar y monitorear los sistemas de inteligencia artificial (IA) no es fácil. La mayor parte de los esfuerzos en el proceso de desarrollo de software 2.0 se dedican a la curación de conjuntos de datos de alta calidad.

Una estrategia importante para desarrollar algoritmos de aprendizaje automático (ML) robustos es identificar los llamados fragmentos de datos. Los fragmentos de datos son subconjuntos semánticamente significativos donde el modelo se comporta de manera anómala. Identificar y rastrear estos segmentos de datos es el corazón de todo proceso de desarrollo centrado en los datos de IA. También es un aspecto fundamental para implementar soluciones de IA seguras en dominios como la atención médica y los sistemas de asistencia al conductor automatizados.

Tradicionalmente, encontrar fragmentos de datos ha sido una parte integral del trabajo de un científico de datos. En la práctica, encontrar fragmentos de datos depende en gran medida de la experiencia individual y del conocimiento del dominio del científico de datos. En el marco del movimiento de IA centrada en los datos, hay mucho trabajo y herramientas actuales que buscan hacer que este proceso sea más sistemático.

En este artículo, ofrecemos una visión general del estado actual de la búsqueda de fragmentos de datos en datos no estructurados. Específicamente, demostramos algunos flujos de trabajo prácticos basados en herramientas de código abierto.

¿Qué es la búsqueda de fragmentos?

Los científicos de datos utilizan técnicas sencillas de búsqueda de fragmentos de forma manual todo el tiempo. El ejemplo más famoso es probablemente la matriz de confusión, un método de depuración para problemas de clasificación. En la práctica, el proceso de búsqueda de fragmentos se basa en una combinación de heurísticas precalculadas, la experiencia individual del científico de datos y mucha exploración interactiva de datos.

Un fragmento de datos clásico se puede describir mediante una conjunción de predicados sobre características tabulares o metadatos. En un conjunto de datos de personas, esto puede ser personas en un rango de edad determinado que sean hombres y tengan una altura superior a 1,85 m. En un conjunto de datos de monitoreo de condiciones del motor, un fragmento de datos puede consistir en puntos de datos en un rango de RPM, horas de funcionamiento y torque determinados.

En el caso de los datos no estructurados, la definición semántica del fragmento de datos puede ser más implícita: puede ser una descripción comprensible para los humanos, como “escenarios de conducción con lluvia ligera en una carretera curva con mucho tráfico en las montañas”.

La identificación de fragmentos de datos en conjuntos de datos no estructurados se puede realizar de dos formas diferentes:

  1. Los metadatos se pueden extraer de los datos no estructurados mediante algoritmos clásicos de procesamiento de señales (por ejemplo, imágenes oscuras, audio con relación señal-ruido baja) o redes neuronales profundas pre-entrenadas para el etiquetado automático. Luego, la búsqueda de fragmentos se puede realizar en estos metadatos.
  2. Se pueden utilizar representaciones latentes en el espacio de incrustación para agrupar clústeres de datos. Estos clústeres luego se pueden inspeccionar para identificar fragmentos de datos relevantes directamente.
Flujo de trabajo para identificar fragmentos de datos en datos no estructurados. Fuente: creado por el autor.

Las técnicas automatizadas de búsqueda de fragmentos siempre buscan equilibrar el soporte del fragmento (debe ser grande) con la gravedad de la anomalía del rendimiento del modelo (también debe ser grande).

Los métodos de búsqueda de fragmentos en datos tabulares comparten muchas similitudes con los árboles de decisión: en el contexto del análisis de modelos de ML, ambas técnicas se pueden utilizar para formular reglas que describan dónde existen errores del modelo. Sin embargo, hay una diferencia importante: el problema de búsqueda de fragmentos permite fragmentos superpuestos. Esto hace que el problema sea computacionalmente difícil porque es más difícil podar el espacio de búsqueda.

¿Por qué es importante encontrar segmentos de datos?

Especialmente en la última década, la comunidad de aprendizaje automático se ha beneficiado enormemente de conjuntos de datos de referencia: comenzando con ImageNet, dichos conjuntos de datos y competiciones han sido un factor de éxito importante para los algoritmos de aprendizaje profundo en problemas de datos no estructurados. En este contexto, la calidad de un nuevo algoritmo se juzga típicamente en base a muy pocas métricas cuantitativas como el puntaje F1 o la precisión promedio.

Con cada vez más modelos de aprendizaje automático desplegados en producción, se ha vuelto evidente que los conjuntos de datos del mundo real son muy diferentes de sus equivalentes de referencia: los datos reales suelen ser muy ruidosos y desequilibrados, pero también ricos en información de metadatos. Para algunos casos de uso, limpiar y anotar estos conjuntos de datos puede resultar prohibitivamente costoso.

Muchos equipos han descubierto que es necesario iterar en el conjunto de datos de entrenamiento y monitorear el cambio en la producción para construir y mantener sistemas de IA seguros.

Encontrar segmentos de datos es una parte fundamental de este proceso de iteración. Solo al saber dónde falla el modelo, es posible mejorar el rendimiento del sistema: recopilando más datos, corrigiendo etiquetas incorrectas, seleccionando las mejores características o simplemente restringiendo el dominio de operación del sistema.

¿Por qué es tan difícil encontrar segmentos de datos?

Un aspecto crítico de la búsqueda de segmentos es su complejidad computacional. Podemos ilustrar esto con un pequeño ejemplo: consideremos n características binarias con codificación one-hot (que se pueden obtener mediante agrupación o recodificación, por ejemplo). Entonces, el espacio de búsqueda de todas las combinaciones posibles de características es O(2^n). Esta naturaleza exponencial significa que normalmente se utilizan heurísticas para la poda. En consecuencia, encontrar segmentos de datos de forma automatizada no solo lleva bastante tiempo (dependiendo del número de características), sino que el resultado no será una solución estable óptima, sino algunas heurísticas.

En el proceso de desarrollo de IA, el rendimiento deficiente del modelo a menudo se debe a diferentes causas fundamentales. Dada la naturaleza estocástica inherente de los modelos de aprendizaje automático, esto puede llevar fácilmente a hallazgos falsos que deben ser inspeccionados y verificados manualmente. Por lo tanto, incluso si una técnica de búsqueda de segmentos puede producir un resultado teóricamente óptimo, sus resultados deben ser inspeccionados y verificados manualmente. Construir herramientas que permitan a los equipos multidisciplinarios hacer esto de manera eficiente es un cuello de botella para muchos equipos de aprendizaje automático.

Ya hemos mencionado que normalmente es deseable encontrar segmentos con un soporte amplio, pero también una diferencia significativa en el rendimiento del modelo en comparación con el conjunto de datos base. A menudo, las relaciones entre diferentes segmentos de datos tienen una naturaleza jerárquica. Manejar estas jerarquías tanto durante el proceso automatizado de búsqueda de segmentos como durante la fase de revisión interactiva es bastante desafiante.

Los métodos automatizados de búsqueda de segmentos son más efectivos en problemas ricos en metadatos. Esto ocurre a menudo en problemas del mundo real. En contraste, los conjuntos de datos de referencia siempre son bastante escasos en metadatos. Dos razones principales para esto son los requisitos de protección de datos y anonimización. Con la falta de conjuntos de datos de ejemplo adecuados, es muy difícil tanto desarrollar como demostrar flujos de trabajo efectivos de búsqueda de segmentos.

(Desafortunadamente), debemos enfrentar este desafío en la siguiente sección de ejemplo.

Práctica: Encontrar segmentos de datos en CIFAR-100

El conjunto de datos CIFAR-100 es un referente establecido en visión por computadora. Lo usamos para este tutorial porque su tamaño pequeño facilita su manejo y mantiene bajos los requisitos computacionales. Los resultados también son fáciles de entender, ya que no requieren conocimientos especializados en un dominio específico.

Desafortunadamente, CIFAR-100 ya está perfectamente equilibrado, altamente curado y carece de metadatos significativos. Por lo tanto, los resultados de los flujos de trabajo de búsqueda de segmentos que producimos en esta sección no son tan significativos como en un entorno del mundo real. Sin embargo, los flujos de trabajo presentados deberían ser suficientes para comprender cómo usarlos rápidamente en sus datos del mundo real.

En un paso de preparación, calculamos metadatos de imagen con la biblioteca Cleanvision. Se puede encontrar más información sobre este enriquecimiento en nuestro manual de IA centrada en los datos.

También definimos algunas variables importantes para nuestro análisis de segmentos de datos: las características a analizar, así como los nombres de las columnas de etiqueta y predicción:

La mayoría de las técnicas de segmentación solo funcionan con características agrupadas. Como las bibliotecas SliceLine y WisePizza no proporcionan funcionalidad de agrupación, realizamos este paso como un preprocesamiento:

SliceLine

El algoritmo SliceLine fue propuesto por Sagadeeva et al. en 2021. Está diseñado para trabajar con conjuntos de datos tabulares grandes que contienen muchas características. Utiliza una técnica de poda novedosa basada en técnicas de álgebra lineal dispersa y permite encontrar segmentos de datos rápidamente incluso en una sola máquina.

En este tutorial, utilizamos la implementación de SliceLine del equipo de DataDome. Es muy estable, pero actualmente solo admite versiones de Python <=3.9.

La mayoría de los parámetros del algoritmo SliceLine son muy directos: el soporte mínimo de la sección (min_sup), el número máximo de predicados para definir una sección (max_l) y el número máximo de secciones a devolver (k). El parámetro alpha asigna un peso a la importancia del error de la sección y controla el equilibrio entre el tamaño y la disminución del error de la sección.

Llamamos a la biblioteca SliceLine para obtener las 20 secciones más interesantes:

Para explorar las secciones de forma interactiva, enriquecemos la descripción de cada sección de datos:

Iniciamos Spotlight para explorar las secciones de datos de forma interactiva. Puedes experimentar directamente los resultados en el espacio de Huggingface.

Fig. 3: Exploración interactiva de secciones de datos generadas por SliceLine. Hay una demostración interactiva disponible en Huggingface. Fuente: creada por el autor.

Vemos que el algoritmo Sliceline encontró algunas secciones de datos significativas en el conjunto de datos CIFAR-100. Las clases de árboles de arce, sauce y roble parecen ser problemáticas. También encontramos que los puntos de datos en estas clases que tienen una puntuación oscura alta son particularmente desafiantes. Al inspeccionar más de cerca, identificamos que esto se debe a que los árboles con un fondo brillante son difíciles para el modelo.

Wise Pizza

WisePizza es un desarrollo reciente del equipo de Wise. Está diseñado para encontrar y visualizar secciones de datos interesantes en datos tabulares. La idea principal es utilizar la regresión Lasso para encontrar coeficientes de importancia para cada sección. Puedes encontrar más información sobre cómo funciona Wise Pizza en el artículo del blog.

Es importante tener en cuenta que WisePizza no se desarrolló como una herramienta de depuración de aprendizaje automático. En cambio, está destinado principalmente a respaldar el análisis de segmentos durante el EDA. Es por eso que es posible definir manualmente segmentos candidatos y asignarles un peso. En nuestros experimentos, ejecutamos WisePizza directamente en el conjunto de datos y establecimos el peso para cada punto de datos en 1:

Para explorar los problemas en nuestro conjunto de datos no estructurado, extraemos los problemas de la misma manera que en el ejemplo de Sliceline.

Fig. 4: WisePizza también identifica la clase de árbol de sauce con puntuaciones oscuras grandes como problemática. Sin embargo, las secciones no son tan granulares como los resultados de SliceLine. Fuente: creada por el autor.

En la Fig.4 vemos que en el simple conjunto de datos de referencia CIFAR-100, WisePizza encuentra segmentos relevantes: También enumera la clase de árbol de sauce con una puntuación oscura alta como la sección superior. Sin embargo, los resultados siguientes se limitan a diferentes categorías de clases y no son tan granulares como la salida de SliceLine. Una de las razones es que el algoritmo WisePizza no proporciona directamente un mecanismo de ponderación entre el soporte de la sección y la disminución de la precisión.

Sliceguard

La biblioteca Sliceguard utiliza agrupación jerárquica para determinar posibles secciones de datos. Luego, se utilizan métodos de aprendizaje justo para clasificar estos grupos y se extraen predicados mediante técnicas de IA explicables. Puedes encontrar más información sobre Sliceguard en este artículo del blog.

La razón principal por la que construimos Sliceguard es el hecho de que no solo funciona en datos tabulares, sino también directamente en incrustaciones. La biblioteca ofrece mucha funcionalidad incorporada para el preprocesamiento (por ejemplo, agrupamiento) y el posprocesamiento.

Podemos ejecutar Sliceguard en CIFAR-100 con solo unas pocas líneas de código:

Sliceguard utiliza Spotlight para proporcionar una visualización interactiva de las secciones de datos identificadas:

issue_df, issues = sg.report(spotlight_dtype={"image": Image})

Sliceguard puede descubrir secciones de datos finamente granulares en el conjunto de datos CIFAR-100 (Fig. 5). Además de las secciones de datos previamente descubiertas en las categorías de árboles, también identificamos otros problemas (por ejemplo, en la clase de ratón).

Fig. 5: Sliceguard descubre segmentos de datos finamente granulares. Hay una demostración interactiva disponible en Huggingface. Fuente: creada por el autor.

Conclusiones

Hemos presentado tres herramientas de código abierto para extraer segmentos de datos. Incluso en el sencillo conjunto de datos de referencia CIFAR-100, se pueden utilizar para descubrir rápidamente segmentos de datos críticos. Identificar estos segmentos de datos es un paso importante para comprender los modos de fallo del modelo y mejorar el conjunto de datos de entrenamiento.

La herramienta SliceLine funciona con datos tabulares e identifica segmentos de datos que se describen mediante una combinación de predicados. Sliceguard no devuelve una combinación óptima matemáticamente garantizada de predicados, pero puede trabajar directamente con embeddings. Además, se puede ejecutar en conjuntos de datos no estructurados con solo unas pocas líneas de código.

En la práctica, tanto SliceLine como Sliceguard son muy útiles para identificar segmentos de datos. Sin embargo, ambas herramientas no se pueden utilizar para un análisis de segmentos completamente automatizado. En su lugar, proporcionan heurísticas poderosas que se pueden combinar con la exploración interactiva. Si se hace correctamente, este enfoque es una herramienta importante para los equipos de datos interdisciplinarios para construir sistemas de aprendizaje automático confiables.

¿Tienes experiencia con las herramientas de segmentación de datos presentadas o puedes recomendar otras bibliotecas de código abierto? Me encantaría saber tu opinión en los comentarios.