Implementación de PCA en Python con Scikit-Learn

I

Con la disponibilidad de CPU y GPU de alto rendimiento, es prácticamente posible resolver cada regresión, clasificación, agrupación y otros problemas relacionados mediante el uso de modelos de Machine Learning y aprendizaje profundo. Sin embargo, todavía existen varios factores que causan cuellos de botella en el rendimiento al desarrollar dichos modelos. Una gran cantidad de características en el conjunto de datos es uno de los factores que afectan tanto el tiempo de entrenamiento como la precisión de los modelos de Machine Learning. Tiene diferentes opciones para lidiar con una gran cantidad de características en un conjunto de datos.

  • Intente entrenar los modelos en el número original de funciones, lo que lleva días o semanas si el número de funciones es demasiado alto.
  • Reduzca el número de variables fusionando variables correlacionadas.
  • Extraiga las características más importantes del conjunto de datos que son responsables de la varianza máxima en la salida. Se utilizan diferentes técnicas estadísticas para este propósito, por ejemplo, análisis discriminante lineal, análisis factorial y análisis de componentes principales.

En este artículo, veremos cómo análisis de componentes principales se puede implementar utilizando la biblioteca Scikit-Learn de Python.

Análisis de componentes principales

Análisis de componentes principales, o PCA, es una técnica estadística para convertir datos de alta dimensión en datos de baja dimensión mediante la selección de las características más importantes que capturan la máxima información sobre el conjunto de datos. Las características se seleccionan en función de la variación que provocan en la salida. La característica que causa la mayor variación es el primer componente principal. La característica responsable de la segunda varianza más alta se considera el segundo componente principal y así sucesivamente. Es importante mencionar que los componentes principales no tienen correlación entre sí.

Ventajas de PCA

Hay dos ventajas principales de reducción de dimensionalidad con PCA.

  • El tiempo de entrenamiento de los algoritmos se reduce significativamente con menos funciones.
  • No siempre es posible analizar datos en grandes dimensiones. Por ejemplo, si hay 100 características en un conjunto de datos. El número total de diagramas de dispersión necesarios para visualizar los datos sería 100(100-1)2 = 4950. Prácticamente no es posible analizar datos de esta manera.

Normalización de características

Es imperativo mencionar que se debe normalizar un conjunto de características antes de aplicar PCA. Por ejemplo, si un conjunto de características tiene datos expresados ​​en unidades de kilogramos, años luz o millones, la escala de varianza es enorme en el conjunto de entrenamiento. Si se aplica PCA en un conjunto de características de este tipo, las cargas resultantes para las características con alta variación también serán grandes. Por lo tanto, los componentes principales estarán sesgados hacia características con alta varianza, lo que conducirá a resultados falsos.

Finalmente, el último punto que debemos recordar antes de comenzar a codificar es que el PCA es una técnica estadística y solo se puede aplicar a datos numéricos. Por lo tanto, las características categóricas deben convertirse en características numéricas antes de que se pueda aplicar la PCA.

Implementación de PCA con Scikit-Learn

En esta sección implementaremos PCA con la ayuda de Python Scikit-Learn biblioteca. Seguiremos el proceso clásico de Machine Learning en el que primero importaremos bibliotecas y conjuntos de datos, realizaremos análisis exploratorios de datos y preprocesamiento y finalmente entrenaremos nuestros modelos, haremos predicciones y evaluaremos la precisión. El único paso adicional será realizar PCA para averiguar el número óptimo de funciones antes de entrenar nuestros modelos. Estos pasos se han implementado de la siguiente manera:

Importación de bibliotecas

import numpy as np
import pandas as pd

Importar conjunto de datos

El conjunto de datos que vamos a utilizar en este artículo es el famoso Conjunto de datos de iris. Alguna información adicional sobre el conjunto de datos Iris está disponible en:

https://archive.ics.uci.edu/ml/datasets/iris

El conjunto de datos consta de 150 registros de la planta Iris con cuatro características: ‘longitud de sépalo’, ‘ancho de sépalo’, ‘longitud de pétalo’ y ‘ancho de pétalo’. Todas las funciones son numéricas. Los registros se han clasificado en una de las tres clases, es decir, ‘Iris-setosa’, ‘Iris-versicolor’ o ‘Iris-verginica’.

Ejecute el siguiente script para descargar el conjunto de datos usando pandas:

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
dataset = pd.read_csv(url, names=names)

Echemos un vistazo a cómo se ve nuestro conjunto de datos:

dataset.head()

La ejecución del comando anterior mostrará las primeras cinco filas de nuestro conjunto de datos como se muestra a continuación:

Longitud del sépalo Ancho del sépalo Longitud del pétalo Ancho del pétalo Clase

05.13,51.40,2Iris-setosa
14.93,01.40,2Iris-setosa
24.73.21.30,2Iris-setosa
34.63.11,50,2Iris-setosa
45,03.61.40,2Iris-setosa

Preprocesamiento

El primer paso del preprocesamiento es dividir el conjunto de datos en un conjunto de características y las etiquetas correspondientes. El siguiente script realiza esta tarea:

X = dataset.drop('Class', 1)
y = dataset['Class']

El script anterior almacena los conjuntos de funciones en el X variable y la serie de etiquetas correspondientes en el y variable.

El siguiente paso de preprocesamiento es dividir los datos en conjuntos de prueba y entrenamiento. Ejecute el siguiente script para hacerlo:

# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

Como se mencionó anteriormente, PCA funciona mejor con un conjunto de características normalizadas. Realizaremos una normalización escalar estándar para normalizar nuestro conjunto de características. Para hacer esto, ejecute el siguiente código:

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

