Monitoramento de drift em modelos de ML em produção
1. Introdução ao conceito de drift em modelos de ML
Modelos de machine learning implantados em produção enfrentam um desafio fundamental: o mundo real muda constantemente. O drift refere-se à degradação silenciosa do desempenho de um modelo causada por mudanças na distribuição dos dados ou na relação entre as variáveis preditoras e a variável alvo ao longo do tempo.
Quando um modelo treinado com dados históricos encontra dados de produção com características diferentes, suas previsões tornam-se progressivamente menos precisas. Os impactos são graves: decisões de negócio equivocadas, perda de receita, danos à reputação e, em setores regulados, violações de compliance. Sem monitoramento contínuo, a equipe de ML descobre o problema apenas quando os indicadores de negócio já caíram drasticamente.
O monitoramento de drift não é opcional — é um componente crítico de qualquer sistema de ML em produção, garantindo que o modelo mantenha sua utilidade e confiabilidade ao longo do ciclo de vida.
2. Tipos de drift: conceito e diferenciação
Compreender os diferentes tipos de drift é essencial para escolher as técnicas de detecção adequadas.
Data drift (drift de covariáveis) ocorre quando a distribuição das variáveis de entrada muda. Por exemplo, um modelo de aprovação de crédito treinado com dados de 2020 pode receber em 2024 solicitações com perfis de renda completamente diferentes devido à inflação.
Concept drift representa uma alteração na relação entre features e target. Imagine um modelo que prevê demanda de sorvetes baseado na temperatura. Se uma nova tendência de consumo saudável reduzir a demanda mesmo em dias quentes, a função de mapeamento mudou — isso é concept drift.
Target drift é o deslocamento na distribuição da variável alvo. Em um sistema de detecção de fraudes, se a taxa basal de fraudes na população cai de 2% para 0,5% devido a novas regulamentações, o modelo precisa ser recalibrado.
Na prática, esses drifts frequentemente ocorrem simultaneamente, exigindo monitoramento multidimensional.
3. Métodos estatísticos para detecção de drift
A detecção de drift baseia-se em comparar a distribuição dos dados de referência (baseline) com os dados de produção recentes.
Testes de hipóteses são a abordagem mais direta. O teste Kolmogorov-Smirnov (KS) compara duas distribuições contínuas e retorna um p-valor indicando se pertencem à mesma população. Para variáveis categóricas, o teste Qui-quadrado é mais adequado. A divergência de Jensen-Shannon mede a similaridade entre distribuições de forma simétrica.
# Exemplo: Cálculo manual do teste KS para detectar data drift
from scipy.stats import ks_2samp
import numpy as np
# Dados de referência (baseline)
referencia = np.random.normal(50, 10, 1000)
# Dados de produção do mês atual
producao = np.random.normal(55, 12, 800)
estatistica, p_valor = ks_2samp(referencia, producao)
print(f"Estatística KS: {estatistica:.4f}")
print(f"P-valor: {p_valor:.4f}")
if p_valor < 0.05:
print("ALERTA: Data drift detectado na feature!")
else:
print("Distribuições estatisticamente similares")
Population Stability Index (PSI) é amplamente usado no setor financeiro. Valores de PSI acima de 0,25 indicam drift significativo.
Abordagens baseadas em janelas temporais são cruciais para o monitoramento contínuo. A janela fixa compara sempre com o mesmo baseline histórico. A janela deslizante compara janelas consecutivas de produção, detectando drifts graduais que a janela fixa pode perder.
# Exemplo: PSI com janela deslizante
def calcular_psi(esperado, observado, bins=10):
# Discretiza as distribuições
limites = np.percentile(esperado, np.linspace(0, 100, bins+1))
# Frequências esperadas e observadas
freq_esp, _ = np.histogram(esperado, bins=limites)
freq_obs, _ = np.histogram(observado, bins=limites)
# Normaliza para proporções
prop_esp = freq_esp / len(esperado)
prop_obs = freq_obs / len(observado)
# Evita log(0)
prop_esp = np.clip(prop_esp, 0.001, 1)
prop_obs = np.clip(prop_obs, 0.001, 1)
psi = np.sum((prop_obs - prop_esp) * np.log(prop_obs / prop_esp))
return psi
# Uso com janela deslizante de 7 dias
dados_historico = np.random.normal(50, 10, 5000)
dados_producao = np.random.normal(53, 11, 200)
psi_valor = calcular_psi(dados_historico, dados_producao)
print(f"PSI: {psi_valor:.4f}")
4. Ferramentas e frameworks para monitoramento de drift
Evidently AI é uma biblioteca open-source que oferece relatórios prontos para data drift, target drift e performance do modelo. Suporta integração com MLflow e Airflow.
WhyLabs / Whylogs permite profiling de dados em tempo real e detecção automática de anomalias. O Whylogs gera perfis estatísticos compactos que podem ser enviados para a plataforma WhyLabs para monitoramento centralizado.
Alibi Detect oferece detectores de drift online (ADWIN) e offline (MMD, LSDD) com suporte para modelos black-box, ideal para cenários onde o modelo não pode ser modificado.
5. Implementação prática de um pipeline de monitoramento
Vamos construir um pipeline simples usando Evidently AI.
# Instalação: pip install evidently pandas numpy
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
from evidently.report import Report
from evidently.metric_preset import DataDriftPreset
# 1. Coleta de dados de referência (baseline)
np.random.seed(42)
datas_ref = [datetime(2024, 1, 1) + timedelta(days=i) for i in range(100)]
dados_referencia = pd.DataFrame({
'data': datas_ref,
'idade': np.random.normal(35, 10, 100),
'salario': np.random.normal(5000, 1500, 100),
'score_credito': np.random.normal(700, 100, 100)
})
# 2. Dados de produção simulados (com drift)
datas_prod = [datetime(2024, 4, 1) + timedelta(days=i) for i in range(50)]
dados_producao = pd.DataFrame({
'data': datas_prod,
'idade': np.random.normal(40, 12, 50), # média deslocada
'salario': np.random.normal(5500, 2000, 50), # média deslocada
'score_credito': np.random.normal(680, 110, 50) # média deslocada
})
# 3. Geração de relatório de drift
report = Report(metrics=[DataDriftPreset()])
report.run(reference_data=dados_referencia, current_data=dados_producao)
# 4. Extração dos resultados
resultados = report.as_dict()
drift_detectado = resultados['metrics'][0]['result']['drift_score']
print(f"Score de drift geral: {drift_detectado:.4f}")
# 5. Configuração de alerta
THRESHOLD = 0.3
if drift_detectado > THRESHOLD:
print("ALERTA CRÍTICO: Drift significativo detectado!")
print("Ações recomendadas: notificar equipe, investigar causas, iniciar retraining")
else:
print("Modelo operando dentro dos parâmetros aceitáveis")
6. Estratégias de mitigação e resposta ao drift
Quando o drift é detectado, a equipe precisa agir rapidamente.
Retreinamento incremental é a abordagem mais comum. O modelo é reajustado periodicamente com os dados mais recentes, ponderando amostras recentes com maior peso.
Ensemble de modelos adaptativos utiliza múltiplos modelos treinados com diferentes janelas temporais. Um meta-modelo decide qual especialista usar para cada predição, baseando-se na similaridade com os dados de treinamento de cada um.
Mecanismos de fallback são essenciais para cenários críticos. Quando o drift ultrapassa um limite máximo, o sistema automaticamente redireciona as predições para um modelo de backup mais conservador ou para regras de negócio manuais.
# Exemplo: Estratégia de fallback automático
def sistema_predicao_com_fallback(dados_entrada, drift_atual):
MODELO_PRINCIPAL = "modelo_v3"
MODELO_BACKUP = "modelo_v2_regras"
if drift_atual > 0.5:
print(f"Drift crítico ({drift_atual:.2f}). Usando modelo de backup.")
return executar_modelo(MODELO_BACKUP, dados_entrada)
elif drift_atual > 0.25:
print(f"Drift moderado ({drift_atual:.2f}). Usando ensemble.")
return ensemble_modelos(dados_entrada)
else:
return executar_modelo(MODELO_PRINCIPAL, dados_entrada)
7. Monitoramento contínuo e boas práticas operacionais
Um sistema de monitoramento robusto exige definições claras. Estabeleça SLAs específicos: "O modelo não deve operar com drift de PSI > 0,25 por mais de 2 horas consecutivas." Defina thresholds para cada feature individualmente, pois features diferentes têm sensibilidades distintas.
Integre os alertas de drift com dashboards operacionais. Grafana e MLflow permitem visualizar a evolução das métricas ao longo do tempo, facilitando a identificação de padrões sazonais versus drifts reais.
Mantenha um log detalhado de todos os eventos de drift detectados, incluindo timestamp, features afetadas, ações tomadas e impacto nos negócios. Essa documentação é valiosa para auditoria, compliance e para treinar modelos mais robustos no futuro.
O monitoramento de drift não é um projeto único, mas um processo contínuo que evolui com o sistema. À medida que novos tipos de drift surgem, as técnicas de detecção e mitigação devem ser atualizadas, criando um ciclo virtuoso de melhoria contínua para os modelos de ML em produção.
Referências
- Evidently AI Documentation — Documentação oficial da biblioteca Evidently AI, com guias completos sobre detecção de data drift, target drift e performance de modelos.
- WhyLabs AI Observability Platform — Plataforma de observabilidade para ML que oferece monitoramento contínuo de drift e anomalias em modelos de produção.
- Alibi Detect: Algorithms for Outlier and Drift Detection — Repositório oficial da biblioteca Alibi Detect, com implementações de detectores de drift online e offline.
- MLflow Model Monitoring — Documentação do MLflow sobre monitoramento de modelos, incluindo integração com ferramentas de detecção de drift.
- Population Stability Index (PSI) - Towards Data Science — Artigo técnico explicando em detalhes o cálculo e interpretação do PSI para monitoramento de drift em modelos financeiros.