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

Regredindo curvas sem complicação

Vou falar de regressão polinomial porque é uma das coisas mais úteis que eu já usei no dia a dia de modelagem. Muita gente travada quando o gráfico mostra algo que não é linear e acha que precisa partir pra uma floresta aleatória ou uma rede neural. Não precisa. Um polinômio de grau certo resolve na maioria das vezes e ainda deixa você com interpretabilidade.

O que é regressão polinomial

A regressão polinomial é basicamente uma regressão linear onde você adiciona colunas de potência da sua variável independente. Se você tem X, cria X², X³ e assim por diante. O modelo continua sendo linear nos coeficientes. Isso significa que você ainda pode usar mínimos quadrados ordinários, a única coisa que muda é a matriz de desenho. Eu costumava dizer que era um truque, mas não é. É a forma mais honesta de capturar curvatura sem entrar em modelos não paramétricos. E o detalhe que quase ninguém menciona é que a escolha do grau importava mais antigamente do que importa hoje, porque com regularização a gente pode usar graus altos sem entrar em colapso tão rápido.

Como fazer na prática

O passo a passo que eu uso é simples. Primeiro, você separa os dados em treino e teste. Depois, você cria as colunas polinomiais. No Python, o pipeline do scikit-learn faz isso de graça com PolynomialFeatures. Se você fizer isso sozinho, vai precisar se preocupar com escalonamento, senão X² vai ficar mil vezes maior que X e o solver vai sofrer. Veja um exemplo rápido.

Istop | stop | import numpy as np
stop | stop | from sklearn.linear_model import Ridge
stop | stop | from sklearn.preprocessing import PolynomialFeatures, StandardScaler
stop | stop | from sklearn.pipeline import Pipeline
stop | stop | from sklearn.model_selection import cross_val_score Istop | stop | pipe = Pipeline([
stop | stop | stop | ('poly', PolynomialFeatures(degree=3, include_bias=False)),
stop | stop | stop | ('scale', StandardScaler()),
stop | stop | stop | ('reg', Ridge(alpha=1.0))
stop | stop | ])

Istop | stop | scores = cross_val_score(pipe, X, y, cv=5, scoring='neg_mean_squared_error') Isso é o suficiente para a maior parte dos casos. O escalonamento é obrigatório. A regularização com Ridge ou Lasso evita que coeficientes fiquem absuridos. O cross-val score te dá uma noção real de como o modelo vai se sair em dados novos.

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

Um problema real que eu tive

Eu trabalhava num conjunto de dados de previsão de demanda onde a relação era claramente curvilínea, mas com um padrão estranho: nos extremos, a curva invertia. Pensei que era outlier. Fiquei duas semanas achando que precisava dividir a base em segmentos e ajustar uma regressão linear em cada pedaco. Nada resolvia. O problema era que eu estava usando grau 3 com dados que tinham comportamento de grau 6. Eu forcei um polinômio baixo e o modelo ficava oscilando entre trechos. A solução foi usar degree=6 com Ridge forte, alpha=100, e validar com leave-one-out cross-validation porque o conjunto tinha poucas observações, cerca de duzentas linhas. O resultado caiu de um RMSE de 47 para 18 em quinze minutos.

Insights que você não vai achar em curso básico

Primeiro, grau alto não é sinônimo de overfit se você usar regularização. O verdadeiro inimigo é a falta dela. Segundo, o erro não dispara só quando o grau sobe; ele também dispara quando você escala mal. Terceiro, validação cruzada simples com K=5 às vezes engana em séries temporais ou dados com dependência espacial. Nesse caso, use TimeSeriesSplit ou deixe uma faixa fora completamente.

Quando isso não funciona

Regressão polinomial falha quando a relação tem descontinuidades. Se o dado tem uma mudança brusca de regime, um salto, um limiar, o polinômio vai tentar suavizar tudo e você vai ter viés sistemático. Também falha quando a variável depende de múltiplas dimensões sem interação clara, porque aí você entra numa explosão combinatória de features e o custo computacional sobe rápido. Aí eu mudo pra técnica de splines ou pra modelo aditivo generalizado. E se você tem milhares de features, esquece regressão polinomial pura e vai direto pra floresta ou gradient boosting.

Download do código

Deixei um repositório com o exemplo completo, incluindo dados sintéticos, pipeline com PolynomialFeatures, Ridge, e script de plotagem que mostra a curva ajustada contra os pontos originais. Você baixa aqui: Istop | stop | https://github.com/exemplo/polynomial-regression-tutorial

Se você quiser testar com dados reais, coloque um CSV com duas colunas, X e Y, e rode o notebook. A régua de sucesso é simples: o erro no conjunto de teste não pode ser mais que 20 por cento maior que o erro no treino. Se for, reduza o grau ou aumente o alpha.

Última consideração

A regressão polinomial é uma ferramenta, não uma resposta. Use quando o padrão for suave e contínuo, com pouco ruído estrutural. Quando o dado for descontínuo ou multidimensional, mude de estratégia sem sentimento de culpa.