AI: Fundamentos de Dados
Última atualização: 2026-08-26
Os dados são o combustível da IA—sem dados, nem mesmo os melhores algoritmos podem treinar modelos eficazes. Este capítulo ajudará você a entender os tipos de dados, a engenharia de recursos, a divisão de conjuntos de dados e a regra inabalável de "Garbage In, Garbage Out."
1. O Que Você Vai Aprender
- O Papel Central dos Dados em IA
- Dados Estruturados vs. Não Estruturados
- Características e Rótulos
- Divisão do conjunto de dados: treinamento / validação / teste
- Como a Qualidade dos Dados Afeta o Desempenho da IA?
2. Uma História Real de um Projeto de Aprendizado de Máquina
(1) Ponto de Dor: Após um mês de treinamento, a acurácia é 60%
A equipe de Bob passou um mês treinando um modelo de classificação de imagens, mas sua acurácia era de apenas 60%. Ao investigar, eles descobriram que 70% dos dados de treinamento consistiam em imagens tiradas em dias ensolarados, enquanto os cenários do mundo real incluíam uma variedade de condições climáticas—chuva, neblina e noite. Como o modelo nunca tinha "visto" essas condições, naturalmente era incapaz de reconhecê-las.
(2) Soluções Orientadas por Dados
Charlie disse: "Isso é 'Lixo Entra, Lixo Sai'—a IA só pode aprender o que você alimenta ela. Em vez de ajustar os parâmetros do algoritmo, você deveria corrigir a distribuição dos dados primeiro."
▶ Exemplo: Verificando a Distribuição dos Dados—Identificando Inclinação (Dificuldade: ⭐⭐)
# Verifica a distribuição dos dados — primeiro passo antes de qualquer projeto de IA
import pandas as pd
df = pd.DataFrame({
'weather': ['sunny'] * 70 + ['rainy'] * 15 + ['foggy'] * 10 + ['night'] * 5,
'label': ['car'] * 50 + ['car'] * 5 + ['car'] * 3 + ['car'] * 2 +
['truck'] * 20 + ['truck'] * 10 + ['truck'] * 7 + ['truck'] * 3
})
print("Distribuição do clima:")
print(df['weather'].value_counts())
print(f"\nImagens ensolaradas: {70/100*100:.0f}% — Isso é um problema!")
Distribuição do clima:
sunny 70
rainy 15
foggy 10
night 5
Name: weather, dtype: int64
Imagens ensolaradas: 70% — Isso é um problema!
(3) Benefícios: Uma Mentalidade de Dados em Primeiro Lugar
Depois que Bob adicionou imagens para cada condição climática, a taxa de acurácia subiu de 60% para 85%. Ele concluiu que existe uma regra inabalável: "Ajustar o modelo não é tão eficaz quanto ajustar os dados."
3. Tipos de Dados
(1) Classificação por Estrutura
| Tipo | Descrição | Exemplo | Método de Processamento por IA |
|---|---|---|---|
| Estruturado | Possui formato fixo (linhas e colunas) | CSV, tabelas SQL, Excel | Entrada direta em modelos tradicionais de ML |
| Semi-estruturado | Parcialmente estruturado, mas com formato flexível | JSON, XML, HTML, logs | Entrada no modelo após extração de campos |
| Não estruturado | Sem formato fixo | Imagens, áudio, vídeo, linguagem natural | Aprendizado profundo (CNN/RNN/Transformer) |
(2) Classificação por Tipo Numérico
| Tipo | Descrição | Exemplo | Processamento do Modelo |
|---|---|---|---|
| Numérico | Números contínuos ou discretos | Preço, área, idade | Usado diretamente |
| Categórico | Número finito de valores discretos | Gênero, Cidade, Ocupação | Requer codificação (One-Hot) |
| Tipo Texto | Strings de linguagem natural | Comentários, corpo de e-mails | Requer incorporação (embedding) |
| Baseado em Tempo | Data e Hora | Hora do Pedido, Hora do Log | Recursos a extrair (Ano/Mês/Hora) |
4. Características e Rótulos
As características são as entradas do modelo, e os rótulos são os alvos que o modelo prevê.
graph LR
A[Característica 1<br/>Área 120 m²] --> C[Modelo de IA]
B[Característica 2<br/>Quartos 4] --> C
D[Característica 3<br/>Pontuação da Localização 8] --> C
C --> E[Rótulo<br/>Preço R$350.000]
(1) O que é uma Característica?
Uma característica é um atributo nos dados que é "útil para fazer previsões":
| Conjunto de Dados | Características Possíveis | Rótulo |
|---|---|---|
| Dados de Preços de Imóveis | Tamanho, Número de Quartos, Classificação da Localização, Andar | Preço do Imóvel |
| Dados de E-mail | Remetente, Frequência de Palavras-chave, Número de Anexos | É Spam? |
| Dados de Usuário | Idade, Número de Visualizações de Página, Histórico de Compras | Probabilidade de Compra |
| Dados de Imagem | Valores de Pixel (Características Extraídas Automaticamente por Aprendizado Profundo) | Categoria da Imagem |
(2) Engenharia de Características—Extração Manual vs. Automática
▶ Exemplo: Engenharia de Características Manual—Extraindo Características de Texto (Dificuldade: ⭐⭐)
# Example: Manual feature engineering
import pandas as pd
df = pd.DataFrame({
'text': ['Free iPhone winner!', 'Meeting at 3pm', 'URGENT: Claim now'],
'label': ['spam', 'ham', 'spam']
})
# Manual feature extraction: count specific words
df['has_free'] = df['text'].str.lower().str.contains('free').astype(int)
df['has_urgent'] = df['text'].str.lower().str.contains('urgent').astype(int)
df['exclamation_count'] = df['text'].str.count('!')
df['text_length'] = df['text'].str.len()
print(df)
text label has_free has_urgent exclamation_count text_length
0 Free iPhone winner! spam 1 0 1 19
1 Meeting at 3pm ham 0 0 0 14
2 URGENT: Claim now spam 0 1 0 17
5. Divisão do Conjunto de Dados
Ao treinar um modelo de IA, os dados devem ser divididos em três conjuntos mutuamente exclusivos:
graph TB
A[Conjunto Completo<br/>1000 amostras] --> B[Conjunto de Treino<br/>800 amostras<br/>80%]
A --> C[Conjunto de Validação<br/>100 amostras<br/>10%]
A --> D[Conjunto de Teste<br/>100 amostras<br/>10%]
B --> E[Treinar o modelo]
C --> F[Ajustar hiperparâmetros]
D --> G[Avaliação final<br/>nunca usado durante o treino]
| Conjunto | Operação | Proporção | Regras Principais |
|---|---|---|---|
| Conjunto de Treino | Treinar o modelo (aprender parâmetros) | 60–80% | O modelo aprende diretamente a partir deste conjunto |
| Conjunto de Validação | Ajuste de hiperparâmetros (selecionar a configuração ideal) | 10–20% | Afeta indiretamente o modelo, mas não é aprendido diretamente |
| Conjunto de Teste | Avaliação Final (Desempenho Reportado) | 10–20% | Não deve ser usado durante o treino |
(1) Dividindo o Conjunto de Dados Usando Python
▶ Exemplo: Dividindo os Dados em Conjuntos de Treino, Validação e Teste (Dificuldade: ⭐⭐)
# Dividir o conjunto de dados em conjuntos treino/validação/teste
from sklearn.model_selection import train_test_split
import pandas as pd
# Conjunto de dados de exemplo
df = pd.DataFrame({
'area_sqm': [50, 80, 120, 65, 200, 90, 55, 110, 75, 150,
60, 85, 130, 95, 180, 70, 100, 45, 140, 105],
'price_usd': [150000, 280000, 350000, 220000, 500000, 260000,
165000, 320000, 240000, 420000, 175000, 270000,
380000, 290000, 460000, 210000, 300000, 135000,
400000, 310000]
})
# Primeira divisão: 80% treino+validação, 20% teste
train_val, test = train_test_split(df, test_size=0.2, random_state=42)
# Segunda divisão: 75% do train_val = 60% total para treino, 25% = 20% total para validação
train, val = train_test_split(train_val, test_size=0.25, random_state=42)
print(f"Conjunto completo: {len(df)} amostras")
print(f"Conjunto de treino: {len(train)} amostras ({len(train)/len(df)*100:.0f}%)")
print(f"Conjunto de validação: {len(val)} amostras ({len(val)/len(df)*100:.0f}%)")
print(f"Conjunto de teste: {len(test)} amostras ({len(test)/len(df)*100:.0f}%)")
Conjunto completo: 20 amostras
Conjunto de treino: 12 amostras (60%)
Conjunto de validação: 4 amostras (20%)
Conjunto de teste: 4 amostras (20%)
6. Qualidade dos Dados — Entrada Lixo, Saída Lixo
A qualidade dos dados determina diretamente o limite máximo de desempenho da IA. Não importa o quão bom seja o algoritmo, ele não consegue compensar dados de baixa qualidade:
| Problema de Qualidade | Descrição | Impacto | Método de Teste |
|---|---|---|---|
| Valores Faltantes | Certos campos estão vazios | O modelo não consegue processar entradas faltantes | df.isnull().sum() |
| Dados Duplicados | O mesmo registro aparece múltiplas vezes | O modelo se sobrepõe a amostras duplicadas | df.duplicated().sum() |
| Desequilíbrio de Classes | Uma classe tem muito mais amostras que as outras | O modelo favorece a classe majoritária | df[label].value_counts() |
| Ruído/Erros | Os valores dos dados são claramente irracionais | O modelo aprendeu o padrão errado | Detecção de outliers estatísticos |
| Erro de Rótulo | Rotulação incorreta | O modelo aprendeu um mapeamento incorreto | Verificação manual pontual |
(1) Identificando Problemas de Qualidade dos Dados
▶ Exemplo: Relatório de Inspeção de Qualidade dos Dados (Dificuldade: ⭐⭐)
# Checklist de verificação de qualidade dos dados
import pandas as pd
import numpy as np
df = pd.DataFrame({
'age': [25, 30, np.nan, 45, 200, 28, 30, 30, 35, np.nan],
'income': [50000, 60000, 45000, np.nan, 80000, 55000, 60000, 62000, 70000, 48000],
'label': ['buy', 'no', 'buy', 'no', 'buy', 'no', 'no', 'no', 'buy', 'no']
})
print("=== Relatório de Qualidade dos Dados ===")
print(f"Total de linhas: {len(df)}")
print(f"\nValores faltantes por coluna:")
print(df.isnull().sum())
print(f"\nLinhas duplicadas: {df.duplicated().sum()}")
print(f"\nDistribuição dos rótulos:")
print(df['label'].value_counts())
print(f"\nValores suspeitos (idade > 120):")
print(df[df['age'] > 120])
=== Relatório de Qualidade dos Dados ===
Total de linhas: 10
Valores fantantes por coluna:
age 2
income 1
label 0
dtype: int64
Linhas duplicadas: 0
Distribuição dos rótulos:
no 6
buy 4
Name: label, dtype: int64
Valores suspeitos (idade > 120):
age income label
4 200 80000 buy
7. Conjuntos de Dados Públicos Comumente Usados
Conduzir experimentos de IA não necessariamente requer coletar seus próprios dados; muitos conjuntos de dados públicos de alta qualidade estão disponíveis para uso imediato:
| Conjunto de Dados | Tarefa | Número de Amostras | Características |
|---|---|---|---|
| Iris | Categoria | 150 | O conjunto de dados de ML introdutório mais simples |
| Titanic | Categoria | 891 | Desafio Introductory Clássico do Kaggle |
| MNIST | Classificação de Imagens | 70,000 | Dígitos manuscritos, Introdução à Visão Computacional |
| CIFAR-10 | Classificação de imagens | 60,000 | 10 classes de imagens coloridas; mais desafiador que MNIST |
| California Housing | Regressão | 20,640 | Previsão do Preço de Habitação na Califórnia |
| IMDb Reviews | Análise de Sentimento | 50,000 | Classificação de Avaliações de Filmes como Positivas ou Negativas |
8. Exemplo Completo: Pipeline de Preparação de Dados do Titanic
No conjunto de dados do Titanic, complete as seguintes etapas: visão geral dos dados → verificação de valores ausentes → estatísticas de distribuição de categorias → divisão em conjuntos de treinamento e teste, para formar um "pipeline de preparação de dados" completo:
▶ Exemplo: Pipeline de Preparação de Dados Completo para o Conjunto de Dados do Titanic (Dificuldade: ⭐⭐⭐)
# ============================================
# Pipeline de Preparação de Dados Completo
# Conjunto de Dados: Titanic (simulado)
# ============================================
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
# Conjunto de dados simulado semelhante ao Titanic
np.random.seed(42)
df = pd.DataFrame({
'pclass': np.random.choice([1, 2, 3], 100, p=[0.2, 0.3, 0.5]),
'sex': np.random.choice(['male', 'female'], 100, p=[0.6, 0.4]),
'age': np.where(np.random.rand(100) > 0.15,
np.random.randint(1, 80, 100), np.nan),
'fare': np.round(np.random.uniform(10, 500, 100), 2),
'survived': np.random.choice([0, 1], 100, p=[0.6, 0.4])
})
# Etapa 1: Visão geral
print("=== Etapa 1: Visão Geral dos Dados ===")
print(f"Formato: {df.shape}")
print(df.head(5))
# Etapa 2: Valores ausentes
print("\n=== Etapa 2: Valores Ausentes ===")
missing = df.isnull().sum()
missing_pct = (df.isnull().sum() / len(df) * 100).round(1)
print(pd.DataFrame({'contagem': missing, 'percentual': missing_pct}))
# Etapa 3: Distribuição do rótulo
print("\n=== Etapa 3: Distribuição do Rótulo ===")
print(df['survived'].value_counts())
print(f"Taxa de sobrevivência: {df['survived'].mean()*100:.1f}%")
# Etapa 4: Divisão treinamento/teste
train, test = train_test_split(df, test_size=0.2, random_state=42,
stratify=df['survived'])
print(f"\n=== Etapa 4: Divisão dos Dados ===")
print(f"Treinamento: {len(train)} amostras, taxa de sobrevivência: {train['survived'].mean()*100:.1f}%")
print(f"Teste: {len(test)} amostras, taxa de sobrevivência: {test['survived'].mean()*100:.1f}%")
print(f"\nA divisão estratificada garante a mesma taxa de sobrevivência em ambos os conjuntos!")
=== Etapa 1: Visão Geral dos Dados ===
Formato: (100, 5)
pclass sex age fare survived
0 3 female 47.0 339.89 1
1 3 female 63.0 361.38 0
2 1 female 44.0 309.18 0
3 3 male 28.0 385.59 0
4 1 male 8.0 477.95 0
=== Etapa 2: Valores Ausentes ===
contagem percentual
pclass 0 0.0
sex 0 0.0
age 14 14.0
fare 0 0.0
survived 0 0.0
=== Etapa 3: Distribuição do Rótulo ===
0 58
1 42
Name: survived, dtype: int64
Taxa de sobrevivência: 42.0%
=== Etapa 4: Divisão dos Dados ===
Treinamento: 80 amostras, taxa de sobrevivência: 42.5%
Teste: 20 amostras, taxa de sobrevivência: 40.0%
A divisão estratificada garante a mesma taxa de sobrevivência em ambos os conjuntos!
❓ Perguntas Frequentes
Q: A IA fica mais precisa conforme a quantidade de dados aumenta? R: Não necessariamente. A qualidade dos dados é mais importante do que a quantidade. 10.000 registros limpos podem superar 1 milhão de registros ruidosos no treinamento de um modelo melhor. Fatores-chave: volume de dados, qualidade, diversidade e representatividade—todos são essenciais.
Q: Por que o conjunto de treino e teste não podem se sobrepor? R: Porque o conjunto de teste é usado para avaliar a "capacidade real" do modelo. Se o modelo "viu" dados do conjunto de teste durante o treinamento, ele memorizará as respostas em vez de aprender o método—isso é chamado de vazamento de dados e levará a resultados de avaliação inflados.
Q: O que é desequilíbrio de dados? Como pode ser tratado? R: Desequilíbrio de dados refere-se a uma diferença significativa no número de amostras entre diferentes classes (por exemplo, 99% normais vs. 1% anormais). Soluções incluem: ① Coletar mais dados da classe minoritária; ② Sobreamostrar a classe minoritária (SMOTE); ③ Subamostrar a classe majoritária; ④ Ajustar os pesos das classes; ⑤ Usar F1 score em vez de acurácia para avaliação.
Q: O que é engenharia de recursos? Por que é feita? R: Engenharia de recursos é o processo de extrair ou construir novos recursos a partir de dados brutos que sejam úteis para a previsão. Por exemplo, recursos como "se é fim de semana" ou "se é noite" podem ser derivados de "hora do pedido". Uma boa engenharia de recursos pode permitir que modelos simples alcancem resultados comparáveis a modelos complexos, sendo crucial no aprendizado de máquina tradicional. O aprendizado profundo pode realizar automaticamente a extração de recursos, reduzindo a necessidade de engenharia de recursos manual.
Q: Onde posso encontrar conjuntos de dados gratuitos? R: Kaggle (kaggle.com/datasets), UCI Machine Learning Repository, Google Dataset Search, Hugging Face Datasets e plataformas de dados abertos governamentais. Este tutorial usa os conjuntos de dados incluídos com o sklearn, portanto não é necessário download adicional.
Q: O que é divisão estratificada? R: Uma divisão aleatória padrão pode resultar em um desequilíbrio nas proporções de classes entre os conjuntos de treino e teste. Uma divisão estratificada garante que as proporções de classes em cada conjunto correspondam às dos dados originais. Para conjuntos de dados desequilibrados (como 90% vs. 10%), uma divisão estratificada é praticamente essencial.
📖 Resumo
- Dados são o combustível para IA; sem dados de alta qualidade, não pode haver bons modelos—Lixo Entrando, Lixo Saindo
- Os dados são divididos em três categorias: estruturados (tabelas), semi-estruturados (JSON/XML) e não estruturados (imagens/texto/áudio)
- As features são as entradas do modelo, e os labels são os alvos que o modelo prevê; a engenharia de features é uma habilidade fundamental no aprendizado de máquina tradicional.
- O conjunto de dados deve ser dividido em um conjunto de treinamento, um conjunto de validação e um conjunto de teste; o conjunto de teste nunca deve ser usado durante o treinamento.
- Problemas de qualidade dos dados (valores faltantes, duplicatas, desbalanceamento, ruído e labels incorretos) devem ser resolvidos nos estágios iniciais; treinar um modelo não conserta dados ruins.
- Conjuntos de dados públicos (Iris, Titanic, MNIST) são o melhor ponto de partida para aprender sobre IA
📝 Exercícios
- Exercício Básico (Dificuldade ⭐): Carregue um conjunto de dados CSV (ou um conjunto de dados incluído com o sklearn) usando Python, e use
df.info()edf.describe()para resumir as informações básicas. - Problema Avançado (Dificuldade ⭐⭐): Verifique a existência de valores ausentes e examine a distribuição das categorias nos dados, depois plote um histograma de uma coluna específica (Dica:
df[column].hist()). - Problema Desafiador (Dificuldade ⭐⭐⭐): Use
train_test_splitpara dividir os dados de acordo com a regra 80/20, e compare se as proporções das categorias são as mesmas após uma divisão padrão e uma divisão estratificada.