Detección de Colinealidad y Dependencia en Modelos Predictivos con Python
La colinealidad (o multicolinealidad) y la dependencia entre variables son problemas comunes que degradan la interpretabilidad y la estabilidad de los modelos de regresión. En este artículo descubrirás qué son, por qué importan y, lo más importante, cómo detectarlos y mitigarlos mediante ejemplos prácticos en Python.
1. Conceptos Fundamentales
- Colinealidad: Cuando dos o más predictores están linealmente relacionados.
- Multicolinealidad: Extensión de la colinealidad a tres o más variables que, en conjunto, pueden expresarse como combinación lineal de las demás.
- Dependencia: Correlación fuerte (positiva o negativa) que no necesariamente es lineal, pero que indica que la información de una variable está contenida en otra.
Estas situaciones provocan:
- Coeficientes de regresión inestables.
- Inflación de la varianza de los estimadores (VIF alto).
- Dificultad para interpretar la importancia de cada variable.
2. Métodos de Detección en Python
2.1 Matriz de Correlación
Una primera inspección rápida. Valores absolutos > 0.8 suelen indicar posible colinealidad.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# DataFrame de ejemplo
df = pd.read_csv('datasets/housing.csv')
corr = df.corr()
plt.figure(figsize=(10,8))
sns.heatmap(corr, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('Matriz de Correlación')
plt.show()
2.2 Variance Inflation Factor (VIF)
Cuantifica la inflación de la varianza de cada coeficiente. VIF > 5 (o > 10) es señal de alerta.
from statsmodels.stats.outliers_influence import variance_inflation_factor
from statsmodels.tools import add_constant
X = df[['rooms', 'bedrooms', 'population', 'households']]
X_const = add_constant(X)
vif_data = pd.DataFrame({
'feature': X.columns,
'VIF': [variance_inflation_factor(X_const.values, i+1) for i in range(len(X.columns))]
})
print(vif_data)
2.3 Condition Number
Basado en la descomposición en valores singulares (SVD). Un número > 30 indica problemas de colinealidad.
import numpy as np
from numpy.linalg import svd
U, s, Vt = svd(X)
cond_number = s.max() / s.min()
print(f'Condition Number: {cond_number:.2f}')
2.4 Análisis de Componentes Principales (PCA)
Reduce dimensionalidad y muestra cuánta varianza explica cada componente; componentes con varianza muy alta pueden estar capturando colinealidad.
from sklearn.decomposition import PCA
pca = PCA().fit(X)
explained = np.cumsum(pca.explained_variance_ratio_)
plt.figure(figsize=(6,4))
plt.plot(range(1, len(explained)+1), explained, marker='o')
plt.xlabel('Número de componentes')
plt.ylabel('Varianza acumulada')
plt.title('Curva de varianza explicada')
plt.grid(True)
plt.show()
3. Estrategias para Mitigar la Colinealidad
- Eliminación manual: Quitar la variable con mayor VIF.
- Combinar variables: Crear una nueva característica (ej. ratio, suma) que capture la información conjunta.
- Regularización: Modelos Ridge (L2) y Lasso (L1) reducen la varianza sin eliminar variables.
- PCA / Feature Extraction: Transformar el espacio a componentes ortogonales.
Ejemplo: Regularización con Ridge
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
X_train, X_test, y_train, y_test = train_test_split(X, df['median_house_value'], test_size=0.2, random_state=42)
ridge = Ridge(alpha=1.0)
ridge.fit(X_train, y_train)
pred = ridge.predict(X_test)
print('R²:', r2_score(y_test, pred))
print('Coeficientes:', ridge.coef_)
4. Comparativa con Soluciones Alternativas
| Método | Ventajas | Desventajas | Uso típico |
|---|---|---|---|
| Matriz de Correlación | Rápida, visual, sin dependencias externas | No captura relaciones no lineales, umbral subjetivo | Análisis exploratorio inicial |
| VIF | Cuantitativo, fácil de interpretar | Requiere regresión múltiple, sensible a escalado | Modelos lineales clásicos |
| Condition Number | Detecta colinealidad global | No indica qué variables son problemáticas | Diagnóstico de estabilidad numérica |
| Regularización (Ridge/Lasso) | Automática, mejora generalización | Los coeficientes se sesgan, no elimina colinealidad explícitamente | Modelos predictivos de producción |
| PCA / ICA | Reduce dimensionalidad, elimina redundancia | Pérdida de interpretabilidad, requiere transformación posterior | Pre‑procesamiento para algoritmos de Machine Learning |
5. Buenas Prácticas y Solución de Problemas
- Escalar variables antes de calcular VIF (StandardScaler o MinMaxScaler).
- Re‑evaluar VIF después de cada eliminación o transformación.
- Monitorizar el Condition Number en pipelines de entrenamiento continuo.
- Validar la estabilidad de los coeficientes con bootstrapping o cross‑validation.
- Revisar outliers: valores extremos pueden inflar artificialmente la colinealidad.
Ejemplo de troubleshooting: VIF inesperadamente alto
# Paso 1: inspeccionar escala
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Paso 2: recalcular VIF
X_scaled_const = add_constant(X_scaled)
vif_scaled = pd.DataFrame({
'feature': X.columns,
'VIF': [variance_inflation_factor(X_scaled_const, i+1) for i in range(len(X.columns))]
})
print(vif_scaled)
# Paso 3: si VIF sigue alto, buscar colinealidad estructural
import itertools
for combo in itertools.combinations(X.columns, 2):
corr = X[list(combo)].corr().iloc[0,1]
if abs(corr) > 0.95:
print('Posible duplicado:', combo)
6. Conclusiones
Detectar colinealidad y dependencia es esencial para construir modelos fiables y explicables. Con las herramientas nativas de Python (pandas, statsmodels, scikit‑learn) puedes identificar rápidamente los problemas, aplicar mitigaciones como regularización o PCA, y garantizar la estabilidad de tus predictores a lo largo del ciclo de vida del modelo.
Recuerda que la interpretación humana sigue siendo el mejor filtro: combina métricas cuantitativas con conocimiento del dominio para decidir qué variables conservar, transformar o eliminar.
Detección de Colinealidad y Dependencia en Modelos Predictivos con Python