0yzj10zsqibfl D18.jpeg

Una inmersión profunda en la validación de datos utilizando Tensorflow Data Validation

Imagina esto. Tenemos un proceso de aprendizaje automático completamente funcional y es perfecto. Entonces decidimos llevarlo al entorno de producción. Todo está bien en producción, y un día ocurre un pequeño cambio en uno de los componentes que genera datos de entrada para nuestra canalización, y la canalización se rompe. ¡¡¡Ups!!!

Foto por Sara Kilian en desempaquetar

¿¿Por qué pasó esto??

Debido a que los modelos de aprendizaje automático dependen en gran medida de los datos que se utilizan, recuerde el viejo dicho: Basura entra, basura sale. Con los datos correctos, el proceso funciona bien; cualquier cambio tiende a salir mal.

Los datos que pasan a los oleoductos se generan principalmente a través de sistemas automatizados, lo que reduce el control sobre el tipo de datos que se generan.

¿Asi que que hacemos?

La validación de datos es la respuesta.

La validación de datos es el sistema guardián que verificaría si los datos están en el formato adecuado para que los consuma la canalización.

Lea este artículo para comprender por qué la validación es crucial en un proceso de aprendizaje automático y las cinco etapas de las validaciones del aprendizaje automático.

TensorFlow Data Validation (TFDV) es parte del ecosistema TFX y se puede utilizar para validar datos en una canalización de ML.

TFDV calcula estadísticas descriptivas, esquemas e identifica anomalías comparando los datos de entrenamiento y servicio. Esto garantiza que los datos de entrenamiento y entrega sean coherentes y no interrumpan ni creen predicciones no deseadas en el proceso.

La gente de Google quería que TFDV se utilizara desde la etapa más temprana de un proceso de aprendizaje automático. Por lo tanto, se aseguraron de que TFDV pudiera usarse con computadoras portátiles. Vamos a hacer lo mismo aquí.

Para comenzar, necesitamos instalar la biblioteca tensorflow-data-validation usando pip. Preferiblemente crea un entorno virtual y comienza con tus instalaciones.

Una nota de precaución: Antes de la instalación, asegúrese de que la versión sea compatible en las bibliotecas TFX.

pip install tensorflow-data-validation

Los siguientes son los pasos que seguiremos para el proceso de validación de datos:

  1. Generar estadísticas a partir de datos de entrenamiento
  2. Inferir esquemas a partir de datos de entrenamiento
  3. Generar estadísticas para datos de evaluación y compararlas con datos de capacitación
  4. Identificar y corregir anomalías
  5. Comprobación de desviaciones y sesgos de datos
  6. Guardar el esquema

Aquí utilizaremos 3 tipos de conjuntos de datos; datos de entrenamiento, datos de evaluación y datos de servicio, para imitar el uso en tiempo real. El modelo ML se entrena utilizando los datos de entrenamiento. Los datos de evaluación, también conocidos como datos de prueba, son parte de los datos designados para probar el modelo tan pronto como se completa la fase de entrenamiento. Los datos de servicio se presentan al modelo en el entorno de producción para realizar predicciones.

El código completo analizado en este artículo está disponible en mi repositorio de GitHub. Puedes descargarlo desde aquí.

Usaremos el conjunto de datos de la nave espacial Titanic de Kaggle. Puede obtener más información y descargar el conjunto de datos usando este enlace.

Vista de muestra del conjunto de datos de la nave espacial Titanic

Los datos se componen de una mezcla de datos numéricos y categóricos. Es un conjunto de datos de clasificación y la etiqueta de clase es Transported. Tiene el valor Verdadero o Falso.

Descripción de datos

Se realizan las importaciones necesarias y se definen las rutas para el archivo csv. El conjunto de datos real contiene los datos de entrenamiento y de prueba. Introduje algunos errores manualmente y guardé el archivo como ‘titanic_test_anomalies.csv’ (este archivo no está disponible en Kaggle. Puede descargarlo desde mi repositorio de GitHub). enlace).

Aquí, usaremos ANOMALOUS_DATA como datos de evaluación y TEST_DATA como datos de servicio.

import tensorflow_data_validation as tfdv
import tensorflow as tf

TRAIN_DATA = '/data/titanic_train.csv'
TEST_DATA = '/data/titanic_test.csv'
ANOMALOUS_DATA = '/data/titanic_test_anomalies.csv'

El primer paso es analizar los datos de entrenamiento e identificar sus propiedades estadísticas. TFDV tiene la generate_statistics_from_csv función, que lee directamente datos de un archivo csv. TFDV también tiene un generate_statistics_from_tfrecord funciona si tienes los datos como TFRecord .

El visualize_statistics La función presenta un resumen de 8 puntos, junto con gráficos útiles que pueden ayudarnos a comprender las estadísticas subyacentes de los datos. Esto se llama vista de Facetas. Algunos detalles críticos que necesitan nuestra atención están resaltados en rojo. Muchas otras funciones para analizar los datos están disponibles aquí. Juega y conócelo mejor.

# Generate statistics for training data
train_stats=tfdv.generate_statistics_from_csv(TRAIN_DATA)
tfdv.visualize_statistics(train_stats)
Estadísticas generadas para el conjunto de datos.