Aplicación de PCA

Es solo una cuestión de tres líneas de código para realizar PCA usando la biblioteca Scikit-Learn de Python. los PCA class se utiliza para este propósito. PCA depende solo del conjunto de funciones y no de los datos de la etiqueta. Por lo tanto, PCA se puede considerar como una técnica de Machine Learning no supervisada.

Realizar PCA con Scikit-Learn es un proceso de dos pasos:

  • Inicializar el PCA class pasando el número de componentes al constructor.
  • Llama a fit y entonces transform métodos pasando el conjunto de características a estos métodos. los transform El método devuelve el número especificado de componentes principales.

Eche un vistazo al siguiente código:

from sklearn.decomposition import PCA

pca = PCA()
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)

En el código anterior, creamos un PCA objeto nombrado pca. No especificamos el número de componentes en el constructor. Por lo tanto, las cuatro características del conjunto de características se devolverán tanto para los conjuntos de entrenamiento como de prueba.

La clase PCA contiene explained_variance_ratio_ que devuelve la varianza causada por cada uno de los componentes principales. Ejecute la siguiente línea de código para encontrar el “índice de varianza explicado”.

explained_variance = pca.explained_variance_ratio_

los explained_variance La variable ahora es una matriz de tipo flotante que contiene relaciones de varianza para cada componente principal. Los valores para el explained_variance variable se ve así:

0,722265
0.239748
0.0333812
0,0046056

Puede verse que el primer componente principal es responsable de la varianza del 72,22%. De manera similar, el segundo componente principal causa una variación del 23,9% en el conjunto de datos. En conjunto, podemos decir que (72,22 + 23,9) el 96,21% por ciento de la información de clasificación contenida en el conjunto de características es capturada por los dos primeros componentes principales.

Primero intentemos usar 1 componente principal para entrenar nuestro algoritmo. Para hacerlo, ejecute el siguiente código:

from sklearn.decomposition import PCA

pca = PCA(n_components=1)
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)

El resto del proceso es sencillo.

Entrenando y haciendo predicciones

En este caso, usaremos la clasificación de bosque aleatoria para hacer las predicciones.

from sklearn.ensemble import RandomForestClassifier

classifier = RandomForestClassifier(max_depth=2, random_state=0)
classifier.fit(X_train, y_train)

# Predicting the Test set results
y_pred = classifier.predict(X_test)

Evaluación del desempeño

from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score

cm = confusion_matrix(y_test, y_pred)
print(cm)
print('Accuracy' + accuracy_score(y_test, y_pred))

La salida del script anterior se ve así:

[[11  0  0]
 [ 0 12  1]
 [ 0  1  5]]
0.933333333333

Se puede ver en el resultado que con solo una característica, el algoritmo de bosque aleatorio puede predecir correctamente 28 de 30 instancias, lo que resulta en una precisión del 93,33%.

Resultados con 2 y 3 componentes principales

Ahora intentemos evaluar el rendimiento de clasificación del algoritmo de bosque aleatorio con 2 componentes principales. Actualice este fragmento de código:

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)

Aquí, el número de componentes para PCA se ha establecido en 2. Los resultados de la clasificación con 2 componentes son los siguientes:

[[11  0  0]
 [ 0 10  3]
 [ 0  2  4]]
0.833333333333

Con dos componentes principales, la precisión de la clasificación disminuye al 83,33% en comparación con el 93,33% de 1 componente.

Con tres componentes principales, el resultado se ve así:

[[11  0  0]
 [ 0 12  1]
 [ 0  1  5]]
0.933333333333

Con tres componentes principales, la precisión de la clasificación aumenta nuevamente al 93,33%

Resultados con el conjunto completo de funciones

Intentemos encontrar los resultados con el conjunto completo de funciones. Para hacerlo, simplemente elimine la parte PCA del script que escribimos anteriormente. Los resultados con el conjunto completo de funciones, sin aplicar PCA, se ven así:

[[11  0  0]
 [ 0 13  0]
 [ 0  2  4]]
0.933333333333

La precisión recibida con el conjunto completo de funciones para el algoritmo de bosque aleatorio también es del 93,33%.

Discusión

A partir de la experimentación anterior, logramos un nivel óptimo de precisión al tiempo que redujimos significativamente la cantidad de características en el conjunto de datos. Vimos que la precisión lograda con un solo componente principal es igual a la precisión lograda con el conjunto de características de voluntad, es decir, 93,33%. También es pertinente mencionar que la precisión de un clasificador no necesariamente mejora con un mayor número de componentes principales. De los resultados podemos ver que la precisión alcanzada con un componente principal (93,33%) fue mayor que la alcanzada con dos componentes principales (83,33%).

La cantidad de componentes principales que se deben retener en un conjunto de características depende de varias condiciones, como la capacidad de almacenamiento, el tiempo de entrenamiento, el rendimiento, etc. En algunos conjuntos de datos, todas las características contribuyen por igual a la variación general, por lo tanto, todos los componentes principales son cruciales para la predicciones y ninguna puede ser ignorada. Una regla general es tomar el número de componentes principales que contribuyen a una varianza significativa e ignorar aquellos con rendimientos de varianza decrecientes. Una buena manera es graficar la varianza contra los componentes principales e ignorar los componentes principales con valores decrecientes como se muestra en el siguiente gráfico:

Por ejemplo, en el gráfico anterior, podemos ver que después del tercer componente principal, el cambio en la varianza casi disminuye. Por lo tanto, se pueden seleccionar los primeros tres componentes.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad