Regressão Avançada em Python: Modelando Relações Complexas

A regressão é uma das técnicas mais utilizadas em ciência de dados e estatística para modelar a relação entre variáveis. Enquanto a regressão linear simples é intuitiva e eficiente para problemas básicos, muitos fenômenos do mundo real exigem modelos mais sofisticados para capturar relações não-linearesinterações complexas e efeitos múltiplos. Neste artigo, vamos explorar como implementar regressão avançada em Python, utilizando bibliotecas como Scikit-learnStatsmodels e XGBoost.


1. Conceitos Fundamentais

Antes de partir para a prática, é importante entender alguns conceitos-chave:


2. Preparando o ambiente em Python

Para este tutorial, instale as bibliotecas essenciais:

pip install pandas numpy matplotlib seaborn scikit-learn statsmodels xgboost

Importando as bibliotecas:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.metrics import mean_squared_error, r2_score

import statsmodels.api as sm

3. Exemplo prático: Previsão de preços de imóveis

Suponha que temos um dataset com informações sobre imóveis, incluindo área, número de quartos, idade do imóvel e distância até o centro. O objetivo é prever o preço de venda.

# Criando dataset fictício
data = {
    'Area': [50, 80, 120, 60, 100, 90, 200, 150, 130, 170],
    'Quartos': [1, 2, 3, 1, 2, 2, 4, 3, 3, 4],
    'Idade': [5, 10, 15, 7, 12, 8, 20, 18, 14, 22],
    'Distancia_centro': [5, 10, 8, 6, 7, 9, 15, 12, 10, 14],
    'Preco': [150, 200, 300, 180, 250, 220, 400, 350, 320, 380]
}
df = pd.DataFrame(data)

3.1 Análise exploratória

Visualizando relações entre variáveis:

sns.pairplot(df, x_vars=['Area','Quartos','Idade','Distancia_centro'], y_vars='Preco', height=4, kind='scatter')
plt.show()

Essa etapa ajuda a identificar relações lineares e não-lineares entre variáveis e o preço.


4. Regressão Linear Múltipla

X = df[['Area','Quartos','Idade','Distancia_centro']]
y = df['Preco']

# Dividindo em treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Modelo Linear
lin_reg = LinearRegression()
lin_reg.fit(X_train, y_train)

# Previsões
y_pred = lin_reg.predict(X_test)

# Avaliação
print("R2:", r2_score(y_test, y_pred))
print("RMSE:", np.sqrt(mean_squared_error(y_test, y_pred)))

A regressão linear múltipla é rápida e interpretável, mas pode não capturar relações não-lineares.


5. Regressão Polinomial

Para capturar relações não-lineares, podemos incluir features polinomiais:

poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X)

X_train_poly, X_test_poly, y_train, y_test = train_test_split(X_poly, y, test_size=0.2, random_state=42)

poly_reg = LinearRegression()
poly_reg.fit(X_train_poly, y_train)

y_pred_poly = poly_reg.predict(X_test_poly)

print("R2 Polinomial:", r2_score(y_test, y_pred_poly))
print("RMSE Polinomial:", np.sqrt(mean_squared_error(y_test, y_pred_poly)))

6. Regularização: Ridge e Lasso

Modelos avançados de regressão podem sofrer overfitting, principalmente com features polinomiais. A regularização ajuda a reduzir esse risco.

# Ridge Regression
ridge = Ridge(alpha=1.0)
ridge.fit(X_train_poly, y_train)
y_pred_ridge = ridge.predict(X_test_poly)

# Lasso Regression
lasso = Lasso(alpha=0.1)
lasso.fit(X_train_poly, y_train)
y_pred_lasso = lasso.predict(X_test_poly)

print("R2 Ridge:", r2_score(y_test, y_pred_ridge))
print("R2 Lasso:", r2_score(y_test, y_pred_lasso))

7. Modelos baseados em árvores

Para relações complexas e interações não-lineares, algoritmos baseados em árvore como XGBoost podem ser extremamente eficazes:

import xgboost as xgb

xgb_model = xgb.XGBRegressor(objective='reg:squarederror', n_estimators=100)
xgb_model.fit(X_train, y_train)
y_pred_xgb = xgb_model.predict(X_test)

print("R2 XGBoost:", r2_score(y_test, y_pred_xgb))

Vantagens:

  • Não exige normalização ou padronização.

  • Captura relações complexas e interações automaticamente.

  • Altamente escalável para grandes volumes de dados.


8. Interpretação e Visualização

É importante não apenas prever, mas entender o impacto de cada variável:

coef_df = pd.DataFrame({'Feature': X.columns, 'Coeficiente': lin_reg.coef_})
print(coef_df)

sns.barplot(x='Coeficiente', y='Feature', data=coef_df)
plt.title('Importância das Variáveis')
plt.show()

Para modelos de árvore, bibliotecas como SHAP ou Eli5 podem fornecer interpretabilidade detalhada.


9. Boas práticas para regressão avançada

  1. Sempre faça exploração e limpeza de dados antes de treinar modelos.

  2. Teste diferentes transformações e interações de features.

  3. Use cross-validation para validar a robustez do modelo.

  4. Experimente regularização para reduzir overfitting.

  5. Compare modelos lineares, polinomiais e baseados em árvore para escolher o melhor para o problema.


10. Conclusão

A regressão avançada em Python permite modelar relações complexas de forma eficiente, combinando modelos lineares, polinomiais, regularizados e baseados em árvore. Ao entender os dados, testar transformações, aplicar técnicas de regularização e interpretar os resultados, você pode construir modelos preditivos precisos e robustos, aplicáveis em finanças, vendas, saúde, engenharia e muito mais.

Com bibliotecas como Scikit-learnStatsmodels e XGBoost, você tem todas as ferramentas necessárias para evoluir do básico ao avançado em regressão, extraindo insights profundos de seus dados.

Comentários

Postagens mais visitadas deste blog

Python para Computação Quântica: Introdução com Qiskit

Gerando Relatórios em PDF com Python (ReportLab e FPDF)

Estrutura Básica de um Programa C# com exemplos