Machine learning do zero · Aula 3.1 · 14 de 33 aulas prontas · 10 min
Overfitting: quando o modelo decora
Em resumo
Um modelo flexível pode acertar todo o treino e ainda falhar com dados novos. Quando o grau de um polinômio sobe, os erros de treino e de teste se separam.
Aquecimento Duas perguntas de aulas anteriores. Um minuto, e a aula nunca fica bloqueada.
Duas estudantes se preparam para uma prova de matemática. Uma estuda as ideias por trás dos problemas. A outra decora, palavra por palavra, as respostas de todas as provas antigas. Nas provas antigas, a segunda é impecável. Aí chega a prova de verdade, com números novos. Em quem você aposta? Os modelos enfrentam exatamente essa escolha e, se deixados por conta própria, um modelo flexível vira, todo feliz, a segunda estudante.
Escolha uma resposta e o seu grau de certeza.
Responda para liberar o experimento.
Experimento interativo
Este experimento interativo funciona em um navegador com JavaScript ativado. O texto ao redor descreve o que ele mostra.
Ver a resposta
Resposta certa: Grau 1 (uma reta simples)
O grau 1 é o melhor: erro de teste de 64,1. O grau 3 tem 65,2, o grau 6 tem 70,3 e o grau 10 chega a 132,6, embora o erro de treino caia de 60,2 (grau 1) para 51,1 (grau 10). Mais flexibilidade reduz o erro de treino, mas não o de teste.
Experimente
- Comece no grau 1 e anote os dois erros. Depois suba o controle do grau um passo de cada vez e veja o erro de treino cair.
- Continue subindo e observe o erro de teste. Encontre o grau em que ele é mais baixo — esse é o ponto ideal para esta amostra.
- Leve o controle do grau ao máximo. Olhe a curva entre os pontos: ela ainda parece uma descrição sensata de como o IMC se relaciona com a progressão?
- Compare a distância entre o erro de treino e o de teste no grau mais baixo e no mais alto. Uma distância que cresce é a impressão digital do overfitting.
A ideia em poucas palavras
Vamos ver agora, em palavras simples, o que você acabou de manipular.
Na lição 3, ajustamos uma reta. Uma reta é rígida: não consegue se curvar para acompanhar uma curva, mesmo quando os dados claramente se curvam. Um polinômio é uma família de curvas mais flexível:
ŷ = w₀ + w₁x + w₂x² + … + w_d·x^d
O grau d controla a flexibilidade. Grau 1 é a reta; grau 2 consegue fazer uma curva; graus mais altos conseguem ondular cada vez mais. Com grau suficiente, um polinômio passa por todos os pontos de treino.
Parece sucesso, mas dados reais têm ruído — variação aleatória que nenhum atributo explica. Dois pacientes com o mesmo IMC não progridem do mesmo jeito. Um modelo flexível o bastante para acertar cada ponto não aprende só a tendência; aprende também o ruído, os acidentes desta amostra específica. Isso é overfitting (sobreajuste): o modelo se ajusta cada vez melhor aos dados de treino enquanto as previsões para dados novos pioram. A falha oposta, um modelo rígido demais para captar o padrão real, é o underfitting (subajuste).
Por que funciona
Pegue uma pequena amostra aleatória dos pacientes com diabetes da lição 3 e divida-a em pontos de treino e de teste. Uma amostra pequena deixa o efeito fácil de ver, porque alguns pontos incomuns conseguem arrastar uma curva flexível para bem longe.
Acompanhe o que acontece com os dois erros quando o grau sobe. O erro de treino não para de cair: uma curva mais flexível sempre consegue se sair pelo menos tão bem nos pontos em que é ajustada, porque pode imitar qualquer curva mais simples. O erro de teste se comporta de outro jeito. No começo ele também cai, porque a flexibilidade extra captura estrutura real. Depois, a partir de certo grau, começa a subir, porque a curva se dobra para perseguir pontos de treino específicos, e essas dobras estão erradas para todo o resto. O resultado é o famoso formato de U do erro de teste.
O motivo tem nome: o dilema viés-variância. Um modelo rígido tem viés alto — erra de forma sistemática, seja qual for a amostra. Um modelo muito flexível tem variância alta — pegue uma amostra um pouco diferente e você terá uma curva completamente diferente. O melhor modelo fica no meio, flexível o bastante para seguir o sinal e rígido o bastante para ignorar o ruído. Onde fica esse ponto depende de quantos dados você tem: com mais dados, o ruído se dilui na média e mais flexibilidade passa a ser segura.
Erro comum
O erro fundamental é escolher a complexidade do modelo pelo erro de treino. O erro de treino sempre recompensa a flexibilidade, então ele sempre vai votar no modelo mais complexo — a estudante que decora. O segundo erro é achar que overfitting é raro ou exótico. É o comportamento padrão de qualquer modelo flexível com dados limitados, o que inclui árvores de decisão, redes neurais e quase tudo o que você vai construir. A solução não é evitar modelos flexíveis, e sim controlá-los: modelos mais simples, mais dados ou regularização, que penaliza pesos extremos.
Há uma pegadinha escondida neste raciocínio: escolhemos o melhor grau olhando o erro de teste, exatamente o que a lição 2 disse para não fazer. Na próxima lição aprendemos a escolher configurações de forma honesta, com validação e validação cruzada.
Pegue o erro da IA
Foi assim que um chatbot respondeu. Uma frase está errada. Qual?
Pergunta: Ajustei polinômios de grau 1 a 10 a 30 pacientes, IMC contra progressão da doença. Qual grau devo escolher?
Mostrar a frase errada
A frase errada: Assim, o grau com o menor erro de treino, aqui o grau 10, também é o que vai prever melhor os pacientes novos.
O erro de treino sempre recompensa a flexibilidade, então não serve para escolher o grau. Na lição o grau 10 tem o menor erro de treino (51,1 contra 60,2 do grau 1), mas seu erro de teste é 132,6, mais que o dobro dos 64,1 da reta.
Quiz
Três perguntas para você se testar. Escolha uma resposta ou abra a resposta embaixo de cada pergunta. No teclado: as setas escolhem, Enter ou Espaço confirma.
Pontos-chave
- Overfitting é ajustar o ruído dos dados de treino, o que piora o desempenho no teste.
- O erro de treino sempre recompensa a flexibilidade; só dados com os quais o modelo não aprendeu revelam o overfitting.
- O erro de teste costuma formar um U conforme a complexidade cresce: underfitting de um lado, overfitting do outro.
- Mais dados, modelos mais simples e regularização reduzem o overfitting.
Mais a fundo: fórmula, código, prática
A matemática
Um polinômio de grau d tem d + 1 pesos: ŷ = w₀ + w₁x + … + w_d·x^d. Ajustar por mínimos quadrados minimiza o erro de treino. Todo polinômio de grau d − 1 é também um polinômio de grau d (com w_d = 0), então o melhor erro de treino só pode ficar igual ou cair quando d cresce. Com n pontos que têm todos x diferentes, o grau n − 1 passa por todos os pontos e o erro de treino é 0.
O erro de teste se divide em três partes: E[(y − ŷ)²] = bias² + variance + σ². O viés é o erro sistemático de um modelo rígido demais. A variância é o quanto a curva ajustada muda entre amostras. σ² é o ruído que ninguém consegue remover. Um grau maior reduz o viés e aumenta a variância, o que dá o formato de U.
O lab informa o RMSE, √MSE, nas unidades da variável alvo.
No código (Python)
Trinta pacientes de diabetes sorteados como conjunto de treino, e os demais pacientes (dentro da faixa de IMC do treino) como conjunto de teste. É o mesmo tipo de experimento do lab, mas com outra amostra aleatória, então os números diferem dos do lab:
import numpy as np
from sklearn.datasets import load_diabetes
X, y = load_diabetes(return_X_y=True, as_frame=True, scaled=False)
x, y = X["bmi"].to_numpy(), y.to_numpy()
perm = np.random.default_rng(0).permutation(len(x))
tr, te = perm[:30], perm[30:]
te = te[(x[te] >= x[tr].min()) & (x[te] <= x[tr].max())] # ficar dentro da faixa do treino
rmse = lambda i, p: np.sqrt(np.mean((y[i] - p(x[i])) ** 2))
for deg in (1, 3, 10):
p = np.polynomial.Polynomial.fit(x[tr], y[tr], deg) # ajusta sobre um x reescalado, então o grau 10 é estável
print(f"degree {deg:2d}: train RMSE {rmse(tr, p):6.1f}, test RMSE {rmse(te, p):6.1f}")
Saída
degree 1: train RMSE 61.6, test RMSE 63.5
degree 3: train RMSE 60.9, test RMSE 63.8
degree 10: train RMSE 54.7, test RMSE 199.5
O erro de treino continua caindo com o grau. O erro de teste do grau 10 é mais de três vezes o do grau 1.
Baixar o notebook (.ipynb). Abra no Jupyter ou envie para o Google Colab; ele baixa sozinho os dados que faltarem.
Para quem pratica
- Nunca escolha o grau, nem qualquer outro ajuste de flexibilidade, pelo erro de treino. Ele sempre vota no modelo mais flexível.
- Olhe a diferença entre o erro de treino e o de teste. Um erro de treino pequeno com um erro de teste grande indica overfitting. Os dois erros altos indicam underfitting.
- Polinômios de grau alto explodem fora da faixa dos dados de treino. Não os use para extrapolar.
- Com uma única amostra pequena o quadro é ruidoso. Repita a divisão com várias sementes antes de confiar em um “melhor grau”.
- Para manter um modelo flexível sob controle, tente mais dados, um modelo mais simples ou regularização (ridge, lasso) antes de abrir mão por completo da flexibilidade.
Isto foi útil?
Obrigado! Isso nos ajuda a melhorar.
Vá mais fundo no Atlas
Verbetes da enciclopédia sobre as ideias desta aula: