Cinco modelos, uma tabela, e a pergunta que quase ninguém faz: a diferença entre o primeiro e o segundo colocado é real, ou é ruído da amostra? Responder isso separou dois modelos que pareciam empatados — e confirmou que um terceiro estava realmente atrás.
Recurso interativo: se a curva ROC e o AUC ainda são abstratos para você, montei um explicador onde dá para arrastar o limiar de decisão e ver a matriz de confusão, o TPR, o FPR e a curva se formarem em tempo real. Cinco minutos ali valem mais que qualquer definição de livro.
A comparação final na validação cruzada
| Modelo | ROC AUC | PR AUC | PR AUC / acaso | Gap |
|---|---|---|---|---|
| Dummy (prior) | 0,500000 | 0,066844 | 1,000× | 0,0000 |
| Decision Tree (d=7) | 0,845838 | 0,348320 | 5,211× | 0,0119 |
| Random Forest (d=10) | 0,862885 | 0,397012 | 5,939× | 0,0322 |
| XGBoost | 0,864800 | 0,402821 | 6,026× | 0,0149 |
| LightGBM | 0,865079 | 0,402528 | 6,022× | 0,0126 |
A coluna que mais importa não é o ROC AUC — é PR AUC / acaso. Ela diz que o modelo identifica a classe rara seis vezes melhor que o acaso. Num problema com 6,7% de eventos, essa é a métrica que traduz utilidade operacional.
O teste: 37.500 clientes nunca vistos
Cada modelo treinado no conjunto completo de treino e avaliado uma única vez aqui. E a primeira coisa que checo não é quem ganhou — é se o protocolo segurou:
| Modelo | Validação | Teste | Diferença |
|---|---|---|---|
| Decision Tree | 0,845838 | 0,848406 | +0,0026 |
| Random Forest | 0,862885 | 0,865808 | +0,0029 |
| XGBoost | 0,864800 | 0,869250 | +0,0045 |
| LightGBM | 0,865079 | 0,869171 | +0,0041 |
Todos ficaram acima da validação cruzada. Nenhuma degradação — a preparação sem vazamento segurou. A diferença positiva tem explicação mundana: o modelo final treina com 100% do treino contra 80% em cada dobra, e este recorte de teste saiu marginalmente mais fácil.
O bootstrap, que é onde a pergunta se responde
Num conjunto de teste único existe uma leitura por modelo — não há desvio entre dobras para comparar. Então o desvio vem de 2.000 reamostragens com reposição, usando as mesmas reamostras para todos os modelos, o que torna a comparação pareada.
| Concorrente do XGBoost | Diferença média | IC 95% | Venceu em | Real? |
|---|---|---|---|---|
| Dummy | 0,369350 | 0,3620 – 0,3764 | 100,0% | sim |
| Decision Tree | 0,020854 | 0,0170 – 0,0246 | 100,0% | sim |
| Random Forest | 0,003441 | 0,0019 – 0,0049 | 100,0% | sim |
| LightGBM | 0,000062 | −0,00063 – 0,00074 | 56,6% | não |
A vantagem do boosting sobre a floresta é real: o intervalo não cruza o zero e o XGBoost venceu em 2.000 de 2.000 reamostras. A vantagem do XGBoost sobre o LightGBM não é real: o intervalo cruza o zero e ele venceu em 56,6% — praticamente cara ou coroa.
O desempate não é técnico
Se a diferença de AUC é ruído, o critério tem que vir de outro lugar. LightGBM lidera em PR AUC (0,410106), acurácia (0,938373) e Brier (0,048472) — e é a melhor probabilidade calibrada que sustenta a decisão de negócio da próxima fase. É por isso que ele é o recomendado, não pelo terceiro decimal do ROC AUC.
Quando duas opções estão dentro do ruído, escolher pela terceira casa decimal é falsa precisão. Escolha pelo que não é ruído: calibração, custo de manutenção, interpretabilidade, latência.
Parte 9 de 12 da série Aurora — um modelo de risco de crédito do zero ao deploy. O mapa completo da série reúne todas as partes e os números finais. Veja também a documentação técnica e o código no GitHub ↗.