0lotvyec 1fer18vs.jpeg

Tabla de contenido

1. Reducción de dimensionalidad
2. ¿Cómo funciona el análisis de componentes principales?
3. Implementación en Python
4. Evaluación e Interpretación
5. Conclusiones y próximos pasos

Muchos problemas reales del aprendizaje automático involucran conjuntos de datos con miles o incluso millones de funciones. Entrenar estos conjuntos de datos puede ser exigente desde el punto de vista computacional, e interpretar las soluciones resultantes puede ser aún más desafiante.

A medida que aumenta el número de características, los puntos de datos se vuelven más escasos y las métricas de distancia se vuelven menos informativas, ya que las distancias entre puntos son menos pronunciadas, lo que dificulta distinguir qué son puntos cercanos y distantes. Eso se conoce como el maldición de dimensionalidad.

Los datos más escasos hacen que los modelos sean más difíciles de entrenar y más propensos a sobreajustar la captura del ruido en lugar de los patrones subyacentes. Esto conduce a una mala generalización de datos nuevos e invisibles.

La reducción de dimensionalidad se utiliza en la ciencia de datos y el aprendizaje automático para reducir la cantidad de variables o características en un conjunto de datos y al mismo tiempo conservar la mayor cantidad posible de información original. Esta técnica es útil para simplificar conjuntos de datos complejos, mejorar la eficiencia computacional y ayudar con la visualización de datos.

Imagen del autor usando DALL-E.

Una de las técnicas más utilizadas para mitigar la maldición de la dimensionalidad es el Análisis de Componentes Principales (PCA). El PCA reduce la cantidad de características en un conjunto de datos y al mismo tiempo mantiene la mayor parte de la información útil al encontrar los ejes que representan la mayor variación en el conjunto de datos. Esos ejes se llaman componentes principales.

Dado que PCA tiene como objetivo encontrar una representación de baja dimensión de un conjunto de datos manteniendo una gran parte de la varianza en lugar de realizar predicciones, se considera una aprendizaje sin supervisión algoritmo.

Pero, ¿por qué mantener la variación significa conservar información importante?

Imagine que está analizando un conjunto de datos sobre delitos en una ciudad. Los datos tienen numerosas características, entre ellas «crimen contra una persona – con lesiones» y «crimen contra una persona – sin lesiones». Ciertamente, los lugares con tasas altas del primer ejemplo también deben tener tasas altas del segundo ejemplo.

En otras palabras, las dos características del ejemplo están muy correlacionadas, por lo que es posible reducir las dimensiones de ese conjunto de datos disminuyendo las redundancias en los datos (la presencia o ausencia de lesiones en la víctima).

El algoritmo PCA no es más que una forma sofisticada de hacerlo.

Ahora, analicemos cómo funciona el algoritmo PCA en los siguientes pasos:

Paso 1: centrar los datos

El PCA se ve afectado por la escala de los datos, por lo que lo primero que hay que hacer es restar la media de cada característica del conjunto de datos, asegurando así que todas las características tengan una media igual a 0.

Datos antes y después del centrado (imagen del autor).

Paso 2: Calcular la matriz de covarianza

Ahora, tenemos que calcular la matriz de covarianza para capturar cómo varía cada par de características de los datos. Si el conjunto de datos tiene norte características, la matriz de covarianza resultante tendrá norte X norte forma.

En la imagen siguiente, las características más correlacionadas tienen colores más cercanos al rojo. Por supuesto, cada característica estará altamente correlacionada consigo misma.

Mapa de calor de la matriz de covarianza (imagen del autor).

Paso 3: descomposición de valores propios

A continuación, tenemos que realizar la descomposición de valores propios de la matriz de covarianza. En caso de que no lo recuerdes, dada la matriz de covarianza Σ (una matriz cuadrada), la descomposición de valores propios es el proceso de encontrar un conjunto de escalares (valores propios) y vectores (vectores propios) tales que:

Propiedad de valor propio (imagen del autor usando codificadores).

