Regressão Polinomial - Regressão Polinomial no R | Linguagem, Equações polinomiais, Os resultados
Regressão Polinomial no R | Linguagem, Equações polinomiais, Os resultados

Como ajustar uma curva polinomial sem se perder em overfitting

A maioria das pessoas tenta o modelo de grau 3 e se surpreende quando o gráfico parece um desenho animado de montanha-russa. Isso acontece porque elas não verificam a validação cruzada antes de confiar nos coeficientes. Eu passei semanas no passado ajustando modelos que pareciam perfeitos no treinamento e falhavam completamente em dados novos, então hoje sigo um ritual bem simples: separo os dados, ajusto do grau 1 ao 6, comparo o erro de validação e fico com o primeiro que estabiliza. O conceito por trás da regressão polinomial é basicamente estender a reta dos mínimos quadrados para capturar curvatura. Em vez de modelar y como uma combinação linear das variáveis originais, você adiciona potências de x ao mix. A mágica é que, embora a relação entre x e y não seja linear, a relação entre y e os termos x, x², x³ ainda é linear nos coeficientes, então todo o arsenal dos mínimos quadrados ordinários continua válido. Isso significa que você pode resolver com uma única operação de álgebra linear, sem precisar de métodos numéricos complicados.

Escolhendo o grau certo

Eu costumo começar gerando uma matriz de features polinomiais e testando graus de 1 a 7. O que a maioria não entende é que aumentar o grau quase sempre melhora o R² no treino, mas isso não significa nada. Eu já vi colegas ficarem impressionados com R² de 0,99 em polinômios de grau 10 e só perceberem o desastre quando tentaram prever a próxima observação. A forma mais prática de evitar isso é usar validação cruzada k-fold com k=5 ou 10 e observar o erro médio nas dobras. Um detalhe que pouca gente leva a sério é a escalagem. Se você não centralizar e padronizar as features polinomiais, os termos de grau alto vão dominar numericamente e o solver pode instabilizar. No caso específico que eu enfrentei meses atrás, estava trabalhando com dados de temperatura ao longo do tempo em que os valores de x variavam entre 0 e 180. Quando gerava x³ e x sem escalonamento, a condição da matriz de projeto ficava tão ruim que o algoritmo de decomposição SVD disparava warnings de singularidade. Minha solução foi aplicar StandardScaler antes de gerar os termos polinomiais, o que reduziu o número de condição de algo em torno de 10 para algo na casa de 10². A diferença na precisão dos coeficientes era impressionante.

O erro de validação tende a seguir uma curva em U conforme você aumenta o grau. Graus baixos subajustam, graus altos demais sobreajustam, e o ponto ótimo fica no vale entre os dois. Na prática, eu raramente vejo necessidade de graus maiores que 4 ou 5 para dados reais. Se o seu erro de validação ainda está caindo em grau 6, provavelmente tem variável residual não capturada ou ruído estrutural que um polinômio nunca vai resolver.

Implementação prática

No Python, o caminho mais direto é juntar Pipeline com PolynomialFeatures do scikit-learn. Você monta um pipeline que escalonamenta os dados, gera os termos polinomiais e aplica Ridge regression. O Ridge é importante porque adiciona regularização L2 que ameniza a sensibilidade a termos de grau alto. Sem regularização, coeficientes enormes podem aparecer em graus superiores, especialmente quando há correlação alta entre x² e x³.

👉 Clique no botão abaixo para saber mais sobre o assunto!

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.linear_model import Ridge
from sklearn.model_selection import cross_val_score

pipeline = make_pipeline(
    StandardScaler(),
    PolynomialFeatures(degree=3, include_bias=False),
    Ridge(alpha=1.0)
)

scores = cross_val_score(pipeline, X, y, cv=5, scoring='neg_mean_squared_error')
print(-scores.mean())

Esse código roda em segundos para conjuntos de dados pequenos e médios. Para dados com milhares de observações e graus acima de 4, o custo computacional cresce porque o número de features explode combinatorialmente. Nesse cenário, eu recomendo limitar o grau a 3 ou usar feature selection após a geração polinomial.

Quando não usar

Regressão polinomial não é bala de prata. Ela falha feio quando a relação verdadeira tem descontinuidades, porque polinômios são funções suaves e infinitas vezes diferenciáveis. Se os seus dados têm uma mudança de regime ou um limiar, o polinômio vai tentar amortecer essa mudança com oscilações laterais, o que aumenta o erro tanto no treino quanto na validação. Nesse caso, splines ou modelos aditivos generalizados são alternativas mais adequadas e costumam entregar resultados melhores com menos hiperparâmetros para ajustar. Outro cenário problemático é extrapolação. Polinômios de grau alto tendem a disparar para infinito nas caudas, então previsões fora da faixa dos dados observados são praticamente inúteis. Eu já perdi crédito em revisões por ter feito previsão para valores de x muito acima do observado usando um polinômio de grau 5. A lição que eu levei foi nunca confiar em extrapolacao polinomial, independentemente de quão bom seja o ajuste dentro da amostra.

Diagnóstico dos resíduos

Depois de ajustar o modelo, o passo seguinte obrigatório é verificar os resíduos. Um plot de resíduos versus ajustes deve mostrar nuvem aleatória sem padrão. Se você enxergar curvatura nos resíduos, significa que o grau do polinômio ainda é insuficiente e precisa subir. Se houver dispersão crescente com o valor previsto, o problema é heterocedasticidade, e aí transformar a variável resposta com log ou Box-Cox costuma resolver. Eu também olho o gráfico de Q-Q dos resíduos para verificar normalidade. Embora a regressão polinomial não exija normalidade estrita dos resíduos para estimação dos coeficientes, a inferência estatística e os intervalos de confiança dependem dessa suposição. Em amostras grandes, o teorema central do limite protege um pouco, mas em amostras pequenas com poucos graus de liberdade, violações de normalidade podem distorcer significativamente os intervalos.

O que eu mais recomendo na prática é manter um notebook de registros onde você anota o grau testado, o erro de treino, o erro de validação, o número de condição da matriz e a análise residual de cada tentativa. Isso transforma um processo que poderia ser puramente exploratório em algo reproduzível e auditável. No final das contas, regressão polinomial é uma ferramenta honesta desde que você respeite seus limites e não confunda capacidade de ajuste com poder preditivo.