Reducir dimensiones sin perder información es clave en modelos de alto rendimiento. Aquí verás por qué la maldición de la dimensionalidad degrada resultados y cómo PCA, basado en eigenvectores de la matriz de covarianza, permite proyectar datos a menos dimensiones conservando la mayor varianza posible. Además, se muestra cómo implementarlo con Scikit-learn y analizar sus salidas para decisiones informadas.
¿Por qué más dimensiones empeoran el rendimiento en machine learning?
Añadir características no siempre ayuda. A partir de cierto punto, el desempeño cae por la maldición de la dimensionalidad.
Datos escasos: al aumentar dimensiones, los puntos se alejan exponencialmente y dejan de ser vecinos cercanos.
Las distancias pierden sentido: en espacios de miles de dimensiones, casi todas las distancias se parecen.
Impacto en modelos: empeora el vecino más cercano y métodos basados en distancia.
Efectos prácticos: modelos con overfitting, entrenamiento lento y pobre generalización.
¿Cómo funciona PCA y cuál es la conexión con el cambio de base?
PCA usa la estructura estadística de los datos para encontrar direcciones que capturan máxima varianza y reexpresar el conjunto en una base más informativa.
Matriz de covarianza: resume relaciones entre variables.
Eigenvectores y eigenvalores: los eigenvectores son direcciones de máxima varianza; los eigenvalores indican cuánta varianza captura cada dirección.
Cambio de base: PCA “rota” el sistema original (x, y, z) a los nuevos ejes llamados componentes principales.
Proyección: se calculan nuevas coordenadas de los puntos en la base de componentes principales.
Orden y recorte: se ordena por eigenvalor y se conservan los primeros componentes para reducir dimensiones manteniendo la mayor información.
¿Cómo aplicarlo en código con Scikit-learn y visualizar la varianza?
Se crean datos 3D, se aplica PCA a 2D y se evalúa la varianza explicada para cuantificar la información conservada.
import numpy as np
from sklearn.decomposition import PCA
# Datos sintéticos 3Dnp.random.seed(42)n =300x = np.random.randn(n)y = np.random.randn(n)z =0.6*x +0.2*y + np.random.randn(n)# combinación lineal + ruidoX_3D = np.column_stack([x, y, z])# PCA a 2 componentespca = PCA(n_components=2)X_2D = pca.fit_transform(X_3D)# Varianza explicada por componente y totalvar_ratio = pca.explained_variance_ratio_
var_total = var_ratio.sum()print('Dimensiones originales:', X_3D.shape[1])print('Nuevas dimensiones:', X_2D.shape[1])print('Varianza explicada por componente:', np.round(var_ratio,2))print(f'Varianza total conservada con 2 componentes: {var_total:.2%}')
Varianza explicada: “varianza explicada por componente” corresponde al porcentaje capturado por cada principal component.
Resultado típico mostrado: se conservó más del 80 % de la información con solo dos componentes (ejemplo: 82.98 %).