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.
Tabla de contenidos
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:
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.
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:
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:
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:
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.
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
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.
En la era del dato, las organizaciones se enfrentan al reto de gestionar volúmenes masivos…
En la serie Creación de una API REST con Express y TypeScript construimos una API…
Durante la Segunda Guerra Mundial, la Fuerza Aérea de Estados Unidos quería reforzar sus aviones…
En muchas situaciones —ya sea para grabar un tutorial, tomar capturas de pantalla profesionales, probar…
Imagínate en una sala con un grupo de personas, por ejemplo, en una oficina, un…
En el trabajo diario con ordenadores, es común encontrarse con tareas repetitivas: realizar copias de…
This website uses cookies.