¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Inteligencia artificial fácil
  3. Albaricoques, cerezas y clustering
Extrait - Inteligencia artificial fácil Machine Learning y Deep Learning prácticos
Extractos del libro
Inteligencia artificial fácil Machine Learning y Deep Learning prácticos
3 opiniones
Volver a la página de compra del libro

Albaricoques, cerezas y clustering

Una máquina que aprende sola

El conjunto de los aprendizajes que hemos realizado hasta ahora eran supervisados porque le indicábamos a la máquina el valor que había que predecir para cada caso de aprendizaje: «Esta es la observación para aprender y esperamos que predigas si es una mina o una roca».

Ahora vamos a descubrir cómo es posible dejar que la máquina se desenvuelva completamente sola para aprender a clasificar una observación dada a partir de una lista de observaciones de la que no conoce el grupo al que pertenece. «Aquí tienes una lista de observaciones: ¿puedes deducir grupos de clasificación? Si la respuesta es sí, aquí tienes una observación: ¿a qué grupo pertenece?» 

Para ilustrar el aprendizaje supervisado mediante un ejemplo concreto, vamos a pedirle a nuestra máquina que aprenda a determinar, a partir de un conjunto de datos que contiene el peso y el diámetro de una fruta, si se trata de un albaricoque o de una cereza.

Requisitos necesarios para abordar este capítulo correctamente: haber leído los capítulos Los fundamentos del lenguaje Python, Estadísticas para comprender los datos y Principales algoritmos de Machine Learning.

Adquisición de datos de aprendizaje

Como sucede en todos los aprendizajes, tenemos que disponer de datos. La máquina tendrá que ser capaz de distinguir entre una cereza y un albaricoque a partir del peso y el tamaño de cada fruta. La primera opción que se nos ocurre es ir a una frutería, tomar las medidas necesarias para cada fruta y listarlas en un documento. Este trabajo es bastante repetitivo.

Sin embargo, hay una segunda opción. Como seguro que ya sabe, las características de las frutas están «normalizadas». Hay normas para definir el tamaño y el peso mínimo y máximo de una cereza, y lo mismo para los albaricoques. Por lo tanto, vamos a formar nuestro conjunto de datos a partir de estas normas y generando frutas de manera aleatoria.

Para conseguir estas normas, solo hay que hacer una sencilla búsqueda en Internet. Así hemos podido completar las tablas que aparecen a continuación:

Tras consultar algunas páginas web, hemos creado las siguientes tablas:

Las cerezas:

Diámetro mínimo (mm)

Diámetro máximo (mm)

Peso mínimo (g)

Peso máximo (g)

17

19

1

5

20

21

5

6

22

23

6

7

24

25

7

8,5

26

27

8,5

10

28

29

10

11,5

Los albaricoques:

Diámetro mínimo (mm)

Diámetro máximo (mm)

Peso medio (g)

35

39

27

40

44

41

45

49

54

50

54

74

55

59

100

Un pequeño script de Python para ayudarnos

Vamos a crear un script de Python que nos permitirá generar una cantidad de cerezas y albaricoques en función de sus características propias.

Después de crear un proyecto nuevo e instalar los módulos Pandas, Matplotlib y Scikit-Learn, le invitamos a introducir estas líneas de programa en un archivo de script nuevo al que llamaremos...

Algoritmo de las K-Means (K-Medias)

Hay varios algoritmos propios del aprendizaje no supervisado. Sin embargo, vamos a concentrarnos en K-Mean (K-Medias) que permite hacer clasificaciones en una cantidad de grupos de predicción conocida y en una cantidad pequeña de datos (inferior a 10 000).

El clustering (fragmentación de datos)

La fragmentación de datos, también llamada clustering, es la acción de distribuir el conjunto de las observaciones en grupos pequeños que tienen características comunes.

Esta fragmentación de los datos es el resultado esperado de cada algoritmo de aprendizaje no supervisado. Así, cuando se le proponga al algoritmo una observación nueva para clasificar, él se encargará de colocarla en uno de los grupos que tendrá determinados. Nosotros nos ocuparemos de la definición de la etiqueta del grupo que da sentido a la clasificación (albaricoque, cereza…). La máquina no es capaz de hacerlo porque no es consciente del significado de los datos que utiliza durante su aprendizaje (para ella solo son números).

Visualizar los datos

La función de la máquina es determinar por sí misma si los datos que le damos como parámetros proceden de una cereza o de un albaricoque. De todos modos, para nosotros es interesante controlar su predicción.

Para conseguirlo debemos intentar determinar por nosotros mismos los dos clústeres antes pedirle a la máquina que los encuentre sola, pero ¿cómo conseguirlo fácilmente? Con ayuda de un gráfico. Creamos un archivo de script nuevo al que llamaremos clustering e introducimos las siguientes líneas de programa:

import pandas as pnd  
import matplotlib.pyplot as plt  
  
  
#Carga de los datos  
frutas = pnd.read_csv("datas/frutas.csv",  
names=['DIAMETRO','PESO'], header=None)  
  
#Visualización gráfica de los datos  
frutas.plot.scatter(x="DIAMETRO",y="PESO")  
plt.show() 

La finalidad de este programa es crear una nube de puntos del conjunto de las parejas Diámetro/Peso.

images/Ch09_01.PNG

Visualización de los datos

A partir de este gráfico podemos determinar por nosotros mismos los dos clústeres en potencia correspondientes a las cerezas y a los albaricoques:

images/Ch09_02.PNG

Determinación manual de los clústeres

En efecto, según nuestro conjunto de observación, el diámetro de una cereza...

Dejar a la máquina clasificar sola

Ha llegado el turno de la máquina. ¿Sabrá clasificar las cerezas y los albaricoques correctamente?

