top of page
Search

Aprendizaje No Supervisado y reducción de dimensionalidad con PCA y TruncatedSVD

  • Writer: Antonio Romero Camacho
    Antonio Romero Camacho
  • Jan 8, 2021
  • 10 min read

Updated: Jan 10, 2021

En este post vamos a hablar de aprendizaje no supervisado, que es uno de los grandes tipos de aprendizaje de algoritmos de machine learning existentes. Con el fin de mostrar su utilidad, aplicaremos este tipo de algoritmos para resolver dos problemas de clasificación:

  • Iris Dataset: Clasificación del dataset de flores iris en sus tres subcategorías (setosa, versicolor y virgínica) según las características de la flor.

  • BBC Articles Dataset: Clasificación de una serie de artículos extraídos de la BBC en cinco categorías (negocios, entretenimiento, política, deportes y tecnología) basándose en la frecuencia de las palabras usadas para contar la noticia.

1. Introducción al Aprendizaje No Supervisado


Será necesario emplear técnicas de aprendizaje no supervisado cuando tratemos con datos sin etiquetar cuya estructura es desconocida a priori. Cuando se trata de problemas del mundo real, la mayoría de las veces, los datos no vienen con etiquetas predefinidas, así que vamos a querer desarrollar modelos de aprendizaje automático que puedan clasificar correctamente estos datos, encontrando por sí mismos algunos puntos en común en las características, que se utilizarán para predecir las clases sobre nuevos datos.


El objetivo de estas metodologías será la extracción de información significativa, sin la referencia de las variables de salida conocidas (etiquetas), y mediante la exploración de la estructura de dichos datos sin etiquetar.


Los algoritmos no supervisados parten de datos no etiquetados en los que no existe información de clasificación. La labor del algoritmo es la de encontrar patrones de agrupación (clusters) para sujetos que por sus características, en todas las variable introducidas en el modelo, son parecidos. En definitiva, se busca descubrir y describir la estructura interna de los datos sin ideas preconcebidas.


Hay varias categorías de algoritmos no supervisados, pero en este post sólo nos vamos a centrar en el agrupamiento o clustering y en la técnica de reducción de dimensionalidad Principal Components Analysis (PCA).


2. Clustering


El agrupamiento es una técnica exploratoria de análisis de datos, que se usa para organizar información en grupos con significado sin tener conocimiento previo de su estructura. Cada grupo es un conjunto de objetos similares pero diferentes de los objetos de los otros grupos. El objetivo es obtener un número de grupos de características similares.


De una manera visual, imaginemos que tenemos un conjunto de datos de monedas auténticas y falsas. Para su representación usaremos dos de las características extraídas al examinar estas monedas como por ejemplo: a) presión de estampado y b) frecuencia de resonancia.

Figura 1. Concepto de clustering

El modelo de aprendizaje automático será capaz de inferir que hay dos clusters (monedas auténticas y falsas) diferentes sin saber nada más de los datos.


Como comentábamos, los algoritmos de aprendizaje no supervisados tienen una amplia gama de aplicaciones y son muy útiles para resolver problemas del mundo real como:


a) Detección de anomalías

b) Recomendación de sistemas

c) Agrupación de documentos

d) Búsqueda de clientes con intereses comunes basados en sus compras


Un ejemplo de algoritmo de clustering es K-means . Su finalidad es simple, agrupar datos similares y descubrir sus patrones. Para ello, el algoritmo utiliza un número fijo de clusters (k) que es determinado por el científico de datos. En el primer caso de estudio determinaremos de forma empírica este valor de k.


3. Caso de Estudio 1: Iris Dataset


Como se adelantó en la introducción, el problema a resolver es la clasificación del dataset de flores iris en sus tres subcategorías (setosa, versicolor y virginica) según las características de la flor.

Figura 2. Diferentes clases de flor de iris

Este conocido dataset contiene 150 observaciones (50 observaciones de cada una de las clases anteriormente nombradas). Las características utilizadas para llevar a cabo el proceso de clasificación son: i) Longitud del Sépalo (cm), ii) Anchura del Sépalo (cm), iii) Longitud del Pétalo (cm), iv) Anchura del pétalo (cm). El dataset incluye las etiquetas de la clase a la que pertenece cada observación. Como en este post queremos aplicar técnicas de aprendizaje no supervisado las obviaremos, y sólo las emplearemos para comprobar la calidad de la clasificación al final.


Para comenzar importamos los datos a nuestro jupyter notebook. Este dataset está incluido dentro del conjunto de datasets de ScikitLearn.

Figura 3. Librerías que usaremos para resolver los dos casos de estudio propuestos
Figura 4. Carga del dataset Iris desde scikitlearn

Si los resultados del proceso de clustering se quieren mostrar gráficamente será necesario llevar a cabo tareas de reducción de dimensionalidad. En este caso tenemos cuatro características por lo que habría que transformar esas características en dos o tres para poder representar el resultado de la clasificación en el plano o en el espacio respectivamente.


Para ello, habrá que calcular la dimensión intrínseca que es el número de características necesarias para aproximar el dataset. Esta es la idea esencial detrás del concepto de reducción de dimensionalidad: ¿Cuanto se puede reducir el dataset?. Principal Component Analysis (PCA) permite identificar representaciones más compactas de los datos.


¿Cómo identificamos la dimensión intrínseca?. Habrá que calcular las componentes principales y calcular la varianza de cada una de ellas. La dimensión intrínseca será igual al número de componentes principales PCA que muestren altas varianzas. En la Figura 5 se muestra el código para determinar el valor de la dimensión intrínseca a partir de una gráfica de barras.

Figura 5. Calculo de las PCAs y sus varianzas

La Figura 6 muestra las componentes principales ordenadas en orden decreciente de varianza. En esta representación se asume que las componentes con baja varianza son ruido y las de más alta varianza son informativas. De acuerdo a la Figura 6, tan sólo dos de las cuatro características principales muestran una varianza alta. Es por esto que procederemos a reducir la dimensionalidad del dataset de cuatro a dos. Las dos características seleccionadas parecen ser altamente informativas.

Figura 6. Varianza explicada por cada componente principal

A continuación especificamos el número de características PCA que queremos conservar. Puesto que trabajaremos sólo con dos características, fijaremos el argumento n_components a 2. Esta acción devolverá las dos primeras características PCA. Se puede comprobar como el número de observaciones no ha variado (150 observaciones) mientras que el número de características ha sido reducido (2 frente a las 4 de partida).

Figura 7. Especificar el numero de características PCA se quieren conservar

Una vez reducidas las dimensiones del dataset a 2 procedemos a representar los datos en el plano. Para ello usaremos un gráfico de dispersión.

Figura 8. Código scatter plot de los datos transformados

En un primer vistazo, vemos que los datos aparecen representados en dos grupos claramente diferenciados. Recordemos que las clases diferentes de flor iris son tres. Los algoritmos de clustering que usaremos a continuación serán capaces de establecer una frontera también dentro del grupo de puntos que se muestra a la derecha.


Figura 9. Scatter plot enfrentando las dos características PCA

En este caso conocemos el número de grupos o clusters que queremos hacer. ¿Como seleccionar el número de clusters óptimo en caso de no conocer de antemano esa información?. Para ello se usa la regla del codo.


Cuando el clustering se lleva a cabo correctamente, los clusters o agrupamientos suelen ser muy compactos, agrupando los distintos puntos muy juntos. La inercia determina la dispersión de las medidas con respecto a los centroides del cluster. Cuanto menor sea la inercia, mejor será el proceso de clustering.


El método de clustering con el que vamos a empezar resolviendo el problema es KMeans. Para determinar el número óptimo de clusters, calcularemos la inercia para diferentes números de clusters (por ejemplo, entre 1 y 20). El número óptimo de clusters se obtiene representando la inercia frente al número de clusters y quedándonos con el punto donde la inercia empieza a decrecer más lentamente. Esto es así porque hay que llegar a un compromiso: queremos reducir la inercia pero tampoco queremos que haya un número excesivamente elevado de clusters.

Figura 10. Código para calcular las inercias del algoritmo KMeans

Como se puede apreciar en la Figura 11, la inercia comienza a decrecer más lentamente cuando el número de clusters es superior a 3. Esto coincide con la realidad, pues las clases de flores iris son Versicolor, Setosa y Virginica.

Figura 11. Regla del codo para determinar el número óptimo de clusters

El siguiente paso es aplicar el algoritmo KMeans para el número de clusters óptimo. Mediante el método predict somos capaces de predecir la clase a la que pertenecería cada una de las 150 observaciones. Esas etiquetas son numéricas y en este caso serán 0, 1 y 2.

Figura 12. KMeans para 3 clusters y predicción de etiquetas

Para evaluar el resultado del proceso de clustering se utiliza Cross-Tabulation. Esta técnica enfrenta las clases predichas por el algoritmo de clustering con las clases reales a la que pertenece cada observación. De esta manera podemos saber cómo de bien o mal ha realizado el algoritmo la separación en los distintos clusters.

A continuación vamos a comentar los resultados recogidos en la Figura 13. El dataframe presenta por filas las clases en las que ha organizado el algoritmo los datos (0,1 y 2) y por columnas las clases reales a las que pertenece cada observación (sedosa, versicolor, virginica). Las conclusiones que podemos extraer del dataframe son las siguientes:

  • Las 50 observaciones de la clase Setosa presentes en el dataset iris han sido clasificadas dentro del cluster 0.

  • De las 50 observaciones de la clase versicolor presentes en el dataset, 39 de ellas han sido clasificadas dentro del cluster 1 y 11 de ellas en el cluster 2.

  • De las De las 50 observaciones de la clase virginica presentes en el dataset, 36 de ellas han sido clasificadas como cluster 2 y 14 de ellas como clase 1.

Figura 13. Resultados de aplicar el algoritmo KMeans al dataset iris

A continuación representamos gráficamente el gráfico de dispersión de la figura 9 usando las etiquetas reales (Figura 15 izquierda) y las predichas por el algoritmo (Figura 15 derecha).

Figura 14. Código para generar los gráficos de dispersión de la Figura 15

El gráfico pone de manifiesto lo mismo que dedujimos del dataframe cross-tabulation: el algoritmo clasifica perfectamente las observaciones de la clase setosa y comete algunos errores al clasificar las observaciones pertenecientes a las clases versicolor y virginica. El error de clasificación cometido con los datos de la clase versicolor y virginica es del 22% y el 28% respectivamente.

Figura 15. Gráficos de dispersión coloreados con a) Etiquetas reales, b) Etiquetas predicción KMeans

Con el finde mejorar los resultados actuales se aplicó el algoritmo GaussianMixture, que puede utilizarse para buscar clusters de la misma manera que lo hace KMeans.

Figura 16. Resultados de aplicar el algoritmo GaussianMIxture

Las conclusiones que podemos extraer del dataframe en este caso son las siguientes:

  • Las 50 observaciones de la clase Setosa presentes en el dataset iris han sido clasificadas dentro del cluster 0.

  • De las 50 observaciones de la clase versicolor presentes en el dataset, 47 de ellas han sido clasificadas dentro del cluster 2 y 3 de ellas en el cluster 0. El error de clasificación en este caso es del 6%.

  • De las De las 50 observaciones de la clase virginica presentes en el dataset, 37 de ellas han sido clasificadas como cluster 0 y 13 de ellas como clase 2. El error de clasificación es del 26%.

Podemos concluir que el algoritmo de clustering GaussianMixture ha proporcionado los mejores resultados al minimizar el error de clasificación.


Si representamos gráficamente los resultados y comparamos con el gráfico coloreado con las etiquetas reales, vemos que los dos clusters más a la izquierda (que se corresponden con las clases setas y versicolor) son clasificados casi a la perfección. Sólo en el caso de la clase virginica, la mayoría de las veces las clasifica como clase 0 y algunas veces se confunde clasificándolas como clase 2.

Figura 17. Gráficos de dispersión coloreados con a) Etiquetas reales, b) Etiquetas predicción GaussianMixture

4. Caso de Estudio 2: BBC Dataset


En este caso queremos mostrar cómo resolver un problema de clasificación de una serie de artículos extraídos de la BBC en cinco categorías (negocios, entretenimiento, política, deportes y tecnología) basándose en la frecuencia de las palabras usadas para contar la noticia. ¿Cual es la diferencia con el caso de estudio anterior?.


En este caso el dataset no viene preparado con columnas de características como en el caso del dataset iris. El dataset incluye una serie de artículos en forma de cadenas de caracteres. Esos artículos habrá que transformarlos en características que permitan establecer patrones entre las distintas observaciones.


La característica que extraeremos de cada uno de los artículos es el word frequency o lo que es lo mismo, la frecuencia con la que cada palabra aparece en cada artículo. Cuando realizamos esta tarea, se genera una matriz que representa por filas cada artículo y por columnas cada una de las palabras que aparecen en los artículos. Las celdas contendrán la frecuencia con la que cada palabra aparece en cada artículo. Como es de esperar, la mayoría de estas celdas contendrán ceros. A este tipo de matrices se las conoce como sparse o dispersas (scipy.sparse.csr_matrix).


