La regresión paso a paso es una técnica poderosa para seleccionar las variables predictoras más relevantes en un modelo de regresión. Al agregar o eliminar iterativamente variables según su significancia estadística, ayuda a construir modelos parsimoniosos que son más fáciles de interpretar y menos propensos al sobreajuste. Este artículo explora varios métodos para realizar una regresión paso a paso en Python, utilizando bibliotecas populares como statsmodels
, scikit-learn
(sklearn
) y mlxtend
.
Tabla de contenido
- Selección hacia adelante
- Eliminación hacia atrás
- Selección paso a paso (Bidireccional)
- Regresión paso a paso con
statsmodels
- Regresión paso a paso con
sklearn
- Regresión paso a paso con
mlxtend
- Eligiendo el método correcto y consideraciones
Selección hacia adelante
La selección hacia adelante comienza con un modelo vacío y agrega iterativamente la variable predictora que mejora el ajuste del modelo de manera más significativa. Esta mejora se evalúa típicamente utilizando métricas como el estadístico F, AIC (Criterio de Información de Akaike) o BIC (Criterio de Información Bayesiano). El proceso continúa hasta que agregar otra variable no proporciona una mejora estadísticamente significativa.
Eliminación hacia atrás
La eliminación hacia atrás adopta el enfoque opuesto. Comienza con un modelo que incluye todas las variables predictoras y elimina iterativamente la variable menos significativa. La variable con el valor p más alto (o el estadístico F más bajo) se elimina en cada paso, siempre que su eliminación no empeore significativamente el ajuste del modelo. Esto continúa hasta que eliminar cualquier variable restante degrade significativamente el rendimiento del modelo.
Selección paso a paso (Bidireccional)
La selección paso a paso combina las fortalezas de la selección hacia adelante y hacia atrás. Comienza con un modelo vacío (como la selección hacia adelante) o un modelo completo (como la eliminación hacia atrás) y agrega o elimina iterativamente variables según su significancia. Esto permite un subconjunto de predictores más flexible y potencialmente óptimo.
Regresión paso a paso con statsmodels
statsmodels
no tiene una función de regresión paso a paso integrada, pero podemos implementar la selección hacia adelante manualmente usando su modelo OLS
(Mínimos Cuadrados Ordinarios):
import pandas as pd
import numpy as np
import statsmodels.api as sm
from statsmodels.formula.api import ols
# Datos de muestra
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"Variables seleccionadas: {selected_features}")
final_model = sm.OLS(df['y'], sm.add_constant(df[selected_features])).fit()
print(final_model.summary())
Regresión paso a paso con sklearn
sklearn
utiliza Eliminación Recursiva de Características (RFE) para la selección de características. RFE elimina iterativamente características según sus puntuaciones de importancia de un modelo base (como Regresión Lineal):
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 según sea necesario
rfe = rfe.fit(X_train, y_train)
print(f"Variables seleccionadas: {X.columns[rfe.support_]}")
final_model = LinearRegression().fit(X_train[X.columns[rfe.support_]], y_train)
print(f"R-cuadrado en el conjunto de prueba: {final_model.score(X_test[X.columns[rfe.support_]], y_test)}")
Regresión paso a paso con mlxtend
SequentialFeatureSelector
de mlxtend
proporciona una manera conveniente de realizar selección hacia adelante, hacia atrás o paso a paso:
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) #selección hacia adelante
sfs = sfs.fit(X, y)
print(f"Variables seleccionadas: {list(sfs.k_feature_idx_)}")
final_model = LinearRegression().fit(X[X.columns[list(sfs.k_feature_idx_)]], y)
Eligiendo el método correcto y consideraciones
La elección del método de regresión paso a paso (hacia adelante, hacia atrás o paso a paso) y la biblioteca utilizada depende del conjunto de datos y los objetivos específicos. Recuerde considerar:
- Tamaño de los datos: La eliminación hacia atrás puede ser computacionalmente costosa con un gran número de predictores.
- Multicolinealidad: Los métodos paso a paso pueden tener dificultades con predictores altamente correlacionados.
- Interpretabilidad vs. precisión predictiva: Un modelo más simple (menos variables) puede ser más fácil de interpretar, incluso si es ligeramente menos preciso.
- Validación cruzada: Siempre valide su modelo utilizando técnicas como la validación cruzada k-fold para asegurar la generalización.
La regresión paso a paso debe usarse con precaución. Puede llevar a modelos inestables que no se generalizan bien a nuevos datos. Considere explorar otros métodos de selección de características como LASSO o regresión Ridge, que incorporan regularización para manejar el sobreajuste.