Tutorial de Análisis de Componentes Principales (ACP) en Python
Aprende sobre el ACP y cómo se puede aprovechar para extraer información de los datos sin ninguna supervisión utilizando dos conjuntos de datos populares: Cáncer de mama y CIFAR-10.
El Análisis de Componentes Principales (ACP) es una técnica lineal de reducción de la dimensionalidad que puede utilizarse para extraer información de un espacio de alta dimensión proyectándola en un subespacio de dimensión inferior. Intenta conservar las partes esenciales que tienen más variación de los datos y eliminar las partes no esenciales con menos variación.
Las dimensiones no son más que características que representan los datos. Por ejemplo, una imagen de 28 X 28 tiene 784 elementos de imagen (píxeles) que son las dimensiones o características que en conjunto representan esa imagen.
Una cosa importante que hay que tener en cuenta sobre el ACP es que es una técnica de reducción de la dimensionalidad no supervisada, puedes agrupar los puntos de datos similares basándote en la correlación de características entre ellos sin ningún tipo de supervisión (o etiquetas), ¡y aprenderás a conseguirlo de forma práctica utilizando Python en secciones posteriores de este tutorial!
Según Wikipedia, el ACP es un procedimiento estadístico que utiliza una transformación ortogonal para convertir un conjunto de observaciones de variables posiblemente correlacionadas (entidades cada una de las cuales adopta diversos valores numéricos) en un conjunto de valores de variables linealmente no correlacionadas denominadas componentes principales.
Nota: Características, Dimensiones y Variables se refieren a lo mismo. Verás que se utilizan indistintamente.
Visualización de datos: Cuando se trabaja en cualquier problema relacionado con los datos, el reto en el mundo actual es el enorme volumen de datos, y las variables/características que definen esos datos. Para resolver un problema en el que los datos son la clave, necesitas una amplia exploración de los datos, como averiguar cómo se correlacionan las variables o comprender la distribución de unas pocas variables. Teniendo en cuenta que hay un gran número de variables o dimensiones a lo largo de las cuales se distribuyen los datos, la visualización puede ser un reto y casi imposible.
De ahí que el ACP pueda hacerlo por ti, ya que proyecta los datos en una dimensión inferior, permitiéndote así visualizarlos en un espacio 2D o 3D a simple vista.
Acelerar un algoritmo de machine learning (ML): Como la idea principal del PCA es la reducción de la dimensionalidad, puedes aprovecharla para acelerar el tiempo de entrenamiento y prueba de tu algoritmo de machine learning si tus datos tienen muchas características y el aprendizaje del algoritmo de ML es demasiado lento.
A un nivel abstracto, tomas un conjunto de datos que tiene muchas características y lo simplificas seleccionando unas pocas Principal Components de las características originales.
¿Qué es un Componente Principal?
Los componentes principales son la clave del ACP; representan lo que hay bajo el capó de tus datos. En términos sencillos, cuando los datos se proyectan en una dimensión inferior (supongamos tres dimensiones) desde un espacio superior, las tres dimensiones no son más que los tres Componentes Principales que captan (o contienen) la mayor parte de la varianza (información) de tus datos.
Los componentes principales tienen dirección y magnitud. La dirección representa a través de qué ejes principales se extienden mayoritariamente los datos o tienen más varianza, y la magnitud significa la cantidad de varianza que el Componente Principal capta de los datos cuando se proyecta sobre ese eje. Los componentes principales son una línea recta, y el primer componente principal contiene la mayor varianza de los datos. Cada componente principal posterior es ortogonal al anterior y tiene una varianza menor. De este modo, dado un conjunto de x variables correlacionadas sobre y muestras, se obtiene un conjunto de u componentes principales no correlacionados sobre las mismas y muestras.
La razón por la que consigues componentes principales no correlacionados a partir de las características originales es que las características correlacionadas contribuyen al mismo componente principal, reduciendo así las características de los datos originales en componentes principales no correlacionados; cada uno de ellos representa un conjunto diferente de características correlacionadas con distintas cantidades de variación.
Cada componente principal representa un porcentaje de la variación total captada de los datos.
En el tutorial de hoy, aplicarás principalmente el ACP en los dos casos de uso:
Data Visualization
Speeding ML algorithm
Para realizar las dos tareas anteriores, utilizarás dos famosos conjuntos de datos de Cáncer de Mama (numérico) y CIFAR - 10 (imagen).
Comprender los datos
Antes de seguir adelante y cargar los datos, ¡es bueno que comprendas y veas los datos con los que vas a trabajar!
Cáncer de mama
El conjunto de datos Cáncer de Mama es un dato multivariante de valor real que consta de dos clases, donde cada clase significa si una paciente tiene cáncer de mama o no. Las dos categorías son: malignas y benignas.
La clase maligna tiene 212 muestras, mientras que la clase benigna tiene 357 muestras.
Tiene 30 características compartidas por todas las clases: radio, textura, perímetro, área, suavidad, dimensión fractal, etc.
Puedes descargar el conjunto de datos sobre el cáncer de mama desde aquí, o más bien una forma fácil es cargándolo con la ayuda de la función sklearn biblioteca.
CIFAR - 10
El conjunto de datos CIFAR-10 (Instituto Canadiense de Investigación Avanzada) consta de 60000 imágenes en color de 32x32x3 cada una, con diez clases y 6000 imágenes por categoría.
El conjunto de datos consta de 50000 imágenes de entrenamiento y 10000 imágenes de prueba.
Las clases del conjunto de datos son avión, automóvil, pájaro, gato, ciervo, perro, rana, caballo, barco y camión.
Puedes descargar el conjunto de datos CIFAR desde aquí, o también puedes cargarlo sobre la marcha con la ayuda de una biblioteca de aprendizaje profundo como Keras.
Exploración de datos
Ahora cargarás y analizarás la Breast Cancer y CIFAR-10 conjuntos de datos. Ahora ya tienes una idea de la dimensionalidad de ambos conjuntos de datos.
Exploremos rápidamente ambos conjuntos de datos.
Exploración de datos sobre el cáncer de mama
Exploremos primero la Breast Cancer conjunto de datos.
Utilizarás sklearn's módulo datasets e importa el Breast Cancer conjunto de datos a partir de él.
Ahora importarás numpy ya que vas a remodelar el breast_labels para concatenarla con la breast_data para que finalmente puedas crear un DataFrame que tendrá tanto los datos como las etiquetas.
Después de reshaping las etiquetas, podrás concatenate los datos y las etiquetas a lo largo del segundo eje, lo que significa que la forma final de la matriz será 569 x 31.
final_breast_data = np.concatenate([breast_data,labels],axis=1)Con la tecnología de
Si observas en el features matriz, el label Falta el campo Por lo tanto, tendrás que añadirlo manualmente a la casilla features ya que estarás equiparando esta matriz con los nombres de las columnas de tu breast_dataset marco de datos.
Como las etiquetas originales están en 0,1 cambiarás las etiquetas a benign y malignant utilizando .replace . Utilizarás inplace=True que modificará el marco de datos breast_dataset.
breast_dataset['label'].replace(0,'Benign',inplace=True)
breast_dataset['label'].replace(1,'Malignant',inplace=True)Con la tecnología de
Imprimamos las últimas filas del archivo breast_dataset.
Una vez importado, utilizarás la función .load_data() para descargar los datos, descargará y almacenará los datos en tu Keras directory. Esto puede llevar algún tiempo en función de tu velocidad de Internet.
Averigüemos también el número total de etiquetas y los distintos tipos de clases que tienen los datos.
# Find the unique numbers from the train labels
classes = np.unique(y_train)
nClasses =len(classes)print('Total number of outputs : ', nClasses)print('Output classes : ', classes)Con la tecnología de
Ahora, para trazar la CIFAR-10 imágenes, importarás matplotlib y utiliza también un magic (%) comando %matplotlib inline ¡para indicar al cuaderno jupyter que muestre la salida dentro del propio cuaderno!
Para entenderlo mejor, vamos a crear un diccionario que tendrá nombres de clase con sus correspondientes etiquetas de clase categóricas.
label_dict ={0:'airplane',1:'automobile',2:'bird',3:'cat',4:'deer',5:'dog',6:'frog',7:'horse',8:'ship',9:'truck',}Con la tecnología de
plt.figure(figsize=[5,5])# Display the first image in training data
plt.subplot(121)
curr_img = np.reshape(x_train[0],(32,32,3))
plt.imshow(curr_img)print(plt.title("(Label: "+str(label_dict[y_train[0][0]])+")"))# Display the first image in testing data
plt.subplot(122)
curr_img = np.reshape(x_test[0],(32,32,3))
plt.imshow(curr_img)print(plt.title("(Label: "+str(label_dict[y_test[0][0]])+")"))Con la tecnología de
Aunque las dos imágenes anteriores están borrosas, de alguna manera puedes observar que la primera imagen es una rana con la etiqueta frogmientras que la segunda imagen es de un gato con la etiqueta cat.
Visualización de datos mediante PCA
Ahora viene la parte más emocionante de este tutorial. Como antes aprendiste que los proyectos PCA convierten datos de alta dimensión en un componente principal de baja dimensión, ¡ahora es el momento de visualizarlo con ayuda de Python!
Visualizar los datos del cáncer de mama
Empieza por Standardizing los datos, ya que el resultado del ACP se ve influido por la escala de las características de los datos.
Es una práctica habitual normalizar los datos antes de alimentar cualquier algoritmo de machine learning.
Para aplicar la normalización, importarás StandardScaler de la biblioteca sklearn y selecciona sólo las características del módulo breast_dataset que creaste en el paso Exploración de datos. Una vez que tengas las características, aplicarás el escalado haciendo fit_transform sobre los datos de las características.
Al aplicar StandardScaler, cada característica de tus datos debe tener una distribución normal, de modo que escale la distribución a una media de cero y una desviación típica de uno.
from sklearn.preprocessing import StandardScaler
x = breast_dataset.loc[:, features].values
x = StandardScaler().fit_transform(x)# normalizing the featuresCon la tecnología de
Ahora viene la parte crítica, las siguientes líneas de código proyectarán los datos de Cáncer de Mama de treinta dimensiones a dos dimensiones principal components.
Utilizarás la biblioteca sklearn para importar el archivo PCA y, en el método PCA, pasarás el número de componentes (n_componentes=2) y, por último, llamarás a fit_transform sobre los datos agregados. Aquí, varios componentes representan la dimensión inferior en la que proyectarás tus datos de dimensión superior.
from sklearn.decomposition import PCA
pca_breast = PCA(n_components=2)
principalComponents_breast = pca_breast.fit_transform(x)Con la tecnología de
A continuación, vamos a crear un DataFrame que tendrá los valores de los componentes principales de las 569 muestras.
principal_breast_Df = pd.DataFrame(data = principalComponents_breast
, columns =['principal component 1','principal component 2'])Con la tecnología de
Una vez que tengas los componentes principales, puedes encontrar los explained_variance_ratio. Te proporcionará la cantidad de información o varianza que contiene cada componente principal tras proyectar los datos a un subespacio de menor dimensión.
print('Explained variation per principal component: {}'.format(pca_breast.explained_variance_ratio_))Con la tecnología de
Explained variation per principal component:[0.442720260.18971182]Con la tecnología de
En la salida anterior, puedes observar que la función principal component 1 contiene el 44,2% de la información, mientras que el principal component 2 sólo contiene el 19% de la información. Además, otro punto a destacar es que al proyectar datos tridimensionales a bidimensionales, se perdió un 36,8% de información.
Vamos a trazar la visualización de las 569 muestras a lo largo del principal component - 1 y principal component - 2 eje. Debería darte una buena idea de cómo se distribuyen tus muestras entre las dos clases.
plt.figure()
plt.figure(figsize=(10,10))
plt.xticks(fontsize=12)
plt.yticks(fontsize=14)
plt.xlabel('Principal Component - 1',fontsize=20)
plt.ylabel('Principal Component - 2',fontsize=20)
plt.title("Principal Component Analysis of Breast Cancer Dataset",fontsize=20)
targets =['Benign','Malignant']
colors =['r','g']for target, color inzip(targets,colors):
indicesToKeep = breast_dataset['label']== target
plt.scatter(principal_breast_Df.loc[indicesToKeep,'principal component 1'], principal_breast_Df.loc[indicesToKeep,'principal component 2'], c = color, s =50)
plt.legend(targets,prop={'size':15})Con la tecnología de
<matplotlib.legend.Legend at 0x14552a630><Figure size 432x288 with0 Axes>Con la tecnología de
En el gráfico anterior, puedes observar que las dos clases benign y malignantcuando se proyectan a un espacio bidimensional, pueden ser linealmente separables hasta cierto punto. Otras observaciones pueden ser que la benign se extiende en comparación con la clase malignant clase.
Visualización de los datos CIFAR - 10
Las siguientes líneas de código para visualizar los datos de CIFAR-10 son bastante similares a la visualización PCA de los datos del Cáncer de Mama.
Comprobemos rápidamente los valores máximo y mínimo de las imágenes de entrenamiento CIFAR-10 y normalize los píxeles entre 0 y 1, ambos inclusive.
A continuación, crearás un DataFrame que contendrá los valores en píxeles de las imágenes junto con sus respectivas etiquetas en un formato fila-columna.
Pero antes de eso, vamos a remodelar las dimensiones de la imagen de tres a una (aplanar las imágenes).
Perfecto. El tamaño del marco de datos es correcto, ya que hay 50.000 imágenes de entrenamiento, cada una de las cuales tiene 3072 píxeles y una columna adicional para las etiquetas, por lo que en total hay 3073.
El ACP se aplicará en todas las columnas excepto en la última, que es la etiqueta de cada imagen.
A continuación, crearás el método PCA, pasarás el número de componentes a dos y aplicarás fit_transform en los datos de entrenamiento, esto puede tardar unos segundos ya que hay 50.000 muestras
pca_cifar = PCA(n_components=2)
principalComponents_cifar = pca_cifar.fit_transform(df_cifar.iloc[:,:-1])Con la tecnología de
A continuación, convertirás los componentes principales de cada una de las 50.000 imágenes de una matriz numpy a un DataFrame pandas.
principal_cifar_Df = pd.DataFrame(data = principalComponents_cifar
, columns =['principal component 1','principal component 2'])
principal_cifar_Df['y']= y_train
Con la tecnología de
Averigüemos rápidamente la cantidad de información o variance se mantienen los componentes principales.
print('Explained variation per principal component: {}'.format(pca_cifar.explained_variance_ratio_))Con la tecnología de
Explained variation per principal component:[0.29076630.11253144]Con la tecnología de
Bueno, parece que los componentes principales 1 y 2 retuvieron una cantidad decente de información, dado que los datos se proyectaron de 3072 dimensiones a sólo dos componentes principales.
Ha llegado el momento de visualizar los datos CIFAR-10 en un espacio bidimensional. Recuerda que hay cierto solapamiento de clases semánticas en este conjunto de datos, lo que significa que una rana puede tener una forma ligeramente similar a la de un gato o un ciervo a la de un perro; sobre todo cuando se proyecta en un espacio bidimensional. Puede que las diferencias entre ellos no se capten tan bien.
import seaborn as sns
plt.figure(figsize=(16,10))
sns.scatterplot(
x="principal component 1", y="principal component 2",
hue="y",
palette=sns.color_palette("hls",10),
data=principal_cifar_Df,
legend="full",
alpha=0.3)Con la tecnología de
En la figura anterior, puedes observar que los componentes principales captaron cierta variación, ya que hay cierta estructura en los puntos cuando se proyectan a lo largo de los dos ejes de componentes principales. Los puntos que pertenecen a la misma clase están cerca unos de otros, y los puntos o imágenes que son muy diferentes semánticamente están más alejados unos de otros.
Acelera el entrenamiento del aprendizaje profundo utilizando PCA con el conjunto de datos CIFAR - 10
En este segmento final del tutorial, aprenderás cómo puedes acelerar el proceso de entrenamiento de tu modelo de Aprendizaje Profundo utilizando PCA.
Nota: Para aprender las terminologías básicas que se utilizarán en esta sección, no dudes en consultar este tutorial.
En primer lugar, normalicemos las imágenes de entrenamiento y de prueba. Si recuerdas, las imágenes de entrenamiento se normalizaron en la parte de visualización del ACP, así que sólo tienes que normalizar las imágenes de prueba. Así que, ¡hagámoslo rápidamente!
A continuación, realizarás la instancia del modelo PCA.
Aquí también puedes pasar cuánta varianza quieres que capte el ACP. Pasemos 0,9 como parámetro al modelo PCA, lo que significa que el PCA retendrá el 90% de la varianza y el number of components necesario para captar el 90% de variación.
Ten en cuenta que antes pasaste n_components como parámetro y así podrías averiguar cuánta varianza captan esos dos componentes. Pero aquí mencionamos explícitamente cuánta varianza queremos que capte el ACP y, por tanto, la n_components variará en función del parámetro de varianza.
Si no pasas ninguna varianza, el número de componentes será igual a la dimensión original de los datos.
En la salida anterior, puedes observar que para conseguir una varianza del 90%, la dimensión se redujo a 99 componentes principales de la 3072 dimensiones.
Por último, aplicarás transform tanto en el conjunto de entrenamiento como en el de prueba para generar un conjunto de datos transformado a partir de los parámetros generados por el fit .
train_img_pca = pca.transform(x_train_flat)
test_img_pca = pca.transform(x_test_flat)Con la tecnología de
A continuación, vamos a importar rápidamente las bibliotecas necesarias para ejecutar el modelo de aprendizaje profundo.
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils
from keras.optimizers import RMSprop
Con la tecnología de
Ahora, convertirás tus etiquetas de entrenamiento y prueba en vectores de codificación de un solo golpe.
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)Con la tecnología de
Vamos a definir el número de épocas, el número de clases y el tamaño del lote para tu modelo.
_________________________________________________________________
Layer(type) Output Shape Param #
=================================================================dense_1(Dense)(None,1024)102400
_________________________________________________________________
dense_2(Dense)(None,1024)1049600
_________________________________________________________________
dense_3(Dense)(None,512)524800
_________________________________________________________________
dense_4(Dense)(None,256)131328
_________________________________________________________________
dense_5(Dense)(None,10)2570=================================================================
Total params:1,810,698
Trainable params:1,810,698
Non-trainable params:0
_________________________________________________________________
Con la tecnología de
Por último, ¡es hora de compilar y entrenar el modelo!
model.compile(loss='categorical_crossentropy',
optimizer=RMSprop(),
metrics=['accuracy'])
history = model.fit(train_img_pca, y_train,batch_size=batch_size,epochs=epochs,verbose=1,
validation_data=(test_img_pca, y_test))Con la tecnología de
A partir del resultado anterior, puedes observar que el tiempo empleado en entrenar cada época fue de sólo 7 seconds en una CPU. El modelo hizo un trabajo decente con los datos de entrenamiento, consiguiendo 70% precisión, mientras que sólo consiguió 56% precisión en la prueba dat. Esto significa que sobreajustó los datos de entrenamiento. Sin embargo, recuerda que los datos se proyectaron a 99 dimensiones de 3072 dimensiones y, a pesar de ello, ¡hizo un gran trabajo!
Por último, veamos cuánto tiempo tarda el modelo en entrenarse en el conjunto de datos original y cuánta precisión puede conseguir utilizando el mismo modelo de aprendizaje profundo.
model = Sequential()
model.add(Dense(1024, activation='relu', input_shape=(3072,)))
model.add(Dense(1024, activation='relu'))
model.add(Dense(512, activation='relu'))
model.add(Dense(256, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer=RMSprop(),
metrics=['accuracy'])
history = model.fit(x_train_flat, y_train,batch_size=batch_size,epochs=epochs,verbose=1,
validation_data=(x_test_flat, y_test))Con la tecnología de
¡Voilà! A partir de los resultados anteriores, es evidente que el tiempo empleado en el entrenamiento de cada época fue de aproximadamente 23 seconds en una CPU que era casi tres veces mayor que el modelo entrenado con el resultado del PCA.
Además, tanto la precisión de entrenamiento como la de prueba son inferiores a la precisión que conseguiste con los 99 componentes principales como entrada al modelo.
Así pues, aplicando el PCA a los datos de entrenamiento pudiste entrenar tu algoritmo de aprendizaje profundo no sólo fastpero también consiguió mejores accuracy en los datos de prueba en comparación con el algoritmo de aprendizaje profundo entrenado con los datos de entrenamiento originales.
¡Ve más lejos!
Enhorabuena por terminar el tutorial.
Este tutorial fue una excelente y completa introducción al ACP en Python, que cubrió tanto los conceptos teóricos como los prácticos del ACP.
Si quieres profundizar en las técnicas de reducción de la dimensionalidad, considera la posibilidad de leer sobre la incrustación estocástica de vecinos distribuida en t, conocida comúnmente como tSNE, que es una técnica probabilística no lineal de reducción de la dimensionalidad.
Si quieres aprender más sobre técnicas de aprendizaje no supervisado como el PCA, sigue el curso Aprendizaje no supervisado en Python de DataCamp.
En este tutorial, aprenderás a utilizar el PCA (análisis de componentes principales) de R para extraer datos con muchas variables y crear visualizaciones para mostrar esos datos.
Este tutorial te introducirá en el concepto de detección de objetos en Python utilizando la biblioteca OpenCV y cómo puedes utilizarla para realizar tareas como la detección facial.
Aprende a gestionar hilos y procesos con el módulo de multiprocesamiento de Python. Descubre las técnicas clave de la programación paralela. Mejora la eficacia de tu código con ejemplos.
Introducción al ACP en Python
El Análisis de Componentes Principales (ACP) es una técnica lineal de reducción de la dimensionalidad que puede utilizarse para extraer información de un espacio de alta dimensión proyectándola en un subespacio de dimensión inferior. Intenta conservar las partes esenciales que tienen más variación de los datos y eliminar las partes no esenciales con menos variación.
Las dimensiones no son más que características que representan los datos. Por ejemplo, una imagen de 28 X 28 tiene 784 elementos de imagen (píxeles) que son las dimensiones o características que en conjunto representan esa imagen.
Una cosa importante que hay que tener en cuenta sobre el ACP es que es una técnica de reducción de la dimensionalidad no supervisada, puedes agrupar los puntos de datos similares basándote en la correlación de características entre ellos sin ningún tipo de supervisión (o etiquetas), ¡y aprenderás a conseguirlo de forma práctica utilizando Python en secciones posteriores de este tutorial!
Según Wikipedia, el ACP es un procedimiento estadístico que utiliza una transformación ortogonal para convertir un conjunto de observaciones de variables posiblemente correlacionadas (entidades cada una de las cuales adopta diversos valores numéricos) en un conjunto de valores de variables linealmente no correlacionadas denominadas componentes principales.
Nota: Características, Dimensiones y Variables se refieren a lo mismo. Verás que se utilizan indistintamente.
Practica el Análisis de Componentes Principales (ACP) en Python con este ejercicio práctico.
¿Dónde puedes aplicar la PCA?
Visualización de datos: Cuando se trabaja en cualquier problema relacionado con los datos, el reto en el mundo actual es el enorme volumen de datos, y las variables/características que definen esos datos. Para resolver un problema en el que los datos son la clave, necesitas una amplia exploración de los datos, como averiguar cómo se correlacionan las variables o comprender la distribución de unas pocas variables. Teniendo en cuenta que hay un gran número de variables o dimensiones a lo largo de las cuales se distribuyen los datos, la visualización puede ser un reto y casi imposible.
De ahí que el ACP pueda hacerlo por ti, ya que proyecta los datos en una dimensión inferior, permitiéndote así visualizarlos en un espacio 2D o 3D a simple vista.
Acelerar un algoritmo de machine learning (ML): Como la idea principal del PCA es la reducción de la dimensionalidad, puedes aprovecharla para acelerar el tiempo de entrenamiento y prueba de tu algoritmo de machine learning si tus datos tienen muchas características y el aprendizaje del algoritmo de ML es demasiado lento.
A un nivel abstracto, tomas un conjunto de datos que tiene muchas características y lo simplificas seleccionando unas pocas
Principal Componentsde las características originales.¿Qué es un Componente Principal?
Los componentes principales son la clave del ACP; representan lo que hay bajo el capó de tus datos. En términos sencillos, cuando los datos se proyectan en una dimensión inferior (supongamos tres dimensiones) desde un espacio superior, las tres dimensiones no son más que los tres Componentes Principales que captan (o contienen) la mayor parte de la varianza (información) de tus datos.
Los componentes principales tienen dirección y magnitud. La dirección representa a través de qué ejes principales se extienden mayoritariamente los datos o tienen más varianza, y la magnitud significa la cantidad de varianza que el Componente Principal capta de los datos cuando se proyecta sobre ese eje. Los componentes principales son una línea recta, y el primer componente principal contiene la mayor varianza de los datos. Cada componente principal posterior es ortogonal al anterior y tiene una varianza menor. De este modo, dado un conjunto de x variables correlacionadas sobre y muestras, se obtiene un conjunto de u componentes principales no correlacionados sobre las mismas y muestras.
La razón por la que consigues componentes principales no correlacionados a partir de las características originales es que las características correlacionadas contribuyen al mismo componente principal, reduciendo así las características de los datos originales en componentes principales no correlacionados; cada uno de ellos representa un conjunto diferente de características correlacionadas con distintas cantidades de variación.
Cada componente principal representa un porcentaje de la variación total captada de los datos.
En el tutorial de hoy, aplicarás principalmente el ACP en los dos casos de uso:
Data VisualizationSpeeding ML algorithmPara realizar las dos tareas anteriores, utilizarás dos famosos conjuntos de datos de Cáncer de Mama (numérico) y CIFAR - 10 (imagen).
Comprender los datos
Antes de seguir adelante y cargar los datos, ¡es bueno que comprendas y veas los datos con los que vas a trabajar!
Cáncer de mama
El conjunto de datos Cáncer de Mama es un dato multivariante de valor real que consta de dos clases, donde cada clase significa si una paciente tiene cáncer de mama o no. Las dos categorías son: malignas y benignas.
La clase maligna tiene 212 muestras, mientras que la clase benigna tiene 357 muestras.
Tiene 30 características compartidas por todas las clases: radio, textura, perímetro, área, suavidad, dimensión fractal, etc.
Puedes descargar el conjunto de datos sobre el cáncer de mama desde aquí, o más bien una forma fácil es cargándolo con la ayuda de la función
sklearnbiblioteca.CIFAR - 10
El conjunto de datos CIFAR-10 (Instituto Canadiense de Investigación Avanzada) consta de 60000 imágenes en color de 32x32x3 cada una, con diez clases y 6000 imágenes por categoría.
El conjunto de datos consta de 50000 imágenes de entrenamiento y 10000 imágenes de prueba.
Las clases del conjunto de datos son avión, automóvil, pájaro, gato, ciervo, perro, rana, caballo, barco y camión.
Puedes descargar el conjunto de datos CIFAR desde aquí, o también puedes cargarlo sobre la marcha con la ayuda de una biblioteca de aprendizaje profundo como
Keras.Exploración de datos
Ahora cargarás y analizarás la
Breast CanceryCIFAR-10conjuntos de datos. Ahora ya tienes una idea de la dimensionalidad de ambos conjuntos de datos.Exploremos rápidamente ambos conjuntos de datos.
Exploración de datos sobre el cáncer de mama
Exploremos primero la
Breast Cancerconjunto de datos.Utilizarás
sklearn'smódulodatasetse importa elBreast Cancerconjunto de datos a partir de él.load_breast_cancerte dará tanto las etiquetas como los datos. Para obtener los datos, llamarás a.datay para obtener las etiquetas.target.Los datos tienen 569 muestras con treinta características, y cada muestra tiene asociada una etiqueta. Hay dos etiquetas en este conjunto de datos.
Comprobemos la forma de los datos.
Aunque para este tutorial no necesites las etiquetas, para una mejor comprensión, vamos a cargar las etiquetas y comprobar la forma.
Ahora importarás
numpyya que vas a remodelar elbreast_labelspara concatenarla con labreast_datapara que finalmente puedas crear unDataFrameque tendrá tanto los datos como las etiquetas.Después de
reshapinglas etiquetas, podrásconcatenatelos datos y las etiquetas a lo largo del segundo eje, lo que significa que la forma final de la matriz será569 x 31.Ahora importarás
pandaspara crear elDataFramede los datos finales para representar los datos de forma tabular.¡Vamos a imprimir rápidamente las características que hay en el conjunto de datos del cáncer de mama!
Si observas en el
featuresmatriz, ellabelFalta el campo Por lo tanto, tendrás que añadirlo manualmente a la casillafeaturesya que estarás equiparando esta matriz con los nombres de las columnas de tubreast_datasetmarco de datos.¡Estupendo! Ahora incrustarás los nombres de las columnas en el
breast_datasetmarco de datos.Vamos a imprimir las primeras filas de la trama de datos.
5 filas × 31 columnas
Como las etiquetas originales están en
0,1cambiarás las etiquetas abenignymalignantutilizando.replace. Utilizarásinplace=Trueque modificará el marco de datosbreast_dataset.Imprimamos las últimas filas del archivo
breast_dataset.5 filas × 31 columnas
CIFAR - 10 Exploración de datos
A continuación, explorarás la
CIFAR - 10conjunto de datos de imágenesPuedes cargar el
CIFAR - 10utilizando una biblioteca de aprendizaje profundo llamadaKeras.Una vez importado, utilizarás la función
.load_data()para descargar los datos, descargará y almacenará los datos en tuKerasdirectory. Esto puede llevar algún tiempo en función de tu velocidad de Internet.La línea de código anterior devuelve las imágenes de entrenamiento y de prueba junto con las etiquetas.
Imprimamos rápidamente la forma de las imágenes de entrenamiento y de prueba.
Imprimamos también la forma de las etiquetas.
Averigüemos también el número total de etiquetas y los distintos tipos de clases que tienen los datos.
Ahora, para trazar la
CIFAR-10imágenes, importarásmatplotliby utiliza también unmagic (%)comando%matplotlib inline¡para indicar al cuaderno jupyter que muestre la salida dentro del propio cuaderno!Para entenderlo mejor, vamos a crear un diccionario que tendrá nombres de clase con sus correspondientes etiquetas de clase categóricas.
Aunque las dos imágenes anteriores están borrosas, de alguna manera puedes observar que la primera imagen es una rana con la etiqueta
frogmientras que la segunda imagen es de un gato con la etiquetacat.Visualización de datos mediante PCA
Ahora viene la parte más emocionante de este tutorial. Como antes aprendiste que los proyectos PCA convierten datos de alta dimensión en un componente principal de baja dimensión, ¡ahora es el momento de visualizarlo con ayuda de Python!
Visualizar los datos del cáncer de mama
Empieza por
Standardizinglos datos, ya que el resultado del ACP se ve influido por la escala de las características de los datos.Es una práctica habitual normalizar los datos antes de alimentar cualquier algoritmo de machine learning.
Para aplicar la normalización, importarás
StandardScalerde la biblioteca sklearn y selecciona sólo las características del módulobreast_datasetque creaste en el paso Exploración de datos. Una vez que tengas las características, aplicarás el escalado haciendofit_transformsobre los datos de las características.Al aplicar StandardScaler, cada característica de tus datos debe tener una distribución normal, de modo que escale la distribución a una media de cero y una desviación típica de uno.
Comprobemos si los datos normalizados tienen una media de cero y una desviación típica de uno.
Convirtamos las características normalizadas en un formato tabular con la ayuda de DataFrame.
5 filas × 30 columnas
Ahora viene la parte crítica, las siguientes líneas de código proyectarán los datos de Cáncer de Mama de treinta dimensiones a dos dimensiones
principal components.Utilizarás la biblioteca sklearn para importar el archivo
PCAy, en el método PCA, pasarás el número de componentes (n_componentes=2) y, por último, llamarás a fit_transform sobre los datos agregados. Aquí, varios componentes representan la dimensión inferior en la que proyectarás tus datos de dimensión superior.A continuación, vamos a crear un DataFrame que tendrá los valores de los componentes principales de las 569 muestras.
explained_variance_ratio. Te proporcionará la cantidad de información o varianza que contiene cada componente principal tras proyectar los datos a un subespacio de menor dimensión.En la salida anterior, puedes observar que la función
principal component 1contiene el 44,2% de la información, mientras que elprincipal component 2sólo contiene el 19% de la información. Además, otro punto a destacar es que al proyectar datos tridimensionales a bidimensionales, se perdió un 36,8% de información.Vamos a trazar la visualización de las 569 muestras a lo largo del
principal component - 1yprincipal component - 2eje. Debería darte una buena idea de cómo se distribuyen tus muestras entre las dos clases.En el gráfico anterior, puedes observar que las dos clases
benignymalignantcuando se proyectan a un espacio bidimensional, pueden ser linealmente separables hasta cierto punto. Otras observaciones pueden ser que labenignse extiende en comparación con la clasemalignantclase.Visualización de los datos CIFAR - 10
Las siguientes líneas de código para visualizar los datos de CIFAR-10 son bastante similares a la visualización PCA de los datos del Cáncer de Mama.
normalizelos píxeles entre 0 y 1, ambos inclusive.A continuación, crearás un DataFrame que contendrá los valores en píxeles de las imágenes junto con sus respectivas etiquetas en un formato fila-columna.
Pero antes de eso, vamos a remodelar las dimensiones de la imagen de tres a una (aplanar las imágenes).
Perfecto. El tamaño del marco de datos es correcto, ya que hay 50.000 imágenes de entrenamiento, cada una de las cuales tiene 3072 píxeles y una columna adicional para las etiquetas, por lo que en total hay 3073.
El ACP se aplicará en todas las columnas excepto en la última, que es la etiqueta de cada imagen.
5 filas × 3073 columnas
fit_transformen los datos de entrenamiento, esto puede tardar unos segundos ya que hay 50.000 muestrasA continuación, convertirás los componentes principales de cada una de las 50.000 imágenes de una matriz numpy a un DataFrame pandas.
variancese mantienen los componentes principales.Bueno, parece que los componentes principales 1 y 2 retuvieron una cantidad decente de información, dado que los datos se proyectaron de 3072 dimensiones a sólo dos componentes principales.
Ha llegado el momento de visualizar los datos CIFAR-10 en un espacio bidimensional. Recuerda que hay cierto solapamiento de clases semánticas en este conjunto de datos, lo que significa que una rana puede tener una forma ligeramente similar a la de un gato o un ciervo a la de un perro; sobre todo cuando se proyecta en un espacio bidimensional. Puede que las diferencias entre ellos no se capten tan bien.
En la figura anterior, puedes observar que los componentes principales captaron cierta variación, ya que hay cierta estructura en los puntos cuando se proyectan a lo largo de los dos ejes de componentes principales. Los puntos que pertenecen a la misma clase están cerca unos de otros, y los puntos o imágenes que son muy diferentes semánticamente están más alejados unos de otros.
Acelera el entrenamiento del aprendizaje profundo utilizando PCA con el conjunto de datos CIFAR - 10
En este segmento final del tutorial, aprenderás cómo puedes acelerar el proceso de entrenamiento de tu modelo de Aprendizaje Profundo utilizando PCA.
Nota: Para aprender las terminologías básicas que se utilizarán en esta sección, no dudes en consultar este tutorial.
En primer lugar, normalicemos las imágenes de entrenamiento y de prueba. Si recuerdas, las imágenes de entrenamiento se normalizaron en la parte de visualización del ACP, así que sólo tienes que normalizar las imágenes de prueba. Así que, ¡hagámoslo rápidamente!
Vamos a
reshapelos datos de la prueba.A continuación, realizarás la instancia del modelo PCA.
Aquí también puedes pasar cuánta varianza quieres que capte el ACP. Pasemos 0,9 como parámetro al modelo PCA, lo que significa que el PCA retendrá el 90% de la varianza y el
number of componentsnecesario para captar el 90% de variación.Ten en cuenta que antes pasaste
n_componentscomo parámetro y así podrías averiguar cuánta varianza captan esos dos componentes. Pero aquí mencionamos explícitamente cuánta varianza queremos que capte el ACP y, por tanto, lan_componentsvariará en función del parámetro de varianza.Si no pasas ninguna varianza, el número de componentes será igual a la dimensión original de los datos.
Entonces encajarás el
PCAsobre las imágenes de entrenamiento.Ahora vamos a averiguar cuántos
n_componentsSe utilizó el ACP para captar el 0,9 de varianza.En la salida anterior, puedes observar que para conseguir una varianza del 90%, la dimensión se redujo a
99componentes principales de la3072dimensiones.Por último, aplicarás
transformtanto en el conjunto de entrenamiento como en el de prueba para generar un conjunto de datos transformado a partir de los parámetros generados por elfit.A continuación, vamos a importar rápidamente las bibliotecas necesarias para ejecutar el modelo de aprendizaje profundo.
Ahora, convertirás tus etiquetas de entrenamiento y prueba en vectores de codificación de un solo golpe.
Vamos a definir el número de épocas, el número de clases y el tamaño del lote para tu modelo.
A continuación, definirás tu
Sequential¡modelo!Imprimamos el resumen del modelo.
Por último, ¡es hora de compilar y entrenar el modelo!
A partir del resultado anterior, puedes observar que el tiempo empleado en entrenar cada época fue de sólo
7 secondsen una CPU. El modelo hizo un trabajo decente con los datos de entrenamiento, consiguiendo70%precisión, mientras que sólo consiguió56%precisión en la prueba dat. Esto significa que sobreajustó los datos de entrenamiento. Sin embargo, recuerda que los datos se proyectaron a 99 dimensiones de 3072 dimensiones y, a pesar de ello, ¡hizo un gran trabajo!Por último, veamos cuánto tiempo tarda el modelo en entrenarse en el conjunto de datos original y cuánta precisión puede conseguir utilizando el mismo modelo de aprendizaje profundo.
¡Voilà! A partir de los resultados anteriores, es evidente que el tiempo empleado en el entrenamiento de cada época fue de aproximadamente
23 secondsen una CPU que era casi tres veces mayor que el modelo entrenado con el resultado del PCA.Además, tanto la precisión de entrenamiento como la de prueba son inferiores a la precisión que conseguiste con los 99 componentes principales como entrada al modelo.
Así pues, aplicando el PCA a los datos de entrenamiento pudiste entrenar tu algoritmo de aprendizaje profundo no sólo
fastpero también consiguió mejoresaccuracyen los datos de prueba en comparación con el algoritmo de aprendizaje profundo entrenado con los datos de entrenamiento originales.¡Ve más lejos!
Enhorabuena por terminar el tutorial.
Este tutorial fue una excelente y completa introducción al ACP en Python, que cubrió tanto los conceptos teóricos como los prácticos del ACP.
Si quieres profundizar en las técnicas de reducción de la dimensionalidad, considera la posibilidad de leer sobre la incrustación estocástica de vecinos distribuida en t, conocida comúnmente como tSNE, que es una técnica probabilística no lineal de reducción de la dimensionalidad.
Si quieres aprender más sobre técnicas de aprendizaje no supervisado como el PCA, sigue el curso Aprendizaje no supervisado en Python de DataCamp.
Referencias: