Análisis de componentes principales (PCA) en Python con Scikit-Learn

Con la disponibilidad de CPU y GPU de alto rendimiento, es prácticamente posible resolver cada regresión, clasificación, agrupamiento y otros problemas relacionados...

Con la disponibilidad de CPU y GPU de alto rendimiento, es prácticamente posible resolver cada regresión, clasificación, agrupamiento y otros problemas relacionados utilizando modelos de aprendizaje automático y aprendizaje profundo. Sin embargo, todavía hay varios factores que causan cuellos de botella en el rendimiento al desarrollar dichos modelos. La 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 aprendizaje automático. Tiene diferentes opciones para manejar una gran cantidad de características en un conjunto de datos.

  1. Trate de entrenar a 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.
  2. Reduzca el número de variables fusionando variables correlacionadas.
  3. Extraiga las características más importantes del conjunto de datos que son responsables de la variación máxima en la salida. Se utilizan diferentes técnicas estadísticas para este propósito, p. análisis discriminante lineal, análisis factorial y análisis de componentes principales.

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

Análisis de componentes principales

El 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 varianza más alta es el primer componente principal. La característica que es 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] (https://en.wikipedia.org/wiki/Dimensionality_reduction) con PCA.

  1. El tiempo de entrenamiento de los algoritmos se reduce significativamente con menos funciones.
  2. No siempre es posible analizar datos en dimensiones altas. 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 los datos de esta manera.

Normalización de funciones

Es imperativo mencionar que un conjunto de características debe normalizarse 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 variación 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 una varianza alta también serán grandes. Por lo tanto, los componentes principales estarán sesgados hacia características con una gran variación, lo que generará resultados falsos.

Finalmente, el último punto a recordar antes de comenzar a codificar es que 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 poder aplicar PCA.

Implementación de PCA con Scikit-Learn

En esta sección implementaremos PCA con la ayuda de la biblioteca Scikit-Aprender de Python. Seguiremos la canalización clásica de aprendizaje automático en la que primero importaremos bibliotecas y conjuntos de datos, realizaremos análisis y preprocesamiento de datos exploratorios 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

1
2
import numpy as np
import pandas as pd

Importando conjunto de datos

El conjunto de datos que vamos a utilizar en este artículo es el famoso Conjunto de datos de iris. Información adicional sobre el conjunto de datos de 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 del sépalo', 'ancho del sépalo', 'longitud del pétalo' y 'ancho del pétalo'. Todas las características 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:

1
2
3
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:

1
dataset.head()

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

  sepal-length   sepal-width   petal-length   petal-width   Class

0 5.1 3.5 1.4 0.2 Iris-setosa 1 4.9 3.0 1.4 0.2 Iris-setosa 2 4.7 3.2 1.3 0.2 Iris-setosa 3 4.6 3.1 1.5 0.2 Iris-setosa 4 5.0 3.6 1.4 0.2 Iris-setosa

Preprocesamiento

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

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

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

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

1
2
3
4
# 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 la normalización escalar estándar para normalizar nuestro conjunto de funciones. Para ello, ejecute el siguiente código:

1
2
3
4
5
from sklearn.preprocessing import StandardScaler

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

Solicitud de PCA

Solo es cuestión de tres líneas de código para realizar PCA utilizando la biblioteca Scikit-Learn de Python. La clase PCA se usa para este propósito. PCA depende solo del conjunto de características y no de los datos de la etiqueta. Por lo tanto, PCA puede considerarse como una técnica de aprendizaje automático no supervisado.

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

  1. Inicialice la clase PCA pasando el número de componentes al constructor.
  2. Llame a los métodos fit y luego transform pasando el conjunto de características a estos métodos. El método transform devuelve el número especificado de componentes principales.

Echa un vistazo al siguiente código:

1
2
3
4
5
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 objeto PCA llamado pca. No especificamos el número de componentes en el constructor. Por lo tanto, las cuatro funciones del conjunto de funciones se devolverán tanto para el conjunto de entrenamiento como para el 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 la "relación de varianza explicada".

1
explained_variance = pca.explained_variance_ratio_

La variable explained_variance ahora es una matriz de tipo flotante que contiene proporciones de varianza para cada componente principal. Los valores para la variable explained_variance se ven así:


0.722265 0.239748 0.0333812 0.0046056

Se puede observar que el primer componente principal es responsable del 72,22% de varianza. De manera similar, el segundo componente principal provoca una variación del 23,9 % en el conjunto de datos. Colectivamente 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:

1
2
3
4
5
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.

Entrenamiento y elaboración de predicciones {#entrenamiento y elaboración de predicciones}

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

1
2
3
4
5
6
7
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 {#evaluación del desempeño}

1
2
3
4
5
6
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í:

1
2
3
4
[[11  0  0]
 [ 0 12  1]
 [ 0  1  5]]
0.933333333333

En el resultado se puede ver que con solo una función, el algoritmo de bosque aleatorio puede predecir correctamente 28 de 30 instancias, lo que da como resultado una precisión del 93,33 %.

Resultados con 2 y 3 componentes principales {#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:

1
2
3
4
5
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:

1
2
3
4
[[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 % para 1 componente.

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

1
2
3
4
[[11  0  0]
 [ 0 12  1]
 [ 0  1  5]]
0.933333333333

Con tres componentes principales, la precisión de la clasificación vuelve a aumentar hasta el 93,33 %.

Resultados con 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í:

1
2
3
4
[[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 mismo tiempo que redujimos significativamente la cantidad de características en el conjunto de datos. Vimos que la precisión lograda con solo 1 componente principal es igual a la precisión lograda con el conjunto de características, 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 lograda con un componente principal (93,33%) fue mayor que la lograda con dos componentes principales (83,33%).

El número de componentes principales que se deben conservar en un conjunto de funciones depende de varias condiciones, como la capacidad de almacenamiento, el tiempo de entrenamiento, el rendimiento, etc. En algunos conjuntos de datos, todas las funciones contribuyen por igual a la varianza 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 del principal de los 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:

Variación de PC{.img-responsive}

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.

Yendo más lejos: proyecto de extremo a extremo portátil

¿Tu naturaleza inquisitiva te hace querer ir más allá? Recomendamos consultar nuestro Proyecto guiado: ["Predicción práctica del precio de la vivienda: aprendizaje automático en Python"](https://wikihtp.com/courses/hands-on-house- precio-predicción-aprendizaje-máquina-en-python/#cta){target="_blank"}.

[](https://wikihtp.com/ cursos/predicción-de-precio-de-la-casa-práctica-aprendizaje-de-máquina-en-python/#cta)

En este proyecto guiado, aprenderá a crear potentes modelos tradicionales de aprendizaje automático, así como modelos de aprendizaje profundo, utilizar Ensemble Learning y capacitar a los meta-aprendices para predecir los precios de la vivienda a partir de una bolsa de modelos Scikit-Learn y Keras.

Con Keras, la API de aprendizaje profundo creada sobre Tensorflow, experimentaremos con arquitecturas, crearemos un conjunto de modelos apilados y entrenaremos una red neuronal meta-aprendizaje (modelo de nivel 1) para averiguar el precio de un casa.

El aprendizaje profundo es sorprendente, pero antes de recurrir a él, se recomienda intentar resolver el problema con técnicas más simples, como los algoritmos de aprendizaje superficial. Nuestro rendimiento de referencia se basará en un algoritmo de Regresión de bosque aleatorio. Además, exploraremos la creación de conjuntos de modelos a través de Scikit-Learn a través de técnicas como embalaje y votación.

Este es un proyecto integral y, como todos los proyectos de aprendizaje automático, comenzaremos con Análisis exploratorio de datos, seguido de Preprocesamiento de datos y, finalmente, Creación de modelos de aprendizaje superficial y Profundo para ajustarse a los datos que hemos explorado y limpiado previamente.