Aquí vemos valores faltantes en las funciones Age y RoomService que deben imputarse. También vemos que RoomService tiene un 65,52% de ceros. Es la forma en que se distribuyen estos datos en particular, por lo que no lo consideramos una anomalía y seguimos adelante.

Una vez que todos los problemas se han resuelto satisfactoriamente, inferimos el esquema utilizando el infer_schema función.

schema=tfdv.infer_schema(statistics=train_stats)
tfdv.display_schema(schema=schema)

El esquema suele presentarse en dos secciones. La primera sección presenta detalles como el tipo de datos, presencia, valencia y su dominio. La segunda sección presenta los valores que constituye el dominio.

Sección 1: Detalles sobre las funciones
Sección 2: Valores de dominio

Este es el esquema inicial sin formato, lo perfeccionaremos en los pasos posteriores.

Ahora recogemos los datos de evaluación y generamos las estadísticas. Necesitamos comprender cómo se deben manejar las anomalías, por lo que usaremos ANOMALOUS_DATA como nuestros datos de evaluación. Hemos introducido manualmente anomalías en estos datos.

Después de generar las estadísticas, visualizamos los datos. La visualización se puede aplicar solo a los datos de evaluación (como hicimos con los datos de entrenamiento), sin embargo, tiene más sentido comparar las estadísticas de los datos de evaluación con las estadísticas de entrenamiento. De esta manera podemos comprender qué tan diferentes son los datos de evaluación de los datos de entrenamiento.

# Generate statistics for evaluation data

eval_stats=tfdv.generate_statistics_from_csv(ANOMALOUS_DATA)

tfdv.visualize_statistics(lhs_statistics = train_stats, rhs_statistics = eval_stats,
lhs_name = "Training Data", rhs_name = "Evaluation Data")

Comparación de Estadísticas de los datos de Formación y los datos de Evaluación

Aquí podemos ver que la función RoomService está ausente en los datos de evaluación (Gran Bandera Roja). Las otras características parecen bastante buenas, ya que exhiben distribuciones similares a los datos de entrenamiento.

Sin embargo, observar no es suficiente en un entorno de producción, por lo que le pediremos a TFDV que realmente analice e informe si todo está bien.

Nuestro siguiente paso es validar las estadísticas obtenidas a partir de los datos de evaluación. Lo vamos a comparar con el esquema que habíamos generado con los datos de entrenamiento. El display_anomalies La función nos dará una vista tabulada de las anomalías que TFDV ha identificado y también una descripción.

# Identifying Anomalies
anomalies=tfdv.validate_statistics(statistics=eval_stats, schema=schema)
tfdv.display_anomalies(anomalies)
Lista de anomalías proporcionada por TFDV

En la tabla, vemos que a nuestros datos de evaluación les faltan 2 columnas (Transportado y RoomService), la función Destino tiene un valor adicional llamado ‘Anomalía’ en su dominio (que no estaba presente en los datos de entrenamiento), las funciones CryoSleep y VIP tienen valores ‘VERDADERO’ y ‘FALSO’ que no están presentes en los datos de entrenamiento; finalmente, 5 características contienen valores enteros, mientras que el esquema espera valores de punto flotante.

Eso es un puñado. Así que pongámonos manos a la obra.

Hay dos formas de corregir anomalías; Procese los datos de evaluación (manualmente) para asegurarse de que se ajusten al esquema o modifique el esquema para garantizar que se acepten estas anomalías. Una vez más, un experto en el dominio tiene que decidir qué anomalías son aceptables y cuáles exigen el procesamiento de datos.

Comencemos con la función ‘Destino’. Encontramos un nuevo valor «Anomalía», que faltaba en la lista de dominios de los datos de entrenamiento. Agreguémoslo al dominio y digamos que también es un valor aceptable para la característica.

# Adding a new value for 'Destination'
destination_domain=tfdv.get_domain(schema, 'Destination')
destination_domain.value.append('Anomaly')

anomalies=tfdv.validate_statistics(statistics=eval_stats, schema=schema)
tfdv.display_anomalies(anomalies)

Hemos eliminado esta anomalía y la lista de anomalías ya no la muestra. Pasemos al siguiente.

La anomalía del destino ha sido resuelta.

Al observar los dominios VIP y CryoSleep, vemos que los datos de entrenamiento tienen valores en minúsculas, mientras que los datos de evaluación tienen los mismos valores en mayúsculas. Una opción es preprocesar los datos y asegurarse de que todos los datos se conviertan a minúsculas o mayúsculas. Sin embargo, vamos a agregar estos valores en el dominio. Dado que VIP y CryoSleep usan el mismo conjunto de valores (verdadero y falso), configuramos el dominio de CryoSleep para que use el dominio de VIP.

# Adding data in CAPS to domain for VIP and CryoSleep

vip_domain=tfdv.get_domain(schema, 'VIP')
vip_domain.value.extend(['TRUE','FALSE'])

# Setting domain of one feature to another
tfdv.set_domain(schema, 'CryoSleep', vip_domain)