Para eso vamos a utilizar el algoritmo K-Mean parametrizándolo de la siguiente manera:

from sklearn.cluster import KMeans  
modelo=KMeans(n_clusters=2) 

Le hemos indicado la cantidad de  clústeres que es preciso determinar, que en nuestro caso son dos (Cereza o Albaricoque).

Una vez hecha la parametrización, pasamos a la fase de aprendizaje:

modelo.fit(frutas) 

A continuación avanzamos hasta la fase de predicciones con una visualización gráfica de estas y los centroides de los dos clústeres:

#Predicciones  
predicciones_kmeans = modelo.predict(frutas)  
  
#Visualización de la clusterización  
plt.scatter(frutas.DIAMETRO, frutas.PESO, c=predicciones_kmeans, 
s=50, cmap='viridis')  
plt.xlabel("DIAMETRO")  
plt.ylabel("PESO")  
  
#Visualización de los centroides  
centers = modelo.cluster_centers_  
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200,  
alpha=0.5)  
plt.show() 
images/Ch09_03.PNG

Resultado de la clasificación

Según este gráfico, comprobamos que la máquina ha conseguido clasificar correctamente nuestras observaciones. Como habíamos...

Hacer clasificaciones

Ahora que nuestro modelo está guardado, podemos utilizarlo para hacer clasificaciones. Para ello, le invitamos a crear un script de Python nuevo (clasificaciones.py).

Sabemos que la máquina ha tenido éxito clasificando nuestras observaciones en dos grupos distintos. Pero no sabemos si nuestras cerezas están en el primer grupo o en el segundo porque nada nos dice que el primer grupo elegido por la máquina es el que está situado en la parte inferior izquierda del gráfico.

Para conocer el grupo correspondiente a nuestras frutas, vamos a elegir valores para cada uno de ellos originados en los datos de aprendizaje y a realizar predicciones.

#Carga del modelo  
from joblib import load  
modelo = load('modelos/kmean.joblib')  
  
  
#CEREZA: 26,98 mm de diámetro,8,75 gramos  
#ALBARICOQUE: 55,7  mm de diámetro, 102,16 gramos  
  
cereza = [[26.98,8.75]]  
numCluster = modelo.predict(cereza)  
print("Número de clúster de las cerezas: "+ str(numCluster))  
  
  
albaricoque = [[55.7,102.16]]  
numCluster = modelo.predict(albaricoque)  
print("Número de clúster de los albaricoques: " + str(numCluster)) 

Lo que nos da como resultado:

Número de clúster de las cerezas: [1]  ...

Errores de clasificaciones

Seguro que algunos y algunas de ustedes se han dado cuenta de que no hemos utilizado las primeras características de los albaricoques en nuestra generación de datos:

Diámetro mínimo (mm)

Diámetro máximo (mm)

Peso medio (g)

35

39

27

Le invitamos a modificar el programa de generación de frutas (generacionFrutas.py) incluyendo ahora la primera característica para el albaricoque:

caracteristicasAlbaricoques =  
[[35,39,27],[40,44,41],[45,49,54],[50,54,74],[55,59,100]] 

No olvide eliminar el archivo frutas.csv presente en el directorio datas.

Una vez realizadas estas operaciones, podemos generar datos nuevos ejecutando el script.

Ahora que disponemos de observaciones nuevas, vamos a verificar que la máquina ha creado dos grupos distintos con éxito y ha clasificado nuestras frutas correctamente. Todo ello con la ayuda de un gráfico.

images/Ch09_04.PNG

Errores de clasificaciones

En la figura anterior podemos comprobar que la máquina ha tenido éxito creando dos grupos distintos, pero ha cometido errores en las clasificaciones. En efecto, podemos notar que algunos albaricoques se han convertido en cerezas. 

Esto es debido al hecho de que las distancias de las observaciones calculadas con el algoritmo K-Mean respecto a los dos centroides han hecho que estos datos estuvieran más próximos del centroide de las cerezas que del de los albaricoques. En este caso...

Algoritmo de mezclas gaussianas o Gaussian Mixture Model (GMM)

En la mayoría de los casos, los datos siguen lo que se denomina una distribución normal o gaussiana, que se puede representar mediante la forma de una campana simétrica respecto al punto medio. En el caso de la clasificación, el conjunto de observaciones puede descomponerse en varias campanas correspondientes a los distintos clústeres que contienen cada una de las observaciones.

images/Ch09_05.PNG

Curvas gaussianas

En la figura anterior hemos representado las distintas curvas gaussianas en 3D de nuestro conjunto de observación. Podemos observar una primera curva que representa nuestras cerezas y una segunda un poco menos marcada para nuestros albaricoques.

El programa de esta representación está disponible para su descarga en el sitio del editor.

El algoritmo GMM (mezcla gaussiana) permite determinar los distintos clústeres separando los datos contenidos en las distintas curvas con forma de campana. Es demasiado complejo para este libro y no vamos a dedicar tiempo a explicar su funcionamiento de manera detallada. Sin embargo, sepa que el algoritmo determina una media y una varianza para cada clúster y después determina una probabilidad de pertenecer o no a ese clúster para cada observación. 

Para utilizar este algoritmo y visualizar la creación de clústeres efectuada (figura siguiente), le invitamos a introducir...

Conclusión

En este capítulo hemos abordado el concepto del aprendizaje no supervisado. Es decir, dejamos que la máquina determine por sí misma los grupos de las clasificaciones (llamados clústeres) a los que pertenecerán las observaciones.

A pesar de esta clasificación «automática», destacamos que, como seres humanos, nuestro papel es importante para verificar y validar la creación de clústeres. 

En el capítulo siguiente vamos a conocer las redes neuronales que nos guiarán poco a poco en el mundo del Deep Learning.