Inteligência Artificial · 1.º ano (indicativo)

Como dividir os dados em treino e teste?

  • 9 min de leitura
  • 4 exemplos resolvidos
  • 5 exercícios com solução
  • Atualizado em

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

ConjuntoPara que serveProporção típica
Treinoo modelo ajusta os seus parâmetros60% a 80%
Validaçãoescolher hiperparâmetros e comparar modelos10% a 20%
Testemedida final, usada uma única vez10% 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

  1. Limpe e guarde X e y em separado (características e rótulo).
  2. Decida as proporções (por exemplo 80/20 ou 70/15/15), conforme a quantidade de dados.
  3. 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).
  4. Preserve a distribuição das classes (estratificação) quando as classes forem desequilibradas.
  5. Fixe a semente (random_state) para que a divisão seja reprodutível.
  6. 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.
  7. 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:

  1. Treino = 80% de 100 = 0,8 × 100 = 80.
  2. 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:

  1. Importe a função: from sklearn.model_selection import train_test_split.
  2. Chame-a: X_treino, X_teste, y_treino, y_teste = train_test_split(X, y, test_size=0.2, random_state=42).
  3. A função baralha as linhas e devolve quatro conjuntos, pela ordem indicada.
  4. 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:

  1. Treino = 160 clientes; teste = 40 clientes.
  2. A estratificação mantém os 20% de incumpridores em cada conjunto.
  3. Treino: 0,2 × 160 = 32 incumpridores. Teste: 0,2 × 40 = 8 incumpridores.
  4. 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:

  1. Média apenas do treino: (10 + 20 + 30) ÷ 3 = 20. O valor 40 passa a 40 − 20 = 20.
  2. Média de todos os dados (errado): (10 + 20 + 30 + 40) ÷ 4 = 25. O valor 40 passa a 40 − 25 = 15.
  3. No segundo caso, a média incorpora o valor de teste, ou seja, a informação do teste influenciou o pré-processamento.
  4. 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 fit do 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

Tente resolver primeiro no caderno; depois confira.

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_state e use stratify=y quando 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_split e 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

1.º ano (indicativo)10 min

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

Ver tudo de Inteligência Artificial