eliasjacob's picture
Adiciona model card
9895777 verified
|
Raw
History Blame Contribute Delete
15.8 kB
---
language:
- pt
license: other
license_name: mit-bertimbau-base
license_link: https://huggingface.co/neuralmind/bert-large-portuguese-cased
library_name: transformers
pipeline_tag: text-classification
base_model: neuralmind/bert-large-portuguese-cased
tags:
- text-classification
- bert
- bertimbau
- portuguese
- lai
- acesso-a-informacao
- ouvidoria
- sus
- governo
- brasil
metrics:
- matthews_correlation
- accuracy
- f1
- precision
- recall
model-index:
- name: is-pedido-lai-classifier
results:
- task:
type: text-classification
name: Text Classification
dataset:
type: lai-falabr-ouvsus
name: Fala.BR LAI (Ouvidoria do SUS), teste retido 10%
metrics:
- type: matthews_correlation
value: 0.6825
name: Matthews Correlation Coefficient (MCC)
- type: accuracy
value: 0.9139
name: Accuracy
- type: balanced_accuracy
value: 0.8655
name: Balanced Accuracy
- type: f1
value: 0.84
name: Macro F1
- type: f1
value: 0.92
name: Weighted F1
---
# Model Card: is-pedido-lai-classifier
Classificador binário que, dado um pedido que **chegou** ao Fala.BR como *Acesso à
Informação* (LAI / e-SIC), prediz se ele é genuinamente um pedido de LAI (`is_lai = 1`)
ou se deveria ser reclassificado para outro tipo de manifestação (`is_lai = 0`).
## 1. Detalhes do Modelo
- **Desenvolvido por**: Elias Jacob, no contexto de pesquisa
sobre as manifestações da Ouvidoria do SUS na plataforma Fala.BR.
- **Data**: Junho de 2026 (dados extraídos do Fala.BR atualizados até
03/06/2026).
- **Versão**: 1.0 (primeiro modelo publicado). Pacote do projeto em `0.1.0`.
- **Tipo de modelo**: Transformer encoder (BERT) ajustado para classificação binária de
sequências. Checkpoint base: `neuralmind/bert-large-portuguese-cased` (BERTimbau Large,
arquitetura BERT-large, 24 camadas, cerca de 330 milhões de parâmetros, português cased),
com uma cabeça de classificação de 2 rótulos inicializada do zero (`BertForSequenceClassification`).
- **Algoritmos de treinamento, parâmetros, restrições de equidade e características de entrada**:
- Otimizador: AdamW (padrão do `Trainer` do `transformers`).
- Função de perda: `CrossEntropyLoss` ponderada por classe. Os pesos são inversos à
frequência e calculados **somente no conjunto de treino**: `nao_lai` = 3.4269,
`lai` = 0.5854.
- Taxa de aprendizado e schedule: `2e-5`, schedule linear (padrão do `Trainer`), sem
warmup explícito; `weight_decay` = 0.01.
- Tamanho de batch: 64 por dispositivo. O modelo publicado foi treinado em 8 GPUs em
paralelo (DataParallel de processo único, `world_size` = 1,
`gradient_accumulation_steps` = 1), portanto o batch efetivo foi 64 x 8 = 512
(78 passos por época, ceil(39677 / 512)).
- Número de épocas / passos: até 10 épocas, totalizando 780 passos de otimização (78 por
época). A melhor época é selecionada por MCC numa fatia de validação
(`load_best_model_at_end=True`, `metric_for_best_model="mcc"`); no modelo publicado foi
a época 9 (passo 702, MCC de validação 0.6887). Precisão mista `bf16`. Semente fixa 271828.
- Restrições de equidade aplicadas: nenhuma. O único tratamento do desbalanceamento
(cerca de 85/15) é a ponderação de classe na perda.
- Características de entrada (features) e pré-processamento: um único campo de texto
formado pela concatenação de `resumo_titulo` (`ResumoSolicitacao`) e `texto_pedido`
(`Teor.DescricaoAtosOuFatos`), nessa ordem, separados por espaço. São os campos
escritos pelo cidadão e que **sobrevivem** à reclassificação, portanto não vazam o
rótulo. Tokenizado com o tokenizer do BERTimbau e truncado em 510 tokens. Os campos
`leak_*` (`Assunto`, `SubAssunto`, `TipoSugeridoFalaBrIA`) são **deliberadamente
excluídos** por vazarem o rótulo.
- **Como citar**:
```bibtex
@misc{jacob2026ispedidolai,
author = {Jacob, Elias},
title = {is-pedido-lai-classifier: classificador binario de pedidos de
acesso a informacao (LAI) no Fala.BR},
year = {2026},
howpublished = {Hugging Face Hub},
}
@inproceedings{souza2020bertimbau,
author = {Souza, Fabio and Nogueira, Rodrigo and Lotufo, Roberto},
title = {{BERTimbau}: Pretrained {BERT} Models for {Brazilian} {Portuguese}},
booktitle = {Intelligent Systems (BRACIS)},
year = {2020},
}
```
- **Licença**: Não disponível. O checkpoint
base BERTimbau possui licença própria; verifique os termos de `neuralmind/bert-large-portuguese-cased`
antes de redistribuir.
## 2. Uso Pretendido
- **Usos primários pretendidos**: triagem/apoio à reclassificação de manifestações que
**chegaram como LAI** no Fala.BR, sinalizando aquelas que provavelmente não são pedidos de
acesso à informação (`is_lai = 0`) e deveriam ser reclassificadas (tipicamente para
Solicitação, Reclamação, Denúncia, etc.). É um classificador binário sobre o texto
original do cidadão.
- **Usuários primários pretendidos**: equipes de ouvidoria responsáveis pela triagem,
pesquisadores e desenvolvedores que constroem ferramentas de apoio a essa triagem.
- **Usos fora do escopo**:
- Manifestações que **não** chegaram como LAI: o universo de treino e avaliação é
restrito a `tipo_chegada == "Acesso a Informacao"`. Fora dele o comportamento é
indefinido.
- Decisão automática final sem revisão humana, em especial para fins legais (a Lei
12.527/2011 fixa prazos e ritos próprios para a LAI).
- Classificador geral de assunto/tipo de manifestação: o modelo só distingue LAI x não-LAI.
- Domínios fora da saúde/SUS ou idiomas diferentes do português: o modelo não foi
validado nesses contextos.
## 3. Fatores
- **Fatores relevantes**: comprimento do texto (pedidos muito curtos ou muito longos, sendo
estes últimos truncados em 510 tokens); tipo de destino da reclassificação para os casos
`is_lai = 0` (Solicitação, Reclamação, Denúncia, Sugestão, Elogio); domínio temático
(saúde / SUS, já que os dados vêm da Ouvidoria do SUS); idioma (português brasileiro);
órgão/unidade de destino (não registrado de forma estruturada no dataset).
- **Fatores avaliados**: a Seção 7 reporta o desempenho **por classe** (`nao_lai` vs `lai`)
no conjunto de teste retido. Não houve avaliação desagregada por destino da
reclassificação, por faixa de comprimento de texto nem por órgão; essa limitação está
registrada na Seção 9.
## 4. Métricas
- **Medidas de desempenho do modelo**: a métrica principal é o **MCC** (coeficiente de
correlação de Matthews), escolhido por ser robusto ao desbalanceamento de classes.
Também são reportados F1, precisão e recall **da classe minoritária** (`nao_lai = 0`, a
classe operacionalmente relevante), além de acurácia balanceada e acurácia global. A
seleção da arquitetura (BERTimbau Large vs Base e vs modelos clássicos com TF-IDF) usou MCC
médio em validação cruzada estratificada de 10 folds.
- **Limiares de decisão**: `argmax` do softmax (limiar implícito de 0.5). Não houve
calibração de probabilidades nem ajuste de limiar no modelo final. A melhor época foi
escolhida por MCC na fatia de validação.
- **Abordagens de incerteza e variabilidade**: a **seleção da arquitetura** apoiou-se em
validação cruzada estratificada de 10 folds, com teste de Friedman + Nemenyi e análise
bayesiana (ROPE) das diferenças. No CV de 10 folds, o BERTimbau Large
obteve MCC = 0.6801 +/- 0.0131 (média +/- desvio), à frente do BERTimbau Base
(0.6801 vs 0.6699; com a análise ROPE indicando que Large e Base são praticamente
equivalentes) e de todos os modelos clássicos (melhor clássico: Regressão Logística,
MCC = 0.6477 +/- 0.0140). O **modelo final publicado**, porém, foi treinado e avaliado
**uma única vez** num split estratificado 90/10; não há intervalo de confiança por
bootstrap calculado sobre esse teste retido específico. O MCC do teste retido (0.6825) é
coerente com o intervalo observado no CV.
## 5. Dados de Avaliação
- **Conjuntos de dados**: fatia de teste retida de 10% do `dataset_lai.parquet`, separada
por amostragem estratificada por `is_lai` com semente 271828, e avaliada **uma única vez**.
Tamanho: 4.899 exemplos (proporção `is_lai = 1` de 0.8541, ou seja 4.184 `lai` e 715
`nao_lai`). O teste permaneceu intocado durante todo o treino e a seleção de época.
- **Motivação**: estimar o desempenho de generalização do modelo final em dados não vistos,
preservando a mesma distribuição de classes da população.
- **Pré-processamento**: idêntico ao do treino (concatenação de `resumo_titulo` +
`texto_pedido`, tokenização BERTimbau, truncamento em 510 tokens).
## 6. Dados de Treinamento
- **Conjuntos de dados**: o restante (90%) do `dataset_lai.parquet`, totalizando 44.086
exemplos, dos quais 4.409 foram separados como fatia de **validação** (seleção da melhor
época) e 39.677 usados de fato no treino. O dataset completo tem 48.985 linhas (após
remoção de duplicatas por `texto_pedido`; eram 50.373 manifestações que chegaram como LAI).
- **Motivação**: capturar o texto original do cidadão em manifestações que chegaram como LAI,
para aprender a distinguir pedidos genuínos de LAI daqueles que a ouvidoria reclassifica.
A fonte é o FalaBR, atualizado até 03/06/2026; o domínio é saúde (Ouvidoria do SUS) e os
textos são em português brasileiro.
- **Pré-processamento**:
- Rotulagem reconstruída a partir do `Historico` de cada manifestação: o tipo de chegada
é reconstruído pela gramática de reclassificação (o campo do snapshot é sobrescrito na
reclassificação); o universo é `tipo_chegada == LAI`; `is_lai = 1` se o tipo final
permanece LAI, senão `is_lai = 0`.
- Features seguras: `resumo_titulo` e `texto_pedido` (texto do cidadão, não reescrito).
- Remoção de linhas com texto vazio e deduplicação por `texto_pedido`.
- **Distribuição sobre fatores relevantes**: classes no dataset completo de 49.059 linhas:
`is_lai = 1` (LAI genuíno) com 41.904 exemplos (85.4%) e `is_lai = 0` (reclassificado para
fora) com 7.155 exemplos (14.6%). Entre os `is_lai = 0`, os destinos de reclassificação
mais comuns são Solicitação, Reclamação e Denúncia (com Sugestão e Elogio raros). O texto
do cidadão tem mediana de cerca de 68 palavras na classe `lai` e 52 palavras na classe
`nao_lai`.
## 7. Análises Quantitativas
Resultados no conjunto de teste retido de 10% (4.899 exemplos), avaliado uma única vez.
Métricas globais: **MCC = 0.6825**, acurácia = 0.9139, acurácia balanceada = 0.8655.
- **Resultados unitários** (por classe; F1/precisão/recall da classe indicada):
| Fator | Valor | Métrica | IC 95% |
| ----- | ----- | ------- | ------ |
| Classe `nao_lai` (0) | 0.67 | precisão | não calculado |
| Classe `nao_lai` (0) | 0.80 | recall | não calculado |
| Classe `nao_lai` (0) | 0.73 | F1 (suporte 715) | não calculado |
| Classe `lai` (1) | 0.96 | precisão | não calculado |
| Classe `lai` (1) | 0.93 | recall | não calculado |
| Classe `lai` (1) | 0.95 | F1 (suporte 4184) | não calculado |
| Global | 0.6825 | MCC | não calculado |
| Global | 0.8655 | acurácia balanceada | não calculado |
| Global | 0.9139 | acurácia | não calculado |
Médias agregadas do relatório de classificação: macro F1 = 0.84, weighted F1 = 0.92.
Para referência, na validação cruzada de 10 folds o BERTimbau Large obteve
MCC = 0.6801 +/- 0.0131, fornecendo a melhor estimativa de variabilidade disponível
(intervalos de confiança por bootstrap sobre o teste retido não foram calculados).
- **Resultados interseccionais**: não avaliados. Não foi feito recorte por combinação de
fatores (por exemplo, destino da reclassificação x comprimento do texto). Ver Seção 9.
| Fatores | Valores | Métrica | IC 95% |
| ------- | ------- | ------- | ------ |
| Não aplicável | Não avaliado | Não avaliado | Não avaliado |
## 8. Considerações Éticas
- **Dados sensíveis**: sim. As manifestações contêm dados pessoais (nomes, e-mails, relatos
de saúde) e foram tratadas como sensíveis. O acesso ao banco foi somente leitura e os
textos crus não são publicados junto com o modelo. O modelo não usa atributos protegidos
como feature, mas o texto livre do cidadão pode contê-los implicitamente.
- **Vida humana**: indiretamente. As manifestações referem-se a serviços de saúde do SUS;
uma classificação incorreta pode atrasar ou desviar o encaminhamento de uma demanda do
cidadão. Por isso o modelo deve **assistir**, e não substituir, a triagem humana.
- **Mitigações**: remoção dos campos que vazam o rótulo; ponderação de classe na
perda para o desbalanceamento; seleção de modelo por MCC (robusto ao desbalanceamento);
teste retido avaliado uma única vez; uso apenas das features seguras escritas pelo cidadão;
acesso somente leitura aos dados; não publicação dos textos crus.
- **Riscos e danos**: um falso negativo (pedido de LAI genuíno marcado como `nao_lai`) pode
levar a tratar como não-LAI um pedido que tem direito ao rito da Lei de Acesso à
Informação, prejudicando o cidadão; um falso positivo (manifestação mantida como LAI
indevidamente) pode aplicar prazos/ritos errados. Com recall de 0.80 na classe `nao_lai`,
cerca de 20% das reclassificações verdadeiras passam despercebidas pelo modelo. Viés de
domínio (apenas saúde/SUS) e por órgão/região não foi avaliado.
- **Casos de uso**: qualquer reclassificação automática sem revisão humana; cálculo de
prazos legais; uso fora do domínio de saúde/SUS; aplicação a manifestações que não
chegaram como LAI. Todos merecem cautela.
## 9. Ressalvas e Recomendações
- Não há análise desagregada nem interseccional (por destino da reclassificação, faixa de
comprimento de texto, órgão ou região). Recomenda-se produzi-la antes de uso operacional.
- O modelo final não tem probabilidades calibradas nem ajuste de limiar; se forem usadas
probabilidades, recomenda-se calibração (por exemplo, temperature scaling) e escolha de
limiar conforme o custo relativo de falsos positivos e negativos.
- O desempenho do modelo final vem de um único split 90/10 avaliado uma vez; não há IC por
bootstrap sobre esse teste. A seleção de arquitetura, porém, usou CV de 10 folds com
testes estatísticos (Friedman/Nemenyi e análise bayesiana ROPE).
- O rótulo é um proxy reconstruído (tipo final como verdade da reclassificação), incluindo
cerca de 28 casos `nao_lai` recuperados pelo canal de recurso. Alguns destinos são raros
(por exemplo, Elogio), de modo que o desempenho nesses subcasos é incerto.
- Domínio restrito à saúde/SUS e ao português; transferência para outros órgãos, domínios ou
idiomas não foi testada.
- Há dados pessoais nos textos de entrada: os usuários a jusante devem cumprir a LGPD e não
republicar textos crus.
- Truncamento em 510 tokens: pedidos muito longos são cortados, o que pode descartar
contexto relevante.
- Recomenda-se monitorar deriva (drift): mudanças nos templates e processos do Fala.BR podem
degradar o desempenho ao longo do tempo.
- Um dataset de avaliação ideal para este modelo teria rótulos verificados manualmente (não
apenas reconstruídos do histórico), cobertura balanceada dos destinos de reclassificação e
de órgãos, e exemplos de fronteira entre LAI e não-LAI.