Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
Black Friday: -25€ dès 75€ sur les livres en ligne, vidéos... avec le code BWEEK25. J'en profite !
  1. Livres et vidéos
  2. Intelligence artificielle vulgarisée
  3. Abricots, cerises et clustering
Extrait - Intelligence artificielle vulgarisée Le Machine Learning et le Deep Learning par la pratique
Extraits du livre
Intelligence artificielle vulgarisée Le Machine Learning et le Deep Learning par la pratique
2 avis
Revenir à la page d'achat du livre

Abricots, cerises et clustering

Une machine qui apprend seule

L’ensemble des apprentissages que nous avons réalisés jusqu’à présent sont dits supervisés, car nous avons indiqué à la machine la valeur à prédire pour chaque cas d’apprentissage : "Voici l’observation à apprendre et nous nous attendons à ce que tu nous prédises si c’est une mine ou un rocher".

Nous allons à présent découvrir comment il est possible de laisser la machine se débrouiller toute seule pour apprendre à classifier une observation donnée à partir d’une liste d’observations dont elle ne connaît pas le groupe d’appartenance. "Voici une liste d’observations : peux-tu en déduire des groupes de classification ? Si oui, voici une observation : à quel groupe appartient-elle ?"

Pour illustrer l’apprentissage supervisé à travers un exemple concret, nous allons demander à notre machine d’apprendre à déterminer si, pour un ensemble de données comportant le poids et le diamètre d’un fruit, celui-ci est un abricot ou une cerise.

Prérequis nécessaires pour bien aborder ce chapitre : avoir lu les chapitres Les fondamentaux du langage Python, Des statistiques pour comprendre les données et Principaux algorithmes...

Acquisition de données d’apprentissage

Comme pour tout apprentissage, nous devons disposer de données. La machine devra être capable de faire la distinction entre une cerise et un abricot à partir du poids et de la taille de chaque fruit. La première option qui s’offre à nous est de nous rendre chez un marchand de fruits, de prendre les mesures nécessaires pour chaque fruit et de les répertorier dans un document. Ce travail est assez fastidieux.

Il existe cependant une seconde option. Comme vous le savez sans doute, les caractéristiques des fruits sont "normalisées". Ainsi des normes existent pour définir la taille et le poids minimaux et maximaux d’une cerise, idem pour les abricots. C’est donc à partir de ces normes que nous allons constituer notre jeu de données en générant aléatoirement des fruits.

Pour récupérer ces normes, une simple recherche sur Internet suffit, ce qui nous a permis de constituer les tableaux suivants :

