Skip to main content

ShapeAudit

Seu modelo novo tem a mesma acurácia do antigo. Mas será que ele aprendeu a mesma coisa?

Toda vez que um modelo é retreinado, alguém precisa decidir se promove a versão nova. Na prática, a decisão costuma ser uma só: a acurácia caiu? Se não caiu, sobe.

O problema é que essa pergunta não cobre tudo. Duas versões podem acertar na mesma proporção e usar as variáveis de um jeito diferente — inclusive uma delas ter perdido uma coluna no caminho, sem que a métrica acuse.

Um exemplo real, com dados públicos de churn de telecom:

versão em produção:  0.815
versão candidata:    0.807
diferença:           0.008     ← praticamente nada

ShapeAudit:  NÃO PROMOVA — a variável `Contract` deixou de
             influenciar a previsão e chega constante no treino

Uma coluna virou constante depois de uma mudança no pipeline. Um gate por métrica aprovaria essa versão.

Instalar

pip install shapeaudit

Usar

from shapeaudit import Guard

r = Guard().audit(modelo_antigo, modelo_novo, X_avaliacao, y_avaliacao,
                  X_train=dados_de_treino_do_modelo_novo)

print(r.verdict)               # APROVADO | REVISAR | ATENCAO | BLOQUEADO
print(r.root_cause_features)   # ['Contract']
open('laudo.html', 'w').write(r.to_html())      # laudo para abrir no navegador

X_train é o treino do modelo novo. É esse argumento que separa "a coluna sumiu do pipeline" de "o modelo deixou de usar a coluna". Sem ele a auditoria roda, mas avisa que não verificou isso.

O que você recebe

veredito o que aconteceu o que fazer
BLOQUEADO uma variável sumiu do modelo e está constante no treino não promova: verifique o pipeline
ATENÇÃO os dados chegam diferentes do treino, ou uma variável quase idêntica assumiu o lugar de outra promova com monitoramento, recalibre
REVISAR com os mesmos dados, o modelo novo responde de outro jeito olhe as curvas antes de promover
APROVADO nenhuma verificação encontrou mudança pode promover

E um laudo HTML que responde, nesta ordem: o que aconteceu, o que mudou de peso e de comportamento, onde exatamente mudou, se isso muda decisões, por onde começar a investigar, e o que não foi verificado.

Experimentar em dois minutos

  • No Colab, sem instalar nada: abra ShapeAudit_Colab.ipynb e rode tudo.
  • Com uma planilha sua: python demo_excel.py meus_dados.xlsx nome_do_alvo

Os dois terminam com o laudo aberto e um caso de pipeline quebrado, para você ver os dois extremos.

Três perguntas, três camadas

  1. Alguma variável sumiu do modelo? Compara o peso de cada variável nas duas versões e distingue "a coluna sumiu" de "o modelo deixou de usar".
  2. Os dados chegam como no treino? Compara o treino do modelo novo com os dados que ele vai pontuar.
  3. O modelo passou a reagir de outro jeito? Compara a curva de efeito de cada variável entre as duas versões. Uma distância detecta a mudança e uma classificação em cinco formas a nomeia.

O veredito usa só essas três. Extremos, subgrupos e impacto em grupos de pessoas aparecem como verificações adicionais.

Calibrar no seu caso

O limiar padrão veio de uma bancada sintética. Calibre com retreinos que você teria promovido — não precisa de rótulo nem de falha conhecida:

from shapeaudit.frechet import calibrar_limiar
print(calibrar_limiar([(modelo_jan, modelo_fev), ...], X_avaliacao)['limiar'])

Medido: de 0,12 a 0,47 em seis conjuntos de dados, e o limiar de modelos de boosting é cinco a seis vezes o de florestas nos mesmos dados. Calibre por domínio e por família de modelo.

O que ele não faz

  • Não bloqueia degradação parcial: com até 80% das linhas de uma variável corrompidas, o modelo perde 4 pontos de R² e nada dispara.
  • Em bases pequenas (menos de ~400 linhas de avaliação) pede revisão em cerca de um terço dos retreinos saudáveis.
  • Fora de árvores (MLP, ridge) é experimental: bloqueia falha de pipeline, mas alarma mais e é cerca de dez vezes mais lento.
  • Não distingue sazonalidade de mudança real.
  • Não diz qual das duas versões está certa — só que elas discordam.

LIMITATIONS.md traz cada limite com o número medido.

Confiança no veredito

Em 240 controles saudáveis de benchmark, 161 retreinos reais de séries públicas do setor elétrico brasileiro e 12 conjuntos públicos, nenhum retreino saudável foi bloqueado. Quando o pipeline quebrou de verdade, bloqueou 16 de 18 casos nomeando a variável.

A recíproca não vale: não bloquear não garante que está tudo bem.

Nomes

A distribuição é shapeaudit. Três nomes de import funcionam, e apontam para a mesma implementação:

import shapeaudit      # nome atual
import modelguard      # nome anterior (pacote `modelguard-ml`), mantido
import modelcheck      # nome original, mantido por compatibilidade

Quem já usava modelguard-ml não precisa mudar código: troque a instalação para shapeaudit e os imports antigos continuam funcionando.

Licença

MIT. README em português; a documentação de limites também.

Release files for shapeaudit 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for shapeaudit 1.0.0
File Interpreter ABI Platform
shapeaudit-1.0.0-py3-none-any.whl Python 3 none any Details

Release files / shapeaudit-1.0.0-py3-none-any.whl

Download URL shapeaudit-1.0.0-py3-none-any.whl
Size 240.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8279789423825ce32d5114b01e537cdf7029fcc39a6c2e512cd526603c47e066
BLAKE2b-256 checksum
How to use checksums
87573bdc760c9b426f79f289c0b43cb8f385957280ded1f895ae7546749670bb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.7

Release history Release notifications | RSS feed

This release

1.0.0 This release

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page