Inteligência Artificial · 1.º ano (indicativo)
Como dividir os dados em treino e teste?
Resposta curta
Separe os dados antes de treinar: uma parte (por exemplo 80%) para o modelo aprender e outra (20%) que ele nunca viu, para medir o desempenho real. Misture as linhas, fixe a semente aleatória, preserve as proporções das classes e faça qualquer pré-processamento só com os dados de treino.
Quando se aplica
Aplica-se em quase todos os problemas de aprendizagem supervisionada (classificação e regressão). Um modelo pode «decorar» os exemplos com que treinou e ainda assim falhar com dados novos, o chamado sobreajuste (overfitting). A única forma honesta de saber como se vai comportar na vida real é testá-lo em dados que ficaram de fora do treino.
Pré-requisitos
- Saber o que são características (X) e rótulo ou alvo (y).
- Noções de exatidão (accuracy): percentagem de previsões certas.
- Para os exemplos de código, a biblioteca scikit-learn (Python).
Os conjuntos
| Conjunto | Para que serve | Proporção típica |
|---|---|---|
| Treino | o modelo ajusta os seus parâmetros | 60% a 80% |
| Validação | escolher hiperparâmetros e comparar modelos | 10% a 20% |
| Teste | medida final, usada uma única vez | 10% a 20% |
As proporções não são lei: com poucos dados costuma usar-se validação cruzada; com milhões de exemplos, bastam percentagens pequenas para teste.
Método passo a passo
- Limpe e guarde X e y em separado (características e rótulo).
- Decida as proporções (por exemplo 80/20 ou 70/15/15), conforme a quantidade de dados.
- Escolha como dividir: de forma aleatória na maioria dos casos; por ordem cronológica se os dados forem séries temporais (treinar no passado, testar no futuro).
- Preserve a distribuição das classes (estratificação) quando as classes forem desequilibradas.
- Fixe a semente (
random_state) para que a divisão seja reprodutível. - Divida primeiro, trate depois: normalização, preenchimento de valores em falta e seleção de características são calculados só com os dados de treino e depois aplicados ao teste.
- Treine no treino, ajuste na validação e meça no teste uma única vez. Compare a exatidão no treino com a do teste.
Atenção
Se calcular a média ou o desvio padrão com todos os dados antes de dividir, o conjunto de teste «espreita» o treino. Isto chama-se fuga de dados (data leakage) e dá resultados otimistas que não se repetem na prática.
Exemplos resolvidos
Exemplo 1 — Fazer as contas de uma divisão 80/20
Enunciado: Um conjunto tem 100 amostras e quer uma divisão 80/20. Quantas amostras ficam em cada conjunto?
Resolução:
- Treino = 80% de 100 = 0,8 × 100 = 80.
- Teste = 20% de 100 = 0,2 × 100 = 20.
Resposta: 80 amostras de treino e 20 de teste. Verificação: 80 + 20 = 100.
Exemplo 2 — A divisão em scikit-learn
Enunciado: Escreva o código que divide X e y em 80% de treino e 20% de teste, de forma reprodutível.
Resolução:
- Importe a função:
from sklearn.model_selection import train_test_split. - Chame-a:
X_treino, X_teste, y_treino, y_teste = train_test_split(X, y, test_size=0.2, random_state=42). - A função baralha as linhas e devolve quatro conjuntos, pela ordem indicada.
- Com a mesma semente (42), obtém sempre a mesma divisão.
Resposta: a linha do passo 2 produz 80% de treino e 20% de teste. Verificação: len(X_treino) deve ser 80 se X tiver 100 linhas.
Exemplo 3 — Divisão estratificada
Enunciado: Há 200 clientes de um banco, 40 dos quais não pagaram o crédito (20%). Divide-se 80/20 com estratificação. Quantos incumpridores ficam em cada conjunto?
Resolução:
- Treino = 160 clientes; teste = 40 clientes.
- A estratificação mantém os 20% de incumpridores em cada conjunto.
- Treino: 0,2 × 160 = 32 incumpridores. Teste: 0,2 × 40 = 8 incumpridores.
- Em código:
train_test_split(X, y, test_size=0.2, stratify=y, random_state=42).
Resposta: 32 no treino e 8 no teste. Verificação: 32 + 8 = 40, o total de incumpridores. Sem estratificação, o teste podia ficar com poucos ou nenhum caso de incumprimento.
Exemplo 4 — Nível de exame: fuga de dados
Enunciado: Os valores de uma característica são 10, 20, 30 (treino) e 40 (teste). Quer centrar os dados subtraindo a média. Mostre o que acontece ao valor de teste ao calcular a média só com o treino e com todos os dados.
Resolução:
- Média apenas do treino: (10 + 20 + 30) ÷ 3 = 20. O valor 40 passa a 40 − 20 = 20.
- Média de todos os dados (errado): (10 + 20 + 30 + 40) ÷ 4 = 25. O valor 40 passa a 40 − 25 = 15.
- No segundo caso, a média incorpora o valor de teste, ou seja, a informação do teste influenciou o pré-processamento.
- A regra é: ajustar (calcular a média) apenas no treino e aplicar a mesma transformação ao teste.
Resposta: o procedimento correto dá 20, o errado dá 15. Verificação: na vida real, a média dos dados futuros não é conhecida, por isso só o treino pode ser usado.
Erros frequentes
- Treinar e testar com os mesmos dados. A exatidão sai quase perfeita e não diz nada sobre dados novos.
- Não baralhar os dados quando estão ordenados (por classe, por data). O teste pode ficar com uma só classe.
- Dividir por ordem aleatória uma série temporal: o modelo «vê o futuro». Divida por data.
- Normalizar antes de dividir. Faça
fitdo normalizador só no treino. - Usar o conjunto de teste para escolher o modelo. Para isso serve a validação; o teste é a prova final, usada uma só vez.
- Esquecer a semente, e por isso não conseguir repetir os resultados.
- Ignorar duplicados: se a mesma linha estiver no treino e no teste, a medida fica inflacionada.
- Ficar pelo valor de exatidão quando as classes são muito desequilibradas.
Exercícios propostos
1Exercício 1
Um conjunto tem 1 500 exemplos. Quantos ficam no treino e no teste com uma divisão 70/30?
Ver solução
Treino: 0,7 × 1 500 = 1 050. Teste: 0,3 × 1 500 = 450. Soma: 1 050 + 450 = 1 500.
2Exercício 2
Divida 500 amostras em treino, validação e teste na proporção 60/20/20. Indique o número de amostras de cada conjunto.
Ver solução
Treino: 0,6 × 500 = 300. Validação: 0,2 × 500 = 100. Teste: 0,2 × 500 = 100. Soma: 300 + 100 + 100 = 500.
3Exercício 3
Um conjunto de 1 000 pacientes tem 10% de casos positivos. Com test_size=0.25 e estratificação, quantos casos positivos ficam em cada conjunto?
Ver dica
Calcule primeiro o tamanho de cada conjunto.
Ver solução
Teste: 0,25 × 1 000 = 250 pacientes. Treino: 750. A estratificação mantém 10%: teste, 0,1 × 250 = 25 positivos; treino, 0,1 × 750 = 75 positivos. Total: 25 + 75 = 100, que é 10% de 1 000.
4Exercício 4
Um modelo tem 98% de exatidão no treino e 72% no teste. O que significa e o que pode fazer?
Ver solução
Há uma grande diferença entre o treino e o teste, o que indica sobreajuste: o modelo decorou o treino e generaliza mal. Pode simplificar o modelo, recolher mais dados, usar regularização, reduzir características ou aplicar validação cruzada para escolher os parâmetros.
5Exercício 5
Um conjunto de 100 dados vai ser avaliado com validação cruzada de 5 partes (5-fold). Quantas amostras de treino e de validação tem cada volta e quantas vezes se treina o modelo?
Ver dica
Cada parte serve uma vez de validação.
Ver solução
Cada parte tem 100 ÷ 5 = 20 amostras. Em cada volta, 20 amostras servem de validação e 80 de treino. O modelo é treinado 5 vezes, e a medida final é a média das 5 exatidões.
Perguntas frequentes
Qual é a melhor proporção entre treino e teste?
Não existe uma única. 80/20 e 70/30 são comuns. Com poucos dados, convém um conjunto de teste suficientemente grande para ser representativo e usar validação cruzada; com muitos dados, 1% ou 2% de teste já podem chegar.
Para que serve o conjunto de validação se já tenho o de teste?
A validação serve para escolher modelos e hiperparâmetros. Se usar o teste para essas escolhas, deixa de ser «dados nunca vistos» e a medida final fica otimista. O teste fica guardado para o fim.
Posso baralhar sempre os dados antes de dividir?
Não em séries temporais, onde a ordem importa: treina-se com o período mais antigo e testa-se com o mais recente. Em dados sem ordem relevante, deve baralhar-se.
Preciso de dividir os dados em aprendizagem não supervisionada?
Nem sempre, pois não há rótulo a prever. Mesmo assim, guardar dados à parte ajuda a avaliar se, por exemplo, os grupos encontrados se mantêm em dados novos.
Resumo
- Divida os dados antes de treinar; o modelo é avaliado em dados que nunca viu.
- Proporções frequentes: 80/20 ou 70/30; use validação ou validação cruzada para escolher modelos.
- Fixe
random_statee usestratify=yquando as classes forem desequilibradas. - Em séries temporais divida por data, sem baralhar.
- Calcule normalização e outros ajustes só no treino, para evitar fuga de dados.
Onde aprofundar
- O programa e o manual da sua cadeira de Inteligência Artificial.
- A documentação do scikit-learn, nas secções sobre
train_test_splite validação cruzada (confirme a versão). - Russell e Norvig, Artificial Intelligence: A Modern Approach, no capítulo sobre aprendizagem a partir de exemplos (confirme a edição); Goodfellow et al., Deep Learning, capítulo sobre fundamentos de aprendizagem automática.
Continue a estudar
Como escolher um algoritmo de ML para um problema?
Primeiro identifique o tipo de problema: prever uma categoria (classificação), prever um número (regressão) ou encontrar grupos sem rótulos (agrupamento). Depois olhe…
4 exemplos5 exercícios com solução✓ Estudado