Implantação e fechamento do ciclo

Um modelo que fica no notebook não gera valor nenhum. A última fase do ciclo é a mais esquecida por quem aprende ciência de dados só pela teoria — e é a única que transforma ROC AUC em decisão de crédito. Este artigo é sobre o que já está pronto para essa travessia e o que ainda falta.

O que já está pronto

A decisão de arquitetura da fase de preparação foi tomada pensando neste momento. O módulo de preparo é autocontido de propósito — não importa nenhum outro arquivo do projeto — justamente para que a aplicação em produção possa chamá-lo sem arrastar o repositório inteiro:

parametros = carregar_parametros("parametros_preparacao.json")
proposta_preparada, _ = preparar_dados(proposta_do_cliente, parametros)
probabilidade = modelo.predict_proba(proposta_preparada)[:, 1]

A mesma função que preparou o treino prepara a proposta que chega pelo formulário. Passar parametros=None faz a função aprender; passar o dicionário do treino faz ela apenas aplicar. Isso elimina a classe de bug mais comum em deploy de ML: treino e produção tratando o dado de formas sutilmente diferentes.

O que o monitoramento precisa vigiar

Comportamento de crédito muda — com a economia, com a política de originação, com o perfil de quem procura a fintech. Três coisas entram no painel:

  • Distribuição das features — a população que chega hoje parece a que treinou o modelo?
  • Calibração — a probabilidade média prevista ainda bate com a taxa realizada? Este é o alarme mais importante, porque a decisão depende da probabilidade, não do ranking.
  • Custo realizado × custo previsto — a economia projetada na simulação está acontecendo na carteira?

A limitação que não tem conserto aqui

Como registrei na parte sobre os dados: a base não tem identificador de cliente nem coluna temporal. Isso impede duas coisas que um projeto de crédito em produção exigiria — o split temporal (treinar no passado, validar no futuro) e a detecção de drift ao longo do tempo. Não é um detalhe menor, e por isso está declarado na documentação em vez de escondido.

📋

Estado real do projeto: fases 1 a 4 concluídas e documentadas; avaliação em teste concluída com bootstrap; pendentes a simulação de custo por faixa de corte, a análise SHAP e a publicação da aplicação. Prefiro publicar o estado real a anunciar um ciclo fechado que ainda não fechou.

O que essa série provou até aqui

  • Acurácia de 93,3% é o resultado de não fazer nada — o piso precisa estar na tabela.
  • Um conversor com errors="coerce" apagaria 2.950 clientes com 40% de inadimplência, em silêncio.
  • Podar a árvore recuperou +0,231 de ROC AUC; o conselho padrão de balancear classe teria destruído a calibração e negado 87% da carteira.
  • A diferença entre os dois melhores modelos não é real — e saber disso mudou o critério de escolha.
  • O ponto de corte sai do custo do erro, não do 0,5 de fábrica.

Nenhuma dessas conclusões veio do algoritmo. Todas vieram de perguntar, em cada fase, o que o número realmente está dizendo.

📊

Parte 12 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 ↗.