Dónde:

  • Σ es la matriz de covarianza n × n.
  • v es un vector distinto de cero llamado vector propio.
  • λ es un escalar llamado valor propio asociado con el vector propio v.

Vectores propios indicar las direcciones de máxima varianza en los datos (los componentes principales), mientras que valores propios cuantificar la varianza capturada por cada componente principal.

Si una matriz A se puede descomponer en valores propios y vectores propios, se puede representar como:

Descomposición propia de una matriz (imagen del autor usando codificadores).

Dónde:

  • q es una matriz cuyas columnas son los vectores propios de A.
  • Λ es una matriz diagonal cuyos elementos diagonales son los valores propios de A.

De esa manera, podemos utilizar los mismos pasos para encontrar los valores propios y los vectores propios de la matriz de covarianza.

Trazado de vectores propios (imagen del autor).

En la imagen de arriba, podemos ver que el primer vector propio apunta a la dirección con la mayor varianza de los datos, y el segundo vector propio apunta a la dirección con la segunda mayor varianza.

Paso 4: Seleccionar los componentes principales

Como se dijo anteriormente, los valores propios cuantifican la varianza de los datos en la dirección de su correspondiente vector propio. Por lo tanto, ordenamos los valores propios en orden descendente y mantenemos solo los n superiores requeridos. componentes principales.

La siguiente imagen ilustra la proporción de varianza capturada por cada componente principal en un PCA con dos dimensiones.

Varianza explicada para 2 componentes principales (imagen del autor).

Paso 5: proyectar los datos

Finalmente, tenemos que proyectar los datos originales en las dimensiones representadas por los componentes principales seleccionados. Para ello, tenemos que multiplicar el conjunto de datos, después de centrarlo, por la matriz de vectores propios encontrada en la descomposición de la matriz de covarianza.

Proyectar el conjunto de datos original en n dimensiones (imagen del autor usando codificadores).

Ahora que entendemos profundamente los conceptos clave del Análisis de Componentes Principales, es hora de crear algo de código.

Primero, tenemos que configurar el entorno importando el paquete numpy para cálculos matemáticos y matplotlib para visualización:

import numpy as np
import matplotlib.pyplot as plt

A continuación, encapsularemos todos los conceptos tratados en la sección anterior en una clase de Python con los siguientes métodos:

Método constructor para inicializar los parámetros del algoritmo: el número de componentes deseados, una matriz para almacenar los vectores de los componentes y una matriz para almacenar la varianza explicada de cada dimensión seleccionada.

En el método de ajuste, los primeros cuatro pasos presentados en la sección anterior se implementan con código. Además, se calculan las varianzas explicadas de cada componente.

El método de transformación realiza el último paso presentado en la sección anterior: proyectar los datos en las dimensiones seleccionadas.

El último método es una función auxiliar para trazar la varianza explicada de cada componente principal seleccionado como un diagrama de barras.

Aquí está el código completo:

class PCA:
def __init__(self, n_components):
self.n_components = n_components
self.components = None
self.mean = None
self.explained_variance = None

def fit(self, X):
# Step 1: Standardize the data (subtract the mean)
self.mean = np.mean(X, axis=0)
X_centered = X - self.mean

# Step 2: Compute the covariance matrix
cov_matrix = np.cov(X_centered, rowvar=False)

# Step 3: Compute the eigenvalues and eigenvectors
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)

# Step 4: Sort the eigenvalues and corresponding eigenvectors
sorted_indices = np.argsort(eigenvalues)[::-1]
eigenvalues = eigenvalues[sorted_indices]
eigenvectors = eigenvectors[:, sorted_indices]

# Step 5: Select the top n_components
self.components = eigenvectors[:, :self.n_components]

# Calculate explained variance
total_variance = np.sum(eigenvalues)
self.explained_variance = eigenvalues[:self.n_components] / total_variance

def transform(self, X):
# Step 6: Project the data onto the selected components
X_centered = X - self.mean
return np.dot(X_centered, self.components)

