Comprobación rápida de la calidad de los datos basada en el algoritmo de validación adversarial / Sudo Null IT News

¡Hola Habr! Mi nombre es Maxim Shalankin, soy líder del equipo de ciencia de datos en el equipo de Big Data Fintech de MTS. En este artículo, aprenderá cómo evaluar la calidad de los datos utilizando el algoritmo de validación adversario utilizando la función definida por el usuario de Spark. En particular, analizaré por qué este enfoque se adapta bien y se puede aplicar con éxito a diferentes tipos de datos, convirtiéndose en una herramienta universal para integrar en los procesos de su producto. Todos los detalles están bajo el corte.

El conjunto de entrenamiento para el modelo ML está a la deriva en un océano de datos desconocidos

El conjunto de entrenamiento para el modelo ML está a la deriva en un océano de datos desconocidos

En las tareas cotidianas, es importante para nosotros comprender que los modelos de ML requieren datos de la más alta calidad. Por lo tanto, utilizamos una verificación efectiva de la calidad de los datos basada en el algoritmo de validación adversarial y la función definida por el usuario.

El artículo es bastante extenso, pero la estructura no es muy complicada:

  1. ¿Qué enfoques de DQ elegimos?

  2. Comparación del desempeño de estos enfoques.

  3. Nuestra elección por velocidad y calidad es la implementación de Spark UDF del algoritmo de validación adversarial.

  4. Cómo implementamos el enfoque elegido en casa.

La verdadera fuerza proviene de cabeza datos. ella obliga ir hacer DQ incluso cuando cuerpo el modelo quiere caer. Parrillas de osos.

¿Qué enfoques de DQ elegimos?

Las evaluaciones de la calidad de los datos son diferentes, pero tienen el mismo objetivo: comprender que todo está en orden con los datos. Y si hay algún problema, comprenda su causa y escala. Hay muchos enfoques diferentes para esto, desde los más simples hasta los más complejos. Cada uno elige aquel que cubre las necesidades de las tareas a resolver.

Nosotros, en el equipo fintech de MTS Digital, procesamos enormes cantidades de datos, por lo que es importante que estos datos sean de la calidad adecuada. El coste de un posible error crece en proporción al crecimiento del volumen de datos. Esto incluye el tiempo que las personas y los servidores dedican a procesar datos y las dificultades para encontrar errores debido al volumen y las diferentes estructuras de los datos. Los problemas se vuelven aún mayores cuando se trata de crear modelos de ML. Según la conocida regla “Basura entra, basura sale”, la calidad de los datos de entrada determina la calidad del modelo final. Por lo tanto, utilizamos los enfoques más conocidos para la evaluación de la calidad.

Una tarea bastante común es comprender en qué medida los datos de la fecha actual (business_dt = t) difieren de los datos de la fecha anterior (business_dt = tn). Examinaremos los cambios en los datos relativos a la fecha de referencia utilizando los siguientes algoritmos (usando datos numéricos como ejemplo):

Esta no es de ninguna manera una lista exhaustiva de posibles verificaciones de antecedentes, pero refleja parcialmente lo que utilizamos en nuestro trabajo diario.

A continuación se ofrece una pequeña introducción a cada uno de estos métodos de evaluación de datos:

Métrica del índice de estabilidad de la población (PSI) está diseñado para medir cambios en la distribución de una variable entre dos muestras en diferentes períodos de tiempo.

Este valor calculado muestra las diferencias en los datos originales, que se dividieron en contenedores manualmente (sobre datos continuos), o ya se dividieron de esta manera de antemano (datos categóricos).

Criterio de Kolmogorov-Smirnov — se utiliza un método estadístico para determinar si una muestra pertenece a una ley de distribución conocida. Al comparar funciones de distribución acumulativa y analizar la divergencia vertical máxima, se puede evaluar el ajuste de la muestra al modelo teórico. La prueba es sensible a las desviaciones tanto en el centro como en los bordes de la distribución, lo que proporciona una verificación más completa del cumplimiento de la ley de distribución por parte de la muestra.

A partir de este criterio, nos interesa el valor del estadístico: el punto en el que la suma de las diferencias acumuladas entre las dos distribuciones es mayor.

Compararemos dos distribuciones de datos continuas y evaluaremos su cambio.

