En aprendizaje automático, la multicolinealidad es un problema habitual que suele afectar a la precisión y la interpretabilidad de los modelos de regresión. Lo que reduce la utilidad de estos. La multicolinealidad aparece cuando dos o más variables independientes están altamente correlacionadas, dificultando determinar el impacto individual de cada una de estas variables en la dependiente. En esta entrada se verá cómo reducir el problema de la multicolinealidad con PCA (Análisis de Componentes Principales) y cuáles son sus ventajas respecto a otras técnicas.
Por qué la multicolinealidad es un problema para los modelos de regresión
La multicolinealidad en los modelos de regresión puede tener varias implicaciones negativas que afectan tanto la calidad de las estimaciones como la capacidad predictiva del modelo. Algunas de las razones por las que la multicolinealidad es un problema para tener en cuenta son:
- Estimaciones de coeficientes inestables: La alta correlación entre variables independientes puede hacer que las estimaciones de los coeficientes de regresión sean muy sensibles a cambios en los datos. Algo que dificulta enormemente la interpretación de los resultados.
- Reducción de la precisión: La multicolinealidad introduce redundancia en las variables independientes, debido a que unas variables dependen linealmente de otras, lo que puede reducir la capacidad predictiva del modelo y llevar a predicciones menos precisas y más variables.
- Dificultad en la interpretación: Cuando las variables son colineales, puede ser difícil discernir cuál de las variables es más importante para el modelo, aumentando la dificultad para interpretar los resultados.
Por qué usar PCA para eliminar la multicolinealidad
El Análisis de Componentes Principales (PCA) es una herramienta que se puede usar para solucionar el problema de la multicolinealidad. PCA transforma las variables originales en un nuevo conjunto de variables no correlacionadas (a las que se denominan componentes principales), reteniendo la mayor parte de la varianza del conjunto de datos original.
Ventajas de PCA frente a VIF y el análisis de correlación
Existen otros métodos para eliminar o reducir el efecto de la multicolinealidad en los modelos de regresión como VIF y el análisis de correlación. Algunas de las ventajas que ofrece PCA frente a estos son:
- Reducción de dimensionalidad: PCA no solo elimina la multicolinealidad, sino que también reduce la dimensionalidad del conjunto de datos, lo que puede mejorar la eficiencia computacional y la simplicidad del modelo. En contraste, el análisis de correlación y el VIF solo identifican y eliminan variables colineales sin cambiar la dimensionalidad del conjunto de datos.
- Componentes no correlacionados: A diferencia del análisis de correlación, que solo identifica variables correlacionadas, PCA genera componentes principales que son inherentemente no correlacionados. El VIF, por otro lado, mide cuánto se infla la varianza de un coeficiente de regresión debido a la colinealidad, pero no transforma las variables.
- Varianza explicada: PCA permite retener la mayor parte de la información original al seleccionar componentes que explican la mayor parte de la varianza. Esto significa que, aunque se reduzca el número de variables, la mayor parte de la información relevante de los datos se conserva. Pudiéndose saber además cuál es el porcentaje que se conserva.
Desventajas de PCA
A pesar de sus ventajas, también presenta algunas desventajas que se deben tener en cuenta a la hora de seleccionar el mejor método para abordar el problema de la multicolinealidad:
- Pérdida de interpretabilidad: Los componentes principales son combinaciones lineales de las variables originales, lo que puede hacer que el modelo sea más difícil de interpretar. Al usar PCA los modelos ya no se entrenan con las variables originales, sino con los componentes principales. En cambio, el análisis de correlación y el VIF mantienen las variables originales, facilitando la interpretación.
- Requiere estandarización: PCA es sensible a las escalas de las variables, por lo que es necesario estandarizar los datos antes de aplicar PCA.
Proceso para eliminar la multicolinealidad utilizando PCA
Para eliminar la multicolinealidad de un conjunto de datos mediante PCA es necesario seguir un proceso estándar. Siendo estos pasos lo que se muestra a continuación:
- Estandarización de los datos: En primer lugar, es imprescindible proceder a la estandarización de las variables antes de usar PCA, ya que el algoritmo es sensible a las escalas de las variables.
- Aplicación de PCA: Calcula los componentes principales y selecciona el número adecuado de componentes que explican la mayor parte de la varianza.
- Transformación de los datos: Transforma el conjunto de datos original en el espacio de los componentes principales seleccionados.
Ejemplo de uso en Python
El proceso anterior se puede implementar fácilmente en Python gracias a las herramientas que ofrece Scikit-learn. Para ello solo hace falta un conjunto de datos, normalizar este y usar PCA antes de crear el modelo.
import numpy as np import pandas as pd from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler # Se establece una semilla para reproducibilidad np.random.seed(42) # Conjunto de datos sintético con multicolinealidad mu = [0, 0, 0, 0, 0] sigma = [[1, 0.8, 0.6, 0.4, 0.2], [0.8, 1, 0.7, 0.5, 0.3], [0.6, 0.7, 1, 0.8, 0.4], [0.4, 0.5, 0.8, 1, 0.6], [0.2, 0.3, 0.4, 0.6, 1]] data = np.random.multivariate_normal(mu, sigma, size=100) df = pd.DataFrame(data, columns=['X1', 'X2', 'X3', 'X4', 'X5']) # Estandarización los datos scaler = StandardScaler() df_scaled = scaler.fit_transform(df) # PCA pca = PCA() pca.fit(df_scaled) # Obtenención de la varianza explicada por cada componente principal explained_variance = pca.explained_variance_ratio_ print("Varianza explicada por cada componente principal:") print(explained_variance) # Selección del número adecuado de componentes que expliquen al menos el 95% de la varianza cumulative_variance = np.cumsum(explained_variance) num_components = np.argmax(cumulative_variance >= 0.95) + 1 print(f"Se seleccionaron los primeros {num_components} componentes principales.") # Transformación de los datos originales en el espacio de los componentes principales seleccionados df_pca = pca.transform(df_scaled)[:, :num_components] # Conversión del resultado a un DataFrame df_pca = pd.DataFrame(df_pca, columns=[f'PC{i+1}' for i in range(num_components)]) # Impresión del nuevo conjunto de datos con los componentes principales print("Conjunto de datos transformado en el espacio de los componentes principales:") print(df_pca.head())
Varianza explicada por cada componente principal:
[0.57809153 0.23707732 0.1148487 0.03757537 0.03240708]
Se seleccionaron los primeros 4 componentes principales.
Conjunto de datos transformado en el espacio de los componentes principales:
PC1 PC2 PC3 PC4
0 1.037293 0.109094 -0.590973 0.598084
1 -0.363318 -1.659331 -0.526006 -0.256955
2 -0.780882 0.742319 -0.200194 -1.118984
3 -0.962928 1.361873 -0.365125 -0.643992
4 2.868593 0.047854 -0.014559 -0.640989
En este código, lo primero que se hace es estandarizar los datos a través de StandardScaler
para asegurar que todas las variables tengan la misma escala. Recordando que PCA es altamente sensible a la magnitud de las variables. A continuación, se entrena el modelo PCA a los datos estandarizados para calcular los componentes principales.
Una vez obtenido las componentes principales, se puede calcular que parte de la varianza explica cada una de ellas. Usando para ello la propiedad explained_variance_ratio_
. Usando como criterio para seleccionar el número de componentes que la varianza total explicada esté por encima de un umbral, en el ejemplo un 95%. Garantizando de este modo que la mayoría de la información relevante de los datos originales se conserve.
Finalmente, se transforma el conjunto de datos original en el espacio de los componentes principales seleccionados y convertimos el resultado en un DataFrame. Lo que facilita trabajar con el nuevo conjunto de datos.
Factorización del proceso
Debido a que este es un proceso habitual cuando se necesita crear modelos de regresión, se puede crear una función para tener a mano el método.
import numpy as np import pandas as pd from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline def eliminar_variables_colineales_pca(X, varianza_umbral=0.95): """ Elimina variables colineales utilizando Análisis de Componentes Principales (PCA). Parámetros: ---------- X : array-like, shape (n_samples, n_features) El conjunto de datos de entrada. varianza_umbral : float, opcional (default=0.95) El umbral de varianza acumulada para seleccionar los componentes principales. Retorna: ------- pipeline : sklearn.pipeline.Pipeline Tubería de scikit-learn con los pasos de estandarización y PCA. X_pca : array, shape (n_samples, n_components) El conjunto de datos transformado en el espacio de los componentes principales seleccionados. n_components : int Número de componentes principales seleccionados que explican al menos el umbral de varianza especificado. explained_variance_ratio : array, shape (n_components,) La cantidad de varianza explicada por cada uno de los componentes principales seleccionados. """ # Estandarizar los datos scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # Aplicar PCA pca = PCA() pca.fit(X_scaled) # Calcular la varianza explicada acumulada cumulative_variance = np.cumsum(pca.explained_variance_ratio_) # Determinar el número de componentes que explican al menos el umbral de varianza n_components = np.argmax(cumulative_variance >= varianza_umbral) + 1 # Crear una tubería con estandarización y PCA pipeline = Pipeline([ ('scaler', StandardScaler()), ('pca', PCA(n_components=n_components)) ]) # Ajustar y transformar los datos usando la tubería X_pca = pipeline.fit_transform(X) return pipeline, X_pca, n_components, pca.explained_variance_ratio_[:n_components]
En este caso la función eliminar_variables_colineales_pca()
recibe los datos como parámetro de entrada. La salida son cuatro parámetros: una tubería con el proceso (necesario para transformar datos tanto en un conjunto de pruebas como en producción), el resultado de la transformación, el número de componentes principales y el porcentaje de varianza explicada.
Ahora se puede usar este código para comprobar que se obtienen los mismos resultados.
# Uso de la función para eliminar variables colineales pipeline, df_pca, n_components, explained_variance_ratio = eliminar_variables_colineales_pca(df, varianza_umbral=0.95) print("Número de componentes seleccionados:", n_components) print("Varianza explicada por cada componente seleccionado:", explained_variance_ratio) print("Conjunto de datos transformado en el espacio de los componentes principales:") print(pd.DataFrame(df_pca).head())
Número de componentes seleccionados: 4
Varianza explicada por cada componente seleccionado: [0.57809153 0.23707732 0.1148487 0.03757537]
Conjunto de datos transformado en el espacio de los componentes principales:
0 1 2 3
0 1.037293 0.109094 -0.590973 0.598084
1 -0.363318 -1.659331 -0.526006 -0.256955
2 -0.780882 0.742319 -0.200194 -1.118984
3 -0.962928 1.361873 -0.365125 -0.643992
4 2.868593 0.047854 -0.014559 -0.640989
Conclusiones
El Análisis de Componentes Principales (PCA) permite transformar un conjunto de datos en otro donde los componentes principales son ortogonales entre sí. Si existe un problema de multicolinealidad en los datos originales, este desaparece en las componentes principales. Por lo que, al seleccionar un número adecuado de componentes principales que explican una proporción significativa de la varianza total se puede obtener un nuevo conjunto de datos sin multicolinealidad con el que se pueden crear modelos de regresión. Con lo que se pueden obtener modelos más estables y eficaces. Aunque el uso de PCA también tiene la desventaja de perder la interpretabilidad del modelo, algo que puede ser clave en muchas aplicaciones.
Deja una respuesta