def plot_explained_variance(self):
# Create labels for each principal component
labels = [f'PCA{i+1}' for i in range(self.n_components)]

# Create a bar plot for explained variance
plt.figure(figsize=(8, 6))
plt.bar(range(1, self.n_components + 1), self.explained_variance, alpha=0.7, align='center', color='blue', tick_label=labels)
plt.xlabel('Principal Component')
plt.ylabel('Explained Variance Ratio')
plt.title('Explained Variance by Principal Components')
plt.show()

Ahora es el momento de usar la clase que acabamos de implementar en un conjunto de datos simulado creado con el paquete numpy. El conjunto de datos tiene 10 características y 100 muestras.

# create simulated data for analysis
np.random.seed(42)
# Generate a low-dimensional signal
low_dim_data = np.random.randn(100, 4)

# Create a random projection matrix to project into higher dimensions
projection_matrix = np.random.randn(4, 10)

# Project the low-dimensional data to higher dimensions
high_dim_data = np.dot(low_dim_data, projection_matrix)

# Add some noise to the high-dimensional data
noise = np.random.normal(loc=0, scale=0.5, size=(100, 10))
data_with_noise = high_dim_data + noise

X = data_with_noise

Antes de realizar el PCA, queda una pregunta: ¿Cómo elegimos el número correcto u óptimo de dimensiones?? Generalmente, tenemos que buscar la cantidad de componentes que suman al menos el 95% de la varianza explicada del conjunto de datos.

Para hacer eso, echemos un vistazo a cómo cada componente principal contribuye a la varianza total del conjunto de datos:

# Apply PCA
pca = PCA(n_components=10)
pca.fit(X)
X_transformed = pca.transform(X)

print("Explained Variance:\n", pca.explained_variance)

>> Explained Variance (%):
[55.406, 25.223, 11.137, 5.298, 0.641, 0.626, 0.511, 0.441, 0.401, 0.317]

A continuación, grafiquemos la suma acumulada de la varianza y verifiquemos en qué número de dimensiones logramos el valor óptimo del 95% de la varianza total.

Varianza explicada en función del número de componentes (imagen del autor).

Como se muestra en el gráfico anterior, el número óptimo de dimensiones para el conjunto de datos es 4, lo que suma un total del 97,064% de la varianza explicada. En otras palabras, transformamos un conjunto de datos con 10 características en uno con solo 3 dimensiones manteniendo más del 97% de la información original.

Eso significa que la mayoría de las 10 características originales estaban muy correlacionadas y el algoritmo transformó esos datos de alta dimensión en componentes principales no correlacionados.

Creamos una clase PCA usando solo el paquete numpy que redujo con éxito la dimensionalidad de un conjunto de datos de 10 características a solo 4 y al mismo tiempo preservamos aproximadamente el 97% de la varianza de los datos.

Además, exploramos un método para obtener un número óptimo de componentes principales del análisis PCA que se pueden personalizar según el problema al que nos enfrentamos (podríamos estar interesados ​​en retener solo el 90% de la varianza, por ejemplo).

Esto muestra el potencial del análisis PCA para abordar la maldición de la dimensionalidad explicada anteriormente. Además, me gustaría dejar algunos puntos para una mayor exploración:

  • Realice tareas de clasificación o regresión utilizando otros algoritmos de aprendizaje automático en el conjunto de datos reducido utilizando el algoritmo PCA y compare el rendimiento de los modelos entrenados en el conjunto de datos original con el conjunto de datos transformado con PCA para evaluar el impacto de la reducción de dimensionalidad.
  • Utilice PCA para la visualización de datos a fin de hacer que los datos de alta dimensión sean más interpretables y descubrir patrones que no eran evidentes en el espacio de características original.
  • Considere explorar otras técnicas de reducción de dimensionalidad, como Incrustación de vecinos estocásticos distribuidos en t (t-SNE) y Análisis discriminante lineal (LDA).

Código completo disponible aquí.