Algoritmo de validación adversario es un enfoque de aprendizaje automático que evalúa qué tan similares son dos muestras de datos entre sí utilizando un modelo de ML. Si el modelo distingue con éxito entre dos muestras, esto indica diferencias potenciales entre ellas.

La validación adversarial es el enfoque más interesante cuando se trata de evaluar cambios en un gran volumen de datos. Lo más conveniente es utilizar el aumento de gradiente como algoritmo clasificador adversario. Los algoritmos de aumento de gradiente se paralelizan muy bien. El impulso funciona mejor que otros algoritmos con datos sin procesar: no perdemos tiempo en el preprocesamiento (o lo hacemos al mínimo), sino que enviamos los datos en su forma original (de la misma manera que se escribieron en la base de datos).

Por cierto, ya hemos hablado de este algoritmo, Puedes leer el artículo aquí.

Comparación de los enfoques.

Utilizando estos tres criterios, evaluaremos situaciones que puedan surgir con su conjunto de entrenamiento para un modelo de ML en la vida real. Veremos casos como:

  • cambiando la distribución de datos

  • desequilibrios de datos

  • aparición de lagunas uniformes en los datos

  • aparición de lagunas extremas en los datos

Después de esto, veamos el problema en una situación compleja cuando cambia más de un signo. Queremos comparar estas estimaciones entre sí para el mismo tipo de cambios de datos. Necesitamos comprender cómo cambia cada uno de estos criterios a medida que cambian los datos.

En los gráficos a continuación simulamos un cambio gradual en los datos: cada nuevo día los datos difieren ligeramente del día inicial de observaciones. Para cada nuevo día, contamos nuestras puntuaciones y las visualizamos. La métrica roc auc evalúa nuestro modelo de validación adversarial, kstest muestra el valor estadístico y psi muestra el valor psi en sí.

Veamos un problema común: cambiar el tipo de distribución de datos.

Veamos un problema común: cambiar el tipo de distribución de datos.

Según los cambios en el gráfico anterior, podemos sacar las siguientes conclusiones: todos los algoritmos hacen frente a la tarea: cada una de las tres métricas crece junto con el contador de días a medida que la distribución original se vuelve cada vez menos similar a la actual. Esto significa que esta es una tarea factible para nuestros tres algoritmos: captar el momento en el que necesitamos hacer sonar la alarma y decir que se ha producido un cambio de datos.

Probemos nuestros algoritmos en otro problema: los datos cambian de una manera menos predecible. Veamos un cambio más atípico en los datos iniciales, que, sin embargo, es muy probable que ocurra en la vida cotidiana. El objetivo sigue siendo el mismo: comparar el funcionamiento de los algoritmos entre sí y comprender cómo reacciona cada uno de ellos ante cambios de diferente tipo.

Aquí vemos patrones similares de crecimiento de métricas, pero también hay diferencias. Roc auc y psi rompen aproximadamente simultáneamente sus “límites alarmantes”, pero psi en cierto momento (aproximadamente el día 28) regresa a la zona de “normalidad”, cuando podemos decir que no hay diferencias en estos datos. El algoritmo de validación adversarial no se comporta de esta manera.

Comprobemos si nuestras comprobaciones funcionan cuando aparecen lagunas de manera uniforme en los datos.

Se puede ver que cada criterio, como en el primer caso, cambia a medida que aumenta el número de días, pero psi traspasa el límite demasiado tarde que la validación adversa. Con base en la tasa de crecimiento, podemos decir que roc auc está creciendo más rápido que otras métricas, el crecimiento de kstest es más lineal y psi está claramente rezagado y alcanza un punto crítico solo al final del período observado.

El siguiente problema potencial es que aparecerán lagunas en los datos desde el final de la distribución.

En este caso, psi tuvo un mejor desempeño, ya que la validación adversaria cruzó la línea mucho más tarde.

Al analizar estas simulaciones, apenas toqué el gráfico de métricas de kstest. La razón estriba en la ausencia de un nivel generalmente aceptado, tras alcanzarlo deberíamos hacer sonar la alarma. Puede cambiar mucho a medida que cambian los datos y debe interpretarse y revisarse cada vez. Sin embargo, como ya hemos visto, kstest se correlaciona bien con otras métricas, por lo que podemos considerarlo como una alternativa.

