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

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

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

Estrutura Básica de um Programa C# com exemplos