HeadlinesBriefing favicon HeadlinesBriefing.com

Validação adversarial para detectar deriva oculta

Towards Data Science •
×

Um tipo específico de silêncio segue uma boa execução de validação. Números na tela, AUC em 0.91, e todos assentindo na reunião matinal porque, por uma vez, ninguém tinha razão para perguntar algo a mais. Acredite em mim, é uma boa sensação.

Mas também é algo que aprendi a não agarrar ou confiar muito. O modelo finalmente foi colocado no ar naquela sexta-feira. Nada dramático sobre isso, sem sala de guerra, sem noites de madrugada.

Apenas um deploy que parecia exatamente igual à dúzia anterior. Na terça-feira, algo havia dado errado de uma forma que levou um tempo para perceber. A precisão nos casos marcados havia piorado silenciosamente, e nada disso apareceu como um erro.

Sem travamento, sem alerta, sem uma linha vermelha em qualquer painel que alguém estivesse realmente observando. Ele apenas ficou lá ficando pior, até que uma equipe downstream se cansou de uma fila de revisão cheia de marcas inúteis e perguntou por quê. É assim que foi encontrado. Não um sistema que se detecta.

Uma pessoa, irritada o suficiente para procurar. E aqui está a parte que ainda me incomoda um pouco: nada no código havia mudado. O modelo e o pipeline eram exatamente os mesmos do dia anterior.

O que mudou foi o mundo debaixo deles. Um novo nível de preços havia sido lançado alguns dias antes, e os clientes nele estavam transacionando mais frequentemente, com valores menores a cada vez. Verifiquei uma característica de cada vez, e nada parecia errado: o valor da transação estava em uma faixa normal, e também a frequência de transações.

Foi apenas quando olhei para os dois juntos que os dados claramente se tornaram algo diferente, e não havia nenhuma verificação no pipeline construída para detectar isso. Já havia configurado monitoramento de deriva antes disso e eu realmente acreditava que estava coberto. Bem, resultou que eu não estava.

A verificação que eu tinha fazia exatamente o que eu pedi para ela fazer, observando cada característica individualmente, exatamente como eu a construí, e ela teria ficado lá relatando verde durante todo o processo. O que é uma coisa estranha de assumir, honestamente. O monitoramento não estava quebrado.

E não era preguiçoso ou mal construído também. Estava apenas respondendo uma pergunta mais estreita do que a que realmente importava. A parte que dá errado silenciosamente.

Essa pergunta mais estreita é a que a maioria dos monitoramentos de deriva pergunta, incluindo o meu na época. A distribuição de alguma característica individual mudou? Pegue os valores desta semana e os valores de treinamento, alinhe-os como histogramas, e tire um número. No papel, isso não é uma má ideia. É apenas uma incompleta.

Funciona até que a falha não esteja em nenhuma característica individual, mas em como duas características se movem juntas, e essa é uma forma muito mais fácil de quebrar dados reais do que a maioria dos relatórios admite. A coisa do nível de preços é um exemplo limpo porque nada disso parece errado isoladamente. Execute PSI sobre avg_transaction_value sozinho, tudo bem.

Execute sobre num_transactions_30d sozinho, também tudo bem. A relação entre os dois se inverteu, e PSI, por design, nunca olha duas colunas de uma só vez. Não pode.

Isso não é um defeito na métrica tanto quanto um limite que nunca foi construído para ultrapassar. Então a pergunta se torna: como você verifica uma relação em vez de uma distribuição? Acontece que a resposta não é alguma estatística exótica que você precisa aprender. É apenas pedir a um modelo para notar por você. Deixe um classificador notar.

O truque tem um nome, validação adversarial, e soa mais sofisticado do que é. Rotule suas linhas de treinamento como 0, rotule um lote fresco de linhas de produção como 1, e treine um classificador para distingui-los. Se os dois lotes realmente vierem da mesma distribuição, ele não pode fazer melhor do que adivinhar, AUC próximo de 0.5.

Se ele pode separá-los, algo se moveu, e porque o classificador recebe todas as características de uma só vez, ele pega exatamente o tipo de mudança conjunta.