En la vida real, los datos rara vez cambian un atributo a la vez. Pueden cambiar simultánea y dinámicamente. Como regla general, observamos una cadena compleja de cambios, donde puede haber dependencias no obvias. Por lo tanto, la DQ debe aplicarse a los datos de manera integral, para poder rastrear el proceso de cambios en el conjunto de datos original.

Ejecutemos otra simulación, pero esta vez cambiaremos seis columnas de datos a la vez. Tanto kstest como psi pueden funcionar con solo una columna a la vez, por lo que los aplicaremos secuencialmente y resumiremos los resultados. No existen tales problemas con la validación adversaria, por lo que en una iteración del algoritmo podemos obtener valores de roc auc, así como la importancia de las características. Según la importancia de las características, juzgaremos qué columna de datos de nuestra base de datos tiene problemas.

En el lado izquierdo de los gráficos observamos cómo la distribución original ha cambiado con el tiempo para 6 columnas de datos. En el centro, visualizamos la “fuerza del cambio” de las columnas, a través de los valores de puntuación. El lado derecho del gráfico muestra la estimación general del cambio en los datos.

Vemos que tan pronto como la segunda columna de psi cruza el límite de “normalidad”, el valor de roc auc según el algoritmo de validación adversarial ya alcanza ~1,0, lo que muestra la mayor sensibilidad de este enfoque en relación con otros. La distribución de kstest en las columnas de datos está altamente correlacionada con la distribución de psi, y el total acumulado crece más rápido.

¿Qué veremos si solo cambia una de las seis columnas de datos? ¿Cómo se comportarán las métricas?

Cambiar solo una característica de todo el conjunto de datos obviamente no afectó los algoritmos kstest y psi. La métrica roc auc del algoritmo de validación adversarial alcanzó su límite esta vez un poco más tarde que en la simulación anterior. En cuanto a la importancia de las funciones, este algoritmo también tiene algo de ruido para todas las funciones excepto la primera. Pero, como en la primera simulación, los resultados de diferentes algoritmos resultaron ser similares.

Entonces, ¿por qué elegimos la validación adversa? Tiene una serie de ventajas innegables:

  • fácil interpretabilidad — como hemos visto, en el algoritmo es necesario monitorear la métrica general roc auc y, además, realizar un seguimiento de la importancia de las características para cada columna de datos. Estas son métricas estándar si ha trabajado con modelos de ML, por lo que comprenderlas e interpretarlas no es una tarea difícil.

  • la capacidad de procesar una gran cantidad de datos en una iteración del algoritmo — en el fondo, la validación adversaria utiliza algún clasificador adversario, por lo general se utilizan implementaciones efectivas de aumento de gradiente (catboost, lightgbm, xgboost); Solo necesitamos entrenar este clasificador una vez en nuestro volumen de datos para obtener el resultado. Además, los algoritmos mencionados anteriormente se pueden paralelizar, lo que aumenta la velocidad de nuestra verificación DQ.

  • No hay problemas para aplicar el algoritmo a datos de diferentes tipos. — puedes entrenar fácilmente un clasificador de aumento de gradiente sin una preparación de datos compleja (o sin ella)

El algoritmo elegido puede ser increíblemente útil, pero ¿cómo se puede aplicar a procesos creados en torno a grandes grupos de productos hadoop?

Nuestra elección en cuanto a velocidad y calidad es la implementación de Spark UDF del algoritmo de validación adversarial.

Para nosotros es importante que los procesos sean fácilmente escalables, porque tenemos big data (clústeres de hadoop) y muchos procesos regulatorios sobre el flujo de aire. Es importante que la evaluación pueda integrarse fácilmente en un proceso existente y no tener que esperar una eternidad hasta que se complete. Esto también puede ser un problema cuando hay muchos procesos que dependen unos de otros. Por lo tanto, el algoritmo de validación adversarial se adaptó para funcionar a través de una función definida por el usuario.

Spark UDF (función definida por el usuario) es una función creada por un usuario para procesar datos en Apache Spark. Le permite aplicar código personalizado a las columnas de DataFrame para implementar operaciones de procesamiento de datos personalizadas.

A continuación se muestra una estructura de código de ejemplo. Es aproximado simplemente porque su implementación puede diferir según las características del clúster y las versiones de la biblioteca.

import pandas as pd
from catboost import CatBoostClassifier
from sklearn.metrics import roc_auc_score
from pyspark.sql.types import StructType, StructField, FloatType


