Un enfoque para elegir componentes en PCA

Hola a todos! En este artículo descubriremos una forma simple de elegir la cantidad de componentes en un Análisis de componentes principales (PCA).

Esta técnica se usa tanto para reducir el número de dimensiones en un conjunto de datos, con el fin de usar solo los componentes que más contribuyen a tareas como la clasificación en Machine Learning.

¿Qué usaremos en este artículo?

Usaremos las siguientes bibliotecas de Python:

  • Scikit-learn: una biblioteca de Python Machine Learning
  • NumPy: una biblioteca de Python para computación numérica

Los datos que usaremos están disponibles en:

¿Qué haremos?

  • Comprender el trasfondo teórico detrás de PCA
  • Implementar PCA basado en la varianza explicada usando Scikit-learn
  • Implementar PCA y explicar la varianza manualmente, usando NumPy

Conocimiento previo

El rol de PCA:

Cuando tiene una matriz de datos simple M donde cada fila representa una observación en el espacio (el gráfico) también llamada muestra, y cada columna representa un atributo, también llamado dimensión, decimos que tienes, 3 observación ns (muestras) y 3 dimensiones.

Cuando utilice algoritmos para tareas como la clasificación, en Machine Learning, no todos los atributos o dimensiones contribuirán bien a la capacidad de generalización de su modelo, algunos atributos irrelevantes pueden incluso disminuir el rendimiento de algunos algoritmos, lo que contribuye a sobreajuste por ejemplo.

Los conjuntos de datos del mundo real pueden contener cientos o miles de atributos, y es su responsabilidad elegir el mejor conjunto de dimensiones que harán sus modelos rinden mejor.

El análisis de componentes principales desempeña un papel clave en la reducción de estas dimensiones, preservando la esencia de los datos originales.

Después de elegir una cierta cantidad de componentes que se devolverán, y después de algunas operaciones matriciales, el algoritmo PCA devuelve un nuevo conjunto de datos que contiene como atributos, el número de dimensiones que ha seleccionado para devolver desde el conjunto de datos original.

Entonces, si tiene un conjunto de datos con 10 atributos, puede seleccionar los 5 mejores componentes dentro de los datos originales para trabajar. Estos componentes se seleccionan en función de su varianza, esta variación que contribuirá o no a la capacidad de generalización de algunos algoritmos de Machine / Deep Learning.

Pero ¿cómo sabrá cuántos componentes elegir, y cuál es la varianza de cada componente? ? Después de todo, no hay un número mágico de componentes para establecer . ¡Descubramos!

Los datos que usaremos:

El conjunto de datos contiene información que usaremos para predecir si se trata o no de una estrella púlsares, y está disponible aquí

“Los púlsares son un tipo raro de estrella de neutrones que produce emisiones de radio detectables aquí en la Tierra. Son de considerable interés científico como sondas del espacio-tiempo, el medio interestelar y los estados de la materia. “

Este conjunto de datos contiene 17.898 muestras y 8 atributos, o dimensiones, que se muestran a continuación:

  1. Media del perfil integrado.
  2. Desviación estándar del perfil integrado.
  3.  Exceso de curtosis del perfil integrado.
  4. Sesgo del perfil integrado.
  5. Media de la curva DM-SNR.
  6. Desviación estándar de la curva DM-SNR.
  7. Exceso de curtosis de la curva DM-SNR.
  8.  Sesgo de la curva DM-SNR.

 

Análisis del componente principal con Sklearn

Lo primero que debemos hacer es importar la clase PCA de la biblioteca scikit-learn y la biblioteca NumPy:

 import numpy as np 
 from sklearn.decomposition import PCA 
 from sklearn.preprocessing import MinMaxScaler

Ahora cargaremos los datos csv usando numpy:

filepath = 'data/pulsar_stars.csv' #your path here 
data = np.genfromtxt(filepath, delimiter = ',', dtype = 'float64')