(source : http://www.crenoexpert.fr/flipbooks/expproduit/TABLEAUX-CALIBRES-FRUITS-2.pdf).

Les cerises :

Diamètre minimal (mm)

Diamètre maximal (mm)

Poids minimal (g)

Poids maximal (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

Les abricots :

Diamètre minimal (mm)

Diamètre maximal (mm)

Poids moyen (g)

35

39

27

40

44

41

45

49

54

50

54

74

55

59

100

Un petit script Python pour nous aider

Nous allons créer un script Python qui va nous permettre de générer un nombre de cerises et d’abricots en fonction des caractéristiques qui leur sont propres.

Après avoir créé un nouveau projet et installé les modules Pandas, Matplotlib et Scikit-learn, nous vous invitons à...

Algorithme des K-Means (K-Moyennes)

Il existe plusieurs algorithmes propres à l’apprentissage non supervisé. Nous allons cependant nous attarder sur celui appelé K-Mean (K-Moyennes) permettant de réaliser des classifications sur un nombre de groupes de prédiction connu et sur un petit nombre de données (inférieur à 10 000).

Le clustering (partitionnement de données)

Le partitionnement de données ou encore appelé clustering est l’action de découper l’ensemble des observations en petits groupes ayant des caractéristiques communes.

Ce partitionnement des données est le résultat attendu de chaque algorithme d’apprentissage non supervisé. Ainsi, lorsqu’une nouvelle observation à classifier sera proposée à l’algorithme, charge à lui de la positionner dans l’un des groupes qu’il aura déterminés. La définition du libellé du groupe donnant du sens à la classification (abricot, cerise…) est quant à elle notre charge, car bien entendu la machine est incapable de le faire étant donné qu’elle n’a pas conscience de la signification des données qu’elle utilise lors de son apprentissage (pour elle, ce ne sont que des chiffres).

Visualiser les données

La machine ayant pour fonction de déterminer par elle-même si les données que nous lui donnerons en paramètre sont issues d’une cerise ou d’un abricot, il est tout de même intéressant pour nous de contrôler sa prédiction.

Pour cela, nous devons essayer de déterminer par nous-mêmes les deux clusters avant de demander à la machine de les trouver seule, mais comment y parvenir facilement ? Eh bien à l’aide d’un graphique. Créons un nouveau fichier de script que nous appelons clustering et saisissons les lignes de code suivantes :

import pandas as pnd 
import matplotlib.pyplot as plt 
 
 
#Chargement des données 
fruits = pnd.read_csv("datas/fruits.csv", 
names=['DIAMETRE','POIDS'], header=None) 
 
#Visualisation graphique des données 
fruits.plot.scatter(x="DIAMETRE",y="POIDS") 
plt.show() 

Ce code a pour but de créer un nuage de points de l’ensemble des couples Diamètre/Poids.

images/10FL01.png

Visualisation des données

À partir de ce graphique, nous sommes en mesure de déterminer par nous même les deux clusters correspondant potentiellement aux cerises et aux abricots :

images/10FL02.png

Détermination manuelle des clusters

En effet, le diamètre d’une cerise est compris entre...

Laisser la machine classifier seule

Place maintenant à la machine. Saura-t-elle classer correctement les cerises et les abricots ?

Pour cela, nous allons utiliser l’algorithme K-Mean en le paramétrant comme suit :

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

Nous lui avons indiqué le nombre de clusters à déterminer, c’est-à-dire deux dans notre cas (Cerise ou Abricot).

Une fois ce paramétrage réalisé, passons à la phase d’apprentissage :

modele.fit(fruits) 

Puis à la phase de prédictions avec un affichage graphique de celles-ci et les centroïdes des deux clusters :

#Predictions 
predictions_kmeans = modele.predict(fruits) 
 
#Affichage de la clusterisation 
plt.scatter(fruits.DIAMETRE, fruits.POIDS, c=predictions_kmeans, 
s=50, cmap='viridis') 
plt.xlabel("DIAMETRE") 
plt.ylabel("POIDS") 
 
#Affichage des centroïdes 
centers = modele.cluster_centers_ 
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, 
alpha=0.5) 
plt.show() 
images/10FL03.png

Résultat de la classification

D’après ce graphique, on constate que la machine a réussi à classer correctement nos observations. En bas du graphique se trouvent comme nous l’avions prévu les cerises et dans la partie de droite les abricots....

Réaliser des classifications

À présent que notre modèle est sauvegardé, nous pouvons l’utiliser pour réaliser des classifications. Pour cela, nous vous invitons à créer un nouveau script Python (classifications.py).

Nous savons que la machine a réussi à classer nos observations en deux groupes distincts, cependant nous ne savons pas si nos cerises sont dans le premier ou dans le second groupe, car rien ne nous dit que le premier groupe choisi par la machine est celui situé en bas à gauche du graphique.

Pour connaître le groupe correspondant à nos fruits, nous allons choisir des valeurs pour chacun d’entre eux issues des données d’apprentissage et réaliser les prédictions.

#Chargement du modèle 
from joblib import load 
modele = load('modeles/kmean.joblib') 
 
 
#CERISE: 26.98 mm de diamètre ,8.75 grammes 
#ABRICOT: 55.7  mm de diamètre , 102.16 grammes 
 
cerise = [[26.98,8.75]] 
numCluster = modele.predict(cerise) 
print("Numéro de cluster des cerises: "+ str(numCluster)) 
 
 
abricot = [[55.7,102.16]] 
numCluster = modele.predict(abricot) 
print("Numéro de cluster des abricots: " + str(numCluster)) 

Ce qui nous donne comme résultat :

Numéro de cluster des cerises : [1] 
Numéro...

Des erreurs de classifications

Certains et certaines d’entre vous ont sans doute remarqué que nous n’avons pas utilisé les premières caractéristiques des abricots dans notre génération de données :

Diamètre minimal (mm)

Diamètre maximal (mm)

Poids moyen (g)

35

39

27

Nous vous invitons à modifier le script de génération de fruits (generationFruits.py) en incluant à présent la première caractéristique pour l’abricot :

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

Sans oublier de supprimer le fichier fruits.csv présent dans le répertoire  datas

Une fois ces opérations réalisées, nous pouvons générer de nouvelles données en exécutant le script.

Maintenant que nous disposons de nouvelles observations, nous allons vérifier que la machine a bien réussi à créer deux groupes distincts et à classer correctement nos fruits, tout ceci à l’aide d’un graphique.

images/10FL04.png

Erreurs de classifications

Sur la figure précédente, on constate que la machine a bien réussi à créer deux groupes distincts, mais qu’elle a commis des erreurs de classifications. En effet, on peut s’apercevoir que des abricots sont devenus des cerises !

Cela est dû...

Algorithme de mélanges gaussiens ou Gaussian Mixture Model (GMM)

Dans la plupart des cas, les données suivent ce que l’on appelle une distribution normale ou gaussienne, pouvant se représenter sous forme d’une cloche symétrique en son milieu. Dans le cas de classification, le jeu d’observation peut se décomposer en plusieurs cloches correspondant aux différents clusters contenant chacune des observations.

images/10FL05.png

Courbes gaussiennes

Nous avons représenté dans la figure ci-dessous les différentes courbes gaussiennes en 3D de notre jeu d’observation. On constate une première courbe représentant nos cerises et une seconde un peu moins marquée pour nos abricots.

Le code de cette représentation est disponible en téléchargement depuis la page Informations générales.

L’algorithme GMM (Mélange gaussien) permet de déterminer les différents clusters en séparant les données contenues dans les différentes courbes en forme cloche. Trop complexe pour cet ouvrage, nous ne nous attarderons pas sur son fonctionnement détaillé. Sachez néanmoins que pour chaque cluster, l’algorithme détermine une moyenne et une variance, puis pour chaque observation il détermine une probabilité d’appartenir ou non à ce cluster.

Pour utiliser cet algorithme et visualiser...

Pour conclure

Dans ce chapitre, nous avons abordé la notion d’apprentissage non supervisé. C’est-à-dire que nous laissons la machine déterminer elle-même des groupes de classifications (appelés Clusters) auxquels appartiendront les observations.

Cependant, malgré cette classification "automatique", nous remarquons qu’en tant qu’être humain notre rôle est important afin de vérifier et valider la clusterisation !

Dans le chapitre suivant, nous allons faire la connaissance des réseaux de neurones qui nous amèneront petit à petit dans le monde du Deep Learning !