Machine Learning

Dominando a Regressão Stepwise em Python: Um Guia Completo

Spread the love

A regressão stepwise é uma técnica poderosa para selecionar as variáveis preditoras mais relevantes em um modelo de regressão. Ao adicionar ou remover iterativamente variáveis com base na significância estatística, ela ajuda a construir modelos parcimoniosos que são mais fáceis de interpretar e menos propensos a overfitting. Este artigo explora vários métodos para realizar regressão stepwise em Python, usando bibliotecas populares como statsmodels, scikit-learn (sklearn) e mlxtend.

Sumário

Seleção para Frente

A seleção para frente começa com um modelo vazio e adiciona iterativamente a variável preditora que mais significativamente melhora o ajuste do modelo. Essa melhoria é tipicamente avaliada usando métricas como o F-statistic, AIC (Critério de Informação de Akaike) ou BIC (Critério de Informação Bayesiano). O processo continua até que adicionar outra variável não forneça uma melhoria estatisticamente significativa.

Eliminação para Trás

A eliminação para trás adota a abordagem oposta. Ela começa com um modelo incluindo todas as variáveis preditoras e remove iterativamente a variável menos significativa. A variável com o maior valor p (ou menor F-statistic) é removida a cada etapa, desde que sua remoção não piore significativamente o ajuste do modelo. Isso continua até que a remoção de qualquer variável restante degrade significativamente o desempenho do modelo.

Seleção Stepwise (Bidirecional)

A seleção stepwise combina os pontos fortes da seleção para frente e para trás. Ela começa com um modelo vazio (como a seleção para frente) ou um modelo completo (como a eliminação para trás) e adiciona ou remove iterativamente variáveis com base em sua significância. Isso permite um subconjunto de preditores mais flexível e potencialmente ótimo.

Regressão Stepwise com statsmodels

statsmodels não possui uma função de regressão stepwise integrada, mas podemos implementar a seleção para frente manualmente usando seu modelo OLS (Ordinary Least Squares):


import pandas as pd
import numpy as np
import statsmodels.api as sm
from statsmodels.formula.api import ols

# Dados de exemplo
data = {'y': [10, 12, 15, 18, 20, 22, 25, 28, 30, 32],
        'x1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
        'x2': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20],
        'x3': [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]}
df = pd.DataFrame(data)

def forward_selection(data, target, significance_level=0.05):
    included = []
    while True:
        changed=False
        excluded = list(set(data.columns)-set(included)-{target})
        best_pvalue = 1.0
        best_feature = None
        for new_column in excluded:
            model = sm.OLS(target, sm.add_constant(data[included+[new_column]])).fit()
            pvalue = model.pvalues[new_column]
            if pvalue < best_pvalue:
                best_pvalue = pvalue
                best_feature = new_column
        if best_pvalue < significance_level:
            included.append(best_feature)
            changed=True
        if not changed: break
    return included

selected_features = forward_selection(df, df['y'])
print(f"Variáveis selecionadas: {selected_features}")
final_model = sm.OLS(df['y'], sm.add_constant(df[selected_features])).fit()
print(final_model.summary())

Regressão Stepwise com sklearn

sklearn utiliza Recursive Feature Elimination (RFE) para seleção de features. RFE remove iterativamente features com base em suas pontuações de importância de um modelo base (como Regressão Linear):


from sklearn.linear_model import LinearRegression
from sklearn.feature_selection import RFE
from sklearn.model_selection import train_test_split

X = df.drop('y', axis=1)
y = df['y']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LinearRegression()
rfe = RFE(model, n_features_to_select=2) # Ajustar conforme necessário
rfe = rfe.fit(X_train, y_train)

print(f"Variáveis selecionadas: {X.columns[rfe.support_]}")

final_model = LinearRegression().fit(X_train[X.columns[rfe.support_]], y_train)
print(f"R-squared no conjunto de teste: {final_model.score(X_test[X.columns[rfe.support_]], y_test)}")

Regressão Stepwise com mlxtend

mlxtend‘s SequentialFeatureSelector fornece uma maneira conveniente de realizar seleção para frente, para trás ou stepwise:


from mlxtend.feature_selection import SequentialFeatureSelector as SFS
from sklearn.linear_model import LinearRegression

model = LinearRegression()
sfs = SFS(model, k_features='best', forward=True, floating=False, scoring='r2', cv=5) #seleção para frente

sfs = sfs.fit(X, y)

print(f"Variáveis selecionadas: {list(sfs.k_feature_idx_)}")

final_model = LinearRegression().fit(X[X.columns[list(sfs.k_feature_idx_)]], y)

Escolhendo o Método Certo e Considerações

A escolha do método de regressão stepwise (para frente, para trás ou stepwise) e da biblioteca usada depende do conjunto de dados e objetivos específicos. Lembre-se de considerar:

  • Tamanho dos dados: A eliminação para trás pode ser computacionalmente cara com um grande número de preditores.
  • Multicolinearidade: Métodos stepwise podem ter dificuldades com preditores altamente correlacionados.
  • Interpretabilidade vs. precisão preditiva: Um modelo mais simples (menos variáveis) pode ser mais fácil de interpretar, mesmo que seja um pouco menos preciso.
  • Validação cruzada: Sempre valide seu modelo usando técnicas como validação cruzada k-fold para garantir a generalização.

A regressão stepwise deve ser usada com cautela. Ela pode levar a modelos instáveis que não se generalizam bem para novos dados. Considere explorar outros métodos de seleção de features, como LASSO ou regressão Ridge, que incorporam regularização para lidar com overfitting.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *