A/B Testing de Modelos ML em Producao
Alem das Metricas Offline
Todo data scientist ja experimentou a lacuna entre a avaliacao offline e a realidade de producao. Um modelo alcanca um AUC forte no conjunto de holdout, e implantado com confianca, e depois tem desempenho inferior ao modelo que substituiu nas metricas que realmente importam para o negocio. A razao e direta: as metricas offline medem a precisao preditiva em um snapshot estatico de dados. Os resultados de negocio dependem de como as predicoes interagem com o comportamento do usuario, os sistemas downstream e as condicoes do mundo real.
O A/B testing fecha essa lacuna comparando modelos em trafego de producao real. Em vez de confiar em um unico numero calculado sobre dados historicos, voce observa como cada modelo se sai na mesma populacao de usuarios, ao mesmo tempo, sob as mesmas condicoes.
Fundamentos Estatisticos
Teste Frequentista
O enfoque frequentista formula uma hipotese nula (tipicamente que ambos os modelos tem desempenho igual) e calcula a probabilidade de observar a diferenca medida se a hipotese nula fosse verdadeira. Essa probabilidade e o p-value. Se o p-value cai abaixo do seu nivel de significancia (comumente 0.05), voce rejeita a hipotese nula.
Teste Bayesiano
O enfoque bayesiano comeca com uma crenca previa sobre o desempenho de cada modelo e a atualiza conforme os dados chegam. Em vez de um p-value, voce obtem uma probabilidade posterior de que um modelo e melhor que o outro.
Configuracao de um A/B Test
from coreplexml import CorePlexClient
client = CorePlexClient(
base_url="https://api.coreplexml.io",
api_key="your-api-key"
)
ab_test = client.ab_tests.create(
project_id="proj_abc123",
name="Churn Model Q1 Comparison",
variants=[
{
"name": "control",
"model_id": "model_xgb_v3",
"traffic_percentage": 50
},
{
"name": "challenger",
"model_id": "model_gbm_v4",
"traffic_percentage": 50
}
],
primary_metric="retention_rate",
secondary_metrics=["prediction_latency_p99", "auc"],
statistical_method="bayesian",
confidence_level=0.95,
minimum_sample_size=5000,
maximum_duration_days=14
)
print(f"A/B Test ID: {ab_test.id}")
print(f"Status: {ab_test.status}")
print(f"Required samples per variant: {ab_test.required_sample_size}")
A primary_metric e o resultado de negocio que voce esta otimizando. Diferente de metricas offline como AUC ou RMSE, essa deve ser uma metrica que reflita diretamente o valor de negocio: taxa de conversao, receita por usuario, retencao de clientes.
Divisao de Trafego e Atribuicao
Cada usuario deve ser atribuido consistentemente a mesma variante durante toda a duracao do teste. O CorePlexML faz isso por meio de hashing deterministico:
# Making predictions during an A/B test
prediction = client.deployments.predict(
deployment_id=ab_test.deployment_id,
features={
"tenure_months": 14,
"monthly_charges": 72.50,
"contract_type": "month-to-month",
"tech_support": "no"
},
user_id="user_98765"
)
print(f"Prediction: {prediction.value}")
print(f"Variant served: {prediction.variant}")
print(f"Model: {prediction.model_id}")
Monitoramento de um Teste Ativo
status = client.ab_tests.get_status(test_id=ab_test.id)
for variant in status.variants:
print(f"\n--- {variant.name} ---")
print(f" Samples: {variant.sample_count}")
print(f" Primary metric ({status.primary_metric}): {variant.primary_value:.4f}")
print(f" 95% CI: [{variant.confidence_interval[0]:.4f}, "
f"{variant.confidence_interval[1]:.4f}]")
print(f"\nRelative improvement: {status.relative_improvement:+.2%}")
print(f"P-value: {status.p_value:.4f}")
print(f"Estimated days remaining: {status.estimated_days_remaining}")
Analise de Resultados
results = client.ab_tests.get_results(test_id=ab_test.id)
print(f"Winner: {results.winner}")
print(f"Effect size: {results.effect_size:+.4f}")
print(f"Relative improvement: {results.relative_improvement:+.2%}")
print(f"P-value: {results.p_value:.4f}")
print(f"95% Confidence interval: [{results.ci_lower:+.4f}, "
f"{results.ci_upper:+.4f}]")
print(f"\nRecommendation: {results.recommendation}")
Declaracao de Vencedor e Promocao
promotion = client.ab_tests.declare_winner(
test_id=ab_test.id,
winner_variant="challenger",
promotion_strategy="canary",
promotion_steps=[25, 50, 75, 100],
notes="GBM v4 showed 3.2% improvement in retention rate "
"with no degradation in latency or AUC."
)
print(f"Promotion ID: {promotion.id}")
print(f"Strategy: {promotion.strategy}")
print(f"Current traffic: {promotion.current_step}%")
Melhores Praticas
Defina sua metrica primaria antes do inicio do teste. Escolher a metrica apos ver os resultados introduz vies. Comprometa-se com a metrica, o nivel de significancia e o efeito minimo detectavel antecipadamente.
Nao observe e pare prematuramente. Se estiver usando teste frequentista, verificar resultados repetidamente e parar quando ve significancia infla dramaticamente sua taxa de falsos positivos.
Execute o teste tempo suficiente para capturar padroes temporais. O comportamento dos usuarios varia por dia da semana, momento do mes e temporada. Mire em pelo menos um ciclo de negocio completo.
Use metricas de protecao. Um modelo que ganha na metrica primaria mas degrada a latencia, equidade ou cobertura pode causar mais mal do que bem.
Considere efeitos de novidade e primazia. Usuarios as vezes respondem diferente a um novo modelo simplesmente porque e novo, nao porque e melhor.
Documente e arquive os resultados. Cada A/B test produz conhecimento institucional. O CorePlexML armazena historicos completos de testes incluindo configuracoes, metricas e resultados.
O ML em producao e, em ultima instancia, sobre entregar valor de negocio. O A/B testing e o metodo mais confiavel para conectar mudancas de modelo com resultados do mundo real.