anomalies=tfdv.validate_statistics(statistics=eval_stats, schema=schema)
tfdv.display_anomalies(anomalies)

Anomalías resueltas de CryoSleep y VIP

Es bastante seguro convertir entidades enteras a flotantes. Entonces, pedimos a los datos de evaluación que infieran tipos de datos a partir del esquema de los datos de entrenamiento. Esto resuelve el problema relacionado con los tipos de datos.

# INT can be safely converted to FLOAT. So we can safely ignore it and ask TFDV to use schema

options = tfdv.StatsOptions(schema=schema, infer_type_from_schema=True)
eval_stats=tfdv.generate_statistics_from_csv(ANOMALOUS_DATA, stats_options=options)

anomalies=tfdv.validate_statistics(statistics=eval_stats, schema=schema)
tfdv.display_anomalies(anomalies)

Problema de tipo de datos resuelto

Finalmente, terminamos con el último conjunto de anomalías; Faltan 2 columnas que están presentes en los datos de Capacitación en los datos de Evaluación.

‘Transportado’ es la etiqueta de clase y obviamente no estará disponible en los datos de Evaluación. Para resolver casos en los que sabemos que las funciones de capacitación y evaluación pueden diferir entre sí, podemos crear múltiples entornos. Aquí creamos un ambiente de Capacitación y Servicio. Especificamos que la función ‘Transportado’ estará disponible en el entorno de Capacitación pero no estará disponible en el entorno de Servicio.

# Transported is the class label and will not be available in Evaluation data.
# To indicate that we set two environments; Training and Serving

schema.default_environment.append('Training')
schema.default_environment.append('Serving')

tfdv.get_feature(schema, 'Transported').not_in_environment.append('Serving')

serving_anomalies_with_environment=tfdv.validate_statistics(
statistics=eval_stats, schema=schema, environment='Serving')

tfdv.display_anomalies(serving_anomalies_with_environment)

‘RoomService’ es una característica requerida que no está disponible en el entorno de servicio. Estos casos requieren intervenciones manuales por parte de expertos en el campo.

Continúe resolviendo problemas hasta que obtenga este resultado.

Todas las anomalías resueltas

Todas las anomalías han sido resueltas.

El siguiente paso es comprobar si hay desviaciones y sesgos. El sesgo se produce debido a una irregularidad en la distribución de los datos. Inicialmente, cuando se entrena un modelo, sus predicciones suelen ser perfectas. Sin embargo, a medida que pasa el tiempo, la distribución de los datos cambia y los errores de clasificación comienzan a aumentar, esto se denomina deriva. Estos problemas requieren un reentrenamiento del modelo.

La distancia L-infinito se utiliza para medir la inclinación y la deriva. Se establece un valor umbral en función de la distancia L-infinito. Si la diferencia entre las características analizadas en el entorno de entrenamiento y de servicio excede el umbral dado, se considera que la característica ha experimentado una desviación. Se sigue un enfoque similar basado en umbrales para el sesgo. Para nuestro ejemplo, hemos establecido el nivel de umbral en 0,01 tanto para la deriva como para la desviación.

serving_stats = tfdv.generate_statistics_from_csv(TEST_DATA)

# Skew Comparator
spa_analyze=tfdv.get_feature(schema, 'Spa')
spa_analyze.skew_comparator.infinity_norm.threshold=0.01

# Drift Comparator
CryoSleep_analyze=tfdv.get_feature(schema, 'CryoSleep')
CryoSleep_analyze.drift_comparator.infinity_norm.threshold=0.01

skew_anomalies=tfdv.validate_statistics(statistics=train_stats, schema=schema,
previous_statistics=eval_stats,
serving_statistics=serving_stats)
tfdv.display_anomalies(skew_anomalies)

Podemos ver que el nivel de desviación exhibido por ‘Spa’ es aceptable (ya que no figura en la lista de anomalías); sin embargo, ‘CryoSleep’ exhibe altos niveles de desviación. Al crear canalizaciones automatizadas, estas anomalías podrían utilizarse como desencadenantes del reentrenamiento automatizado del modelo.

Alto sesgo en CryoSleep

Después de resolver todas las anomalías, el esquema podría guardarse como un artefacto o podría guardarse en el repositorio de metadatos y podría usarse en la canalización de ML.

# Saving the Schema
from tensorflow.python.lib.io import file_io
from google.protobuf import text_format

file_io.recursive_create_dir('schema')
schema_file = os.path.join('schema', 'schema.pbtxt')
tfdv.write_schema_text(schema, schema_file)

# Loading the Schema
loaded_schema= tfdv.load_schema_text(schema_file)
loaded_schema

Puedes descargar el cuaderno y los archivos de datos desde mi repositorio de GitHub usando este enlace

Puede leer los siguientes artículos para saber cuáles son sus opciones y cómo seleccionar el marco adecuado para su proyecto de canalización de ML.

Gracias por leer mi artículo. Si te gusta, anímate dándome algunas palmadas, y si estás en el otro extremo del espectro, déjame saber qué se puede mejorar en los comentarios. Hola.

A menos que se indique lo contrario, todas las imágenes son del autor.