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 | INDETERMINADO
print(r.root_cause_features)   # ['Contract']
open('laudo.html', 'w', encoding='utf-8').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
INDETERMINADO uma verificação principal não rodou (ex.: base de avaliação pequena demais, modelo sem suporte) não promova com base nesta auditoria: veja a lacuna declarada no laudo

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

Os arquivos abaixo estão no repositório, não no pacote do pip — baixe o repositório (ou só o arquivo) antes.

  • No Colab, sem instalar nada: abra ShapeAudit_Colab.ipynb e rode tudo. Termina com o laudo e com um caso de pipeline quebrado.
  • Com uma planilha sua: python demo_excel.py meus_dados.xlsx nome_do_alvo (sem argumentos usa exemplo_churn.xlsx). Audita um retreino da sua planilha e grava laudo_shapeaudit.html.

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 import Guard
from shapeaudit.frechet import calibrar_limiar

cal = calibrar_limiar([(modelo_jan, modelo_fev), ...], X_avaliacao)
r = Guard(frechet_threshold=cal['limiar']).audit(producao, candidata, X_avaliacao, y)

Em domínio com efeito por interação forte, calibrar não é opcional: com o limiar padrão, retreinos saudáveis pedem revisão quase sempre (LIMITATIONS.md, seção 7-quater).

Medido: de 0,12 a 0,42 em seis conjuntos de dados, e o limiar de modelos de boosting é 2,5 a 6 vezes o de florestas nos mesmos dados (LightGBM 2,5–3,5×, XGBoost 5,6–6,3×). 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, 157 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.

Metadata

Release files for shapeaudit 1.0.6

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

Source distribution (sdist)

Source distribution for shapeaudit 1.0.6
File Size Uploaded Provenance
shapeaudit-1.0.6.tar.gz 329.6 kB Without provenance Details

Built distribution (wheel)

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

Total release size: 596.4 kB

Release files / shapeaudit-1.0.6.tar.gz

Download URL shapeaudit-1.0.6.tar.gz
Size 329.6 kB
Tags Source
SHA-256 checksum
How to use checksums
2d16d26043f81818026bb76a6646c8663a3f2a5cdef8024abcfa8e138a5ccd17
BLAKE2b-256 checksum
How to use checksums
ff9664e033612a687352f5144320f4d0834361f209ff8e67d59ebf7aab2dc01f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.7

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

Download URL shapeaudit-1.0.6-py3-none-any.whl
Size 266.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7dd66af464db5d6bf4cfdb1bae6441c1fd46a31656114a5b0365c935357a96ae
BLAKE2b-256 checksum
How to use checksums
56238eb9a43e7814cdc7dafae4f945d439c15745f7fd276dafdba6bae9f3bf8b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.7

Security for shapeaudit 1.0.6

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

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