Capítulo 1.2 — Dados reais, qualidade e modos de falha¶
🎯 Objetivo¶
Tratar dados como o principal risco operacional de um sistema de ML.
🧠 Origens de dados¶
| Fonte | Característica | Risco principal |
|---|---|---|
| Logs e eventos | Semi-estruturados, alto volume | Parsing frágil, schema implícito |
| Sistemas transacionais | Estruturados, históricos | Mudança de schema, snapshot vs ponto-no-tempo |
| Data lake / warehouse | Volume, latência | Freshness e governança |
| APIs externas | Heterogêneo, dependência | Latência, rate limit, contrato instável |
| Dados manuais | Inseridos por usuários | Erros, viés, inconsistência |
| Dados sintéticos | Gerados artificialmente | Falsa representatividade |
🚨 Modos de falha de dados¶
- Label leakage - variável próxima do label entra como feature.
- Target leakage - feature contém informação futura.
- Distribution shift - produção difere de treino.
- Class imbalance - classes raras dominam o erro.
- Selection bias - coleta de dados enviesada.
- Late labels - rótulos chegam com atraso, criando feedback distorcido.
- Cross-tenant leakage - dados de um tenant aparecem em modelo de outro.
- Stale data - dado expirado tratado como atual.
- Schema drift silencioso - mudança upstream sem aviso.
🛡️ Controles¶
- Data contracts (YAML/JSON) versionados, com regras de qualidade.
- Validação automática em pipeline (Great Expectations, Pandera, dbt tests).
- Lineage registrada via data orchestrator (Dagster, Airflow).
- Isolamento por tenant desde a ingestão.
- Detecção de drift (Evidently, custom KS/PSI).
📝 Exemplo de data contract¶
name: transacoes_v1
description: Dataset de transações para detecção de fraude.
owner: equipe-fraude
version: 1.2.0
schema:
- name: transaction_id
type: string
required: true
unique: true
- name: timestamp
type: datetime
required: true
- name: amount
type: float
required: true
- name: user_id
type: string
required: true
- name: tenant_id
type: string
required: true
quality:
freshness_minutes: 60
completeness_pct: 99.9
contracts:
- rule: "timestamp <= now()"
description: "Eventos futuros são inválidos"
- rule: "amount >= 0"
description: "Valores negativos rejeitados"
- rule: "tenant_id IN allowlist"
description: "Tenants conhecidos apenas"
🧰 Exemplo prático relacionado (planejado)¶
EX-ML-01- pipeline scikit-learn + pandera para validar features.
📌 Checklist¶
- [ ] Dataset tem data contract versionado?
- [ ] Validações falham o pipeline (e não passam silenciosamente)?
- [ ] Lineage está registrada?
📚 Referências¶
- Evidently AI - Concept drift: https://www.evidentlyai.com/ml-in-production/concept-drift
- Great Expectations docs: https://docs.greatexpectations.io/
- Pandera docs: https://pandera.readthedocs.io/