El siguiente paso es cambiar la escala de nuestros datos a un rango entre 0 y 1, con MinMaxScaler de sklearn, este proceso corregirá algunos valores atípicos y otros factores que pueden ensuciar nuestro análisis:

(seleccionamos muestras de 1 hasta el final (datos [ 1: , 0: 8] porque la primera línea del conjunto de datos contiene las etiquetas de cada columna)

(seleccionamos columnas del 0 al 8 (datos [1: 0: 8 ] porque la última columna (9) representa las etiquetas de clase para cada predicción)

 scaler = MinMaxScaler(feature_range = [0, 1]) 
 data_rescaled = scaler.fit_transform (data [1:, 0:8])

Ahora que tenemos un cambio de escala conjunto de datos de 17.898 muestras y 8 atributos, podemos calcular la varianza explicada para cada atributo mediante el uso de scikit-learn y graficar el resultado:

# Fitting the PCA algorithm with our data
pca = PCA().(rescaling_data)
#Plotting the cumulative sum of explained variance
plt.figure()
plt.plot(np.cumsum (pca.explained_variance_ratio _))
plt.xlabel('Component Number')
plt.ylabel(& variance (%)') #for each component
plt.title('Tap Damage Variation Explained')
plt.show()

Este fragmento de código producirá este gráfico:

Este gráfico nos dice que al seleccionar 5 componentes podemos conservar algo en torno al 98.8% o 99% de la varianza total de los datos. Tiene sentido, no usaremos el 100% de nuestra varianza, porque denota todos los componentes, y queremos solo los principales.

Con esta información en nuestras manos, podemos implementar la PCA para los 5 mejores componentes mediante el uso de este fragmento de código:

 pca = PCA(n_components = 5) 
 dataset = pca.fit_transform(data_rescaled)

La variable dataset almacenará nuestro nuevo conjunto de datos, ahora con 17.898 muestras y 5 componentes, o dimensiones, o atributos.

Puede usar el conjunto de datos como su X, y los datos [:, 8:] como su Y, dividir en tren y probar datos, y para encajar en sus modelos, reduciendo el sobreajuste y el tiempo de entrenamiento.

¿Cómo funciona PCA? (The Math Behind)

El análisis de componentes principales no es más que algunas operaciones matriciales aplicadas a nuestro conjunto de datos. Así que vamos a data_rescaled ser nuestro conjunto de datos antes de la PCA.

El primer paso es calcular la media:

 data_mean = np.mean(data_rescaled)

Ahora, como nuestro segundo paso, puede centralizar nuestros datos eliminando la media de cada valor dentro de nuestro conjunto de datos:

 data_center = data_rescaled - data_mean

El siguiente paso es calcular la matriz de covarianza para nuestros datos centralizados con el fin de verificar la puntuación de covarianza para cada columna con con respecto a la columna real (como en un ciclo for):

 cov_matrix = np.cov(data_center)

Ahora podemos calcular la autodescomposición utilizando la función np.linalg.eig ():

(Para comprender los valores propios y vectores propios visualmente, por favor, haga clic en aquí )

 eigenval, eigenvec = np.linalg.eig(cov_matrix)

Y, por último, para calcular la importancia de nuestros componentes en orden para generar una gráfica de Varianza Explicada, como la anterior que vimos, dividimos eac h autovalor absoluto por la suma de todos los valores propios .

significance = [np.abs(i)/np.sum(eigenval) for i in eigenval]

#Plotting the cumulative sum of explained variance
plt.figure()
plt.plot(np.cumsum(meaning))
plt.xlabel('Number of components')
plt.ylabel('variance rod(%)') #for each component
plt.title('Pulsar data explained variable')
plt.show()

Este fragmento de código producirá la misma gráfica que vimos anteriormente, y puede ver de nuevo a continuación: [19659048] ¡Ahora úsalo y ajusta tus modelos!

¡Buena suerte!

Dejá un comentario