def custom_udf(dataframe, **kwargs):
    model = CatBoostClassifier(random_state=15, verbose=0, iterations=20)
    model = model.fit(dataframe(kwargs('features')), dataframe(kwargs('target')))
    
    preds = model.predict_proba(dataframe(kwargs('features')))(:, 1)
    score = roc_auc_score(y_true=dataframe(kwargs('target')), y_pred=preds)
    
    return pd.DataFrame({"score": score}, index=(0))


schema_df_scores = StructType((
    StructField("score", FloatType(), True),
))

result = spark_dataframe.groupBy('batch').applyInPandas(custom_udf, schema_df_scores)

Especificamos el código que funcionará dentro de un lote de datos. En esta implementación, es importante comprender la estructura y el algoritmo en sí. CatBoostClassifier fue seleccionado como clasificador adversario. Puede utilizar diferentes hiperparámetros según sus tareas y objetivos. Recomendamos elegir un valor pequeño para las iteraciones, como el número 20. Esto tiene sentido por varias razones:

  • con un pequeño número de iteraciones reducimos la probabilidad de sobreajustar los datos

  • Al reducir el número de iteraciones, reducimos el tiempo de ejecución del algoritmo. Recuerda que se debe aplicar a una gran cantidad de datos.

  • nuestro algoritmo aprende dependencias más simples en los datos, lo que será una ventaja. Nuestra tarea es realizar una verificación comprensible de la calidad de los datos y no obtener la métrica más alta del modelo. Por lo tanto, reducir el número conduce a la interpretabilidad.

La función custom_udf describe la lógica principal del algoritmo de validación adversarial. Debemos crear una columna de variable de destino con anticipación, así como una columna por lotes; la función udf se utilizará en ella en el futuro.

El algoritmo se aplica a los datos en Spark de la forma habitual para las funciones Spark-UDF: según la columna de lote. Debemos especificar el formato de salida esperado y aplicar la función a una columna por lotes creada previamente en el conjunto de datos.

¿Qué devolverá esta función spark-udf? Marco de datos con una columna: puntuación. La característica será el número de filas en este marco de datos. Es igual a la cantidad de valores de lote únicos en su conjunto de datos original. Esto significa que además realizaremos alguna agregación de los resultados, porque el número de lotes será al menos dos. Y el caso promedio es que se seleccionarán tantos lotes como sea necesario para colocar correctamente el marco de datos en la memoria del nodo Spark cuando el algoritmo se esté ejecutando.

Cómo implementamos el enfoque elegido en casa

Tenemos muchos procesos para crear mercados de datos en los que se entrenan los modelos de ML. Todos funcionan con flujo de aire y escriben tablas con chispa. Por lo tanto, el uso de la udf escrita es muy simple: debe hacer que la verificación de validación adversaria sea un paso separado del DAG para que compare los datos recién escritos con alguna partición de referencia.

Monitoreamos el resultado de la verificación en estos gráficos de mapas de calor emparejados: usando el gráfico con la métrica roc auc, determinamos si hay un problema en el nuevo conjunto de datos. Y utilizando el gráfico de importancia de características, determinamos la columna de datos con la que ocurrió el problema. Como resultado, se reduce el tiempo dedicado a buscar problemas y los datos se vuelven más fáciles de monitorear.

Aquí hay un ejemplo de evaluación de un proceso, cuando la validación adversaria mostró su efectividad (un día nuestra característica categórica en la tabla se rompió), su distribución cambió mucho, aparecieron muchos valores nuevos que antes no existían.

Con este enfoque, no es necesario inventar/prescribir comprobaciones individuales; basta con aplicar el algoritmo a una nueva fuente de datos “lista para usar”.

Por un valor general de roc auc cercano a 1, entendemos que hay cambios fuertes en los datos y, por la importancia de la característica, entendemos qué condujo a una puntuación tan alta.

¿Cuál es el resultado?

Este algoritmo es uno de nuestros enfoques para crear una evaluación de la calidad de los datos. Pero, por supuesto, no es el único entre los muchos controles DQ que deberían utilizarse para controlar datos importantes. Cada prueba y auditoría es diferente; es importante que cubran sus necesidades de análisis de calidad de datos. Para nosotros es importante que el control se realice rápidamente y que sus resultados sean interpretables.

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *