Overview
Dados em Aprendizado de Máquina
Um modelo treinado é uma função ajustada a uma amostra. Tudo o que ele algum dia saberá sobre o mundo chega pelas linhas que você entregou e toda decisão tomada antes do treinamento — o que coletar, o que manter, o que corrigir, o que normalizar, o que guardar de fora — é uma decisão sobre o que o modelo consegue aprender. Nenhuma delas envolve um único peso.
"Lixo entra, lixo sai" é verdade e quase inútil, porque não diz qual lixo nem como você saberia. Este capítulo é a versão específica: o punhado de decisões tomadas antes de existir modelo algum, o que cada uma pode quebrar e como saber se você acertou.
A ideia estrutural
O pipeline de dados tem uma linha atravessada nele — a divisão treino/teste — e uma regra governa tudo dos dois lados:
Nada que aprenda um número a partir dos dados pode ser ajustado antes da divisão.
Uma média, uma mediana, um vocabulário, uma média por categoria, um conjunto de componentes principais, uma lista de colunas selecionadas: cada um é um parâmetro estimado a partir de linhas. Estime-o usando linhas contra as quais você vai pontuar depois e a pontuação deixa de medir generalização. Todo o resto deste capítulo é consequência dessa frase, ou uma maneira de conferi-la.
A ordem das operações
flowchart LR
A["coletar"] --> B["explorar"]
B --> C["limpar<br/><small>correções linha a linha</small>"]
C --> D["DIVIDIR"]
D --> E["ajustar transformadores<br/><small>só no treino</small>"]
E --> F["treinar"]
F --> G["avaliar<br/><small>uma vez</small>"]
style D fill:#f0883e,stroke:#f0883e,color:#0d1117
style G fill:#7fad7f,stroke:#3fb950 A ordem não é preferência de estilo. Cada passo está onde está por causa do que ele aprende:
| Passo | Estima alguma coisa a partir dos dados? | Onde pertence |
|---|---|---|
Ler um histograma, um describe(), um gráfico de dispersão | não — mas você aprende | antes, gastando a curiosidade com cuidado |
| Remover linhas exatamente duplicadas | não | antes |
| Corrigir um erro de unidade, um erro de digitação, uma sentinela conhecida | não | antes |
| Preencher uma lacuna com a mediana | sim | depois — dentro do pipeline |
| Padronizar, escalar min-max | sim | depois — dentro do pipeline |
| Construir um vocabulário de categorias, fazer target encoding | sim | depois — dentro do pipeline |
| Selecionar as k melhores features | sim | depois — dentro do pipeline |
| Sobreamostrar a classe minoritária | sim | depois — só na dobra de treino |
| PCA, t-SNE, qualquer projeção aprendida | sim | depois — dentro do pipeline |
A coluna do meio é o teste. Se um passo produziria um número diferente ao receber outro conjunto de linhas, ele tem parâmetros — e parâmetros estimados a partir do conjunto de teste são parâmetros que o conjunto de teste já não pode julgar.
A parte que pega todo mundo
Acertar isso uma vez, para uma única divisão, é fácil. No instante em que você faz validação cruzada, ajusta hiperparâmetros ou faz bootstrap, um scaler.fit(X_train) escrito à mão é ajustado uma vez enquanto as dobras mudam cinco vezes — e todas as dobras ficam contaminadas de novo. A única versão da regra que sobrevive à reamostragem é um Pipeline. Veja vazamento de dados.
Onde cada coisa dá errado
Cada tópico deste capítulo é uma etapa desse pipeline falhando.
-
Tipos de Features
Que tipo de coisa está em cada coluna e por que não dá para simplesmente contar isso ao modelo. Erre aqui e a rede assume em silêncio que
azul > vermelho. -
Distribuições
Como as colunas são antes de você tocar nelas — forma, escala, assimetria, modas — e o que cada uma dessas coisas implica para a transformação que você está prestes a escolher.
-
Divisão Treino / Val / Teste
A linha do diagrama. Para que serve cada um dos três conjuntos, por que três e não dois e a única regra sobre o conjunto de teste que todo mundo quebra.
-
Vazamento de Dados
O que acontece quando informação atravessa essa linha. Quatro mecanismos, cada um medido: um filtro rodado antes da divisão transforma ruído puro em 0,870 de acurácia.
-
Qualidade dos Dados
Valores faltantes, outliers, duplicatas — e a coluna que ninguém audita, os rótulos. Uma rede ajusta 40% de rótulos errados até uma pontuação de treino perfeita.
-
Desbalanceamento de Classes
Quando uma classe é 1% das linhas, a acurácia deixa de ser uma medida. O que mudar: a amostragem, a perda, o limiar ou a métrica.
-
Pré-processamento
Tudo à direita da linha: escalar, codificar, transformar assimetria e projetar para baixo. Cada uma dessas coisas é ajustada, então cada uma pertence ao pipeline.
-
Handouts
Três roteiros de aula completos — análise exploratória, normalização e redução de dimensionalidade — em página única, mais um notebook no Colab que percorre o caminho inteiro.
Onde conseguir dados
| Fonte | Domínio | Formato |
|---|---|---|
| UCI ML Repository | geral, pequenos, clássicos | CSV, ARFF |
| OpenML | benchmarks com metadados e resultados publicados | ARFF, Parquet |
| Kaggle Datasets | tudo, com qualidade variando muito | CSV, JSON |
| Hugging Face Datasets | PLN, visão, áudio, em escala | Arrow, Parquet |
| TensorFlow Datasets | visão, PLN, áudio, prontos para stream | TFRecord |
| Papers With Code | benchmarks de pesquisa, com placares | vários |
| Google Dataset Search | índice da web inteira | vários |
Antes de baixar qualquer coisa, pergunte de que aquilo é amostra
Um conjunto de dados é uma amostra de alguma população, tirada por algum processo, em algum momento. Um modelo treinado nele herda cada uma dessas três coisas. A pergunta que importa não é "este conjunto está limpo?" mas "a população de onde ele veio é a população em que meu modelo vai ser implantado?". Um benchmark que todo mundo usa não está isento — veja a auditoria de erros de rótulo em qualidade dos dados.