Para realizar la reducción de dimensionalidad en el caso de estudio anterior usamos PCA. Desafortunadamente, el PCA de ScikitLearn no soporta el uso de matrices dispersas. Es por esto que será necesario usar TruncatedSVD en su lugar. Ahí radica la principal diferencia y el interés en mostraros este segundo caso de estudio.


El dataset original contiene una columna llamada category, con la clase del artículo en cuestión, y otra llamada text con el texto del artículo. Como el objetivo es aplicar técnicas de aprendizaje no supervisado vamos obviar la existencia de la columna category.

Figura 18. DataFrame con el conjunto de datos de BBC News

Creamos una lista con los artículos de la columna text del dataframe data.

Figura 19. Leer el dataset y extraer la columna text como una lista

A continuación, extraemos las características de cada uno de los artículos. Para ello usaremos TfidfVectorizer que determinará ála frecuencia de aparición de cada palabra en el artículo en cuestión. La Figura 20 muestra que efectivamente el resultado es una matriz dispersa, donde casi todos los elementos son 0.

Figura 20. Matriz dispersa con la frecuencia de palabras por artículo

Esta matriz tiene 29126 columnas o lo que es lo mismo, 29126 características. Para aplicar reducción de dimensionalidad no podemos usar PCA como el caso de estudio 1. Usaremos TruncatedSVD, ya que es apto para trabajar con matrices dispersas en formato csr_matrix.


El número de componentes que queremos en los datos finales se selecciona con el argumento n_components del algoritmo TruncatedSVD. El método de clustering a usar en este caso será KMeans fijando el número de grupos a cinco (business, technology, entertainment, sports and politics).

Figura 21. Reducción de dimensionalidad, ajuste y predicción de etiquetas

Tras llevar a cabo la reducción de dimensionalidad, el ajuste y la predicción obtenemos las etiquetas para cada una de las observaciones. El algoritmo no ha visto en ningún momento a qué clase pertenece cada artículo durante el ajuste y predicción.


Para verificar la calidad de los resultados recurrimos de nuevo a la herramienta cross-tabulation que compara las etiquetas predichas con las reales. Los resultados se muestran en la Figura 22. Las conclusiones que podemos extraer son las siguientes:


  • El cluster 0 agrupa casi todos los artículos que eran categorizados bajo el tema business por el dataset. 494 de los 510 que pertenecían a esta categoría han sido correctamente clasificados. El error cometido es del 3%.

  • El cluster 1 agrupa todos los artículos que eran categorizados con el tema deporte por el dataset. 510 de los 511 que pertenecían a esta categoría han sido correctamente clasificados. El error cometido es del 0.2%.

  • El cluster 2 agrupa la mayoría de los artículos que eran categorizados del tema entretenimiento por el dataset. 370 de los 386 que pertenecían a esta categoría han sido correctamente clasificados. El error cometido es del 4%.

  • El cluster 3 se identifica con los artículos de política al agrupar 277 de los 477 artículos de política. La mayor parte de los errores de clasificación vienen de incluir algunos artículos de política dentro del cluster 0 de negocios (ambas temáticas usan terminologías muy similares en ocasiones). El error de clasificación es del 42%.

  • El cluster 4 se identifica con los artículos de tecnología. El error cometido por el algoritmo en este caso es inferior al 8% (370 aciertos de los 401 casos posibles).

Figura 22. Resultados de los 2225 artículos de la BBC

El modelo ha mostrado resultados muy buenos para cuatro de las cinco clases (inferior al 8%). El error de clusterización en el caso de los artículos de política es muy elevado y el algoritmo confunde la mayoría de las veces esos artículos con los de negocios.


5. Conclusión


En este post hemos mostrado cómo aplicar técnicas de aprendizaje no supervisado para resolver problemas de clasificación que implican reducción de dimensionalidad para su resolución. Para clusterizar hemos usado fundamentalmente el algoritmo de KMeans. Para reducir la dimensionalidad de los datos se han presentado dos técnicas:


  • Principal Components Analysis (PCA)

  • TruncatedSVD: aplicable en aquellos casos donde la reducción de dimensionalidad implique trabajar con matrices dispersas.


Espero que este nuevo post haya sido de vuestro interés. Quedo a la espera de vuestros comentarios.

 
 
 

Comentários


bottom of page