HeadlinesBriefing favicon HeadlinesBriefing.com

Validación adversarial para detectar desviaciones ocultas

Towards Data Science •
×

Una especie de silencio tranquilo sigue a una buena corrida de validación. Los números en la pantalla, AUC en 0.91, y todos asintiendo en la reunión matinal porque, por fin, nadie tenía razón para preguntar algo más. Créeme, es una buena sensación.

Pero también es algo que he aprendido no aferrarme tanto ni confiar demasiado. El modelo finalmente fue puesto en vivo ese viernes. Nada dramático al respecto, sin sala de guerra, sin noches en vela.

Solo un despliegue que se veía exactamente igual que la docena anterior. Para el martes, algo había salido mal de una manera que tomó un tiempo en ser notada. La precisión en los casos marcados había empeorado silenciosamente, y nada de eso apareció como un error.

Sin caídas, sin alertas, sin una línea roja en ningún panel que alguien estuviera realmente observando. Solo estaba ahí empeorando, hasta que un equipo downstream se cansó de una cola de revisiones llena de marcas inútiles y preguntó por qué. Así es como se descubrió.

No un sistema que se detecta a sí mismo. Una persona, lo suficientemente molesta como para ir a buscarlo. Y aquí está la parte que aún me molesta un poco: nada en el código había cambiado.

El modelo y el pipeline eran exactamente los mismos que el día anterior. Lo que cambió fue el mundo debajo de ellos. Un nuevo nivel de precios se había lanzado unos días antes, y los clientes en él estaban transfiriendo más a menudo, con montos menores cada vez.

Revisé una característica a la vez, y nada parecía mal: el valor de la transacción estaba en un rango normal, y también lo estaba la frecuencia de transacciones. Solo cuando las miré juntas es que los datos claramente se convirtieron en algo diferente, y no había ninguna verificación en el pipeline construida para detectar eso. Ya había configurado monitoreo de deriva antes de esto y realmente creía que estaba cubierto.

Bueno, resultó que no lo estaba. La verificación que tenía hacía exactamente lo que le había pedido, observando cada característica individualmente, tal como la había construido, y habría estado allí reportando verde durante toda la situación. Lo cual es una cosa extraña de asimilar, honestamente.

El monitoreo no estaba roto. Ni siquiera era perezoso ni parcialmente construido. Solo estaba respondiendo una pregunta más estrecha que la que realmente importaba.

La parte que falla silenciosamente esa pregunta más estrecha es la que la mayoría de los monitoreos de deriva preguntan, incluyendo el mío en ese momento. ¿Alguna característica individual ha cambiado su distribución? Toma los valores de esta semana y los valores de entrenamiento, alinearlos como histogramas, y saca un número. En teoría, no es una mala idea. Solo es incompleta.

Funciona hasta que el fallo no está en ninguna característica individual, sino en cómo dos características se mueven juntas, y es una forma mucho más fácil de romperse para los datos reales de lo que la mayoría de los informes admiten. La cosa del nivel de precios es un ejemplo limpio porque nada de eso se ve mal en aislamiento. Ejecuta PSI sobre avg_transaction_value solo, bien.

Ejecuta PSI sobre num_transactions_30d solo, también bien. La relación entre las dos se invirtió, y PSI, por diseño, nunca mira dos columnas a la vez. No puede.

Eso no es un defecto en la métrica tanto como un límite que nunca fue construido para cruzar. Entonces la pregunta se convierte en: ¿cómo verificas una relación en lugar de una distribución? Resulta que la respuesta no es alguna estadística exótica que tengas que ir a aprender. Es simplemente pedirle a un modelo que te avise.

Deja que un clasificador haga el aviso. El truco tiene un nombre, validación adversarial, y suena más sofisticado de lo que es. Etiqueta las filas de entrenamiento como 0, etiqueta un lote fresco de filas de producción como 1, y entrena un clasificador para distinguirlas.

Si los dos lotes realmente provienen de la misma distribución, no puede hacerlo mejor que adivinando, AUC cerca de 0.5. Si puede separarlos, algo se movió, y porque el clasificador recibe todas las características a la vez, detecta exactamente el tipo de cambio conjunto.