L’objectif de cette activité est de découvrir une application concrète de l’algorithme des k plus proches voisins, en l’appliquant à la reconnaissance des chiffres manuscrits de 0 à 9.
La base de données MNIST (pour Modified National Institute of Standards and Technology) est une collection d’images de chiffres écrits à la main.
Très utilisée en apprentissage automatique, elle contient 60 000 images d'entraînement et 10 000 images de test. Ce sont des images en niveaux de gris (blanc sur fond noir) de 28x28 pixels.
Nous allons créer un programme capable de reconnaître des chiffres dans ce format.
Après avoir testé notre programme sur les images du jeu de données, nous pourrons vérifier s’il peut reconnaître un chiffre manuscrit présent dans une image respectant ce format.
Nous utiliserons l’algorithme de classification kNN (k-nearest neighbors). Ce n’est pas l’algorithme le plus performant, donc les résultats ne seront pas parfaits, mais il est idéal pour une première approche.
La première étape consiste à importer les modules nécessaires au bon fonctionnement de notre algorithme.
Question 1 - Depuis le logiciel Thonny, installer les paquets suivants : scikit-learn
, matplotlib
, numpy
, pandas
et pillow
.
Question 2 - Dans un nouveau fichier Python, importer les modules suivants :
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import numpy as np
import pandas
Voici quelques explications sur ces modules :
sklearn.datasets
: pour charger les données MNIST.train_test_split
: pour séparer les données en deux ensembles (entraînement / test) ;KNeighborsClassifier
: notre algorithme de machine learning.matplotlib.pyplot
: pour afficher les images.numpy
: pour les opérations sur les tableaux de données.Nous utiliserons ici la classe
KNeighborsClassifier
, qui implémente l’algorithme kNN.
Nous allons maintenant charger notre jeu de données d’apprentissage issu de la base MNIST.
Question 3 - Ajoutez le code suivant pour importer le jeu de données :
mnist = fetch_openml('mnist_784', version=1, as_frame=False)
images, labels = mnist.data, mnist.target.astype('int')
Voici quelques explications :
images
contient les données des images.labels
contient les étiquettes (le chiffre entre 0 et 9).Question 4 - Pour tester, afficher le contenu et le label de la première image du jeu de données.
Vous devriez obtenir un tableau de valeurs représentant une image, étiquetée comme étant le chiffre 5
Question 5 - Utiliser le code suivant pour afficher la première image du jeu d'apprentissage.
index_image = 0
plt.imshow(images[index_image].reshape(28, 28), cmap='gray')
plt.title("Chiffre : "+str(labels[index_image]))
plt.axis('off')
plt.show()
Voici quelques explications :
reshape(28, 28)
redonne sa forme d’origine à l’image.imshow(..., cmap='gray')
affiche l’image en noir et blanc.L’image affichée doit représenter le chiffre 5.
Nous allons maintenant créer deux ensembles de données à partir du jeu complet :
Jeu d’entraînement: utilisé par le modèle pour apprendre à reconnaître les chiffres ;
Jeu de test : utilisé pour vérifier si le modèle peut reconnaître des chiffres qu’il n’a jamais vus.
Question 6 - Ajouter le code suivant pour créer ces ensembles. On réduit également la taille des données pour accélérer les traitements :
#Réduction
images_small, _, labels_small, _ = train_test_split(images, labels, train_size=5000, stratify=labels, random_state=42)
#Division
images_entrainement, images_test, labels_entrainement, labels_test = train_test_split(images_small, labels_small, test_size=0.2, random_state=42)
Nous allons maintenant créer un objet de la classe KNeighborsClassifier
pour appliquer l’algorithme.
Question 7 - Ajouter le code suivant.
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
Pour tester notre algorithme, nous allons utiliser une image prise dans le jeu de test.
Question 8 - Ajouter le code suivant pour choisir aléatoirement une image et l’afficher :
i = np.random.randint(0, len(images_test))
plt.imshow(images_test[i].reshape(28, 28), cmap='gray')
plt.axis('off')
plt.show()
Enfin, appliquons notre algorithme kNN à cette nouvelle image pour en prédire le chiffre.
Question 9 - Ajouter le code suivant.
print("Prédiction grâce à l'algo kNN:", knn.predict([images_test[i]])[0])
Vous pouvez essayer de dessiner vous-même un chiffre à l’aide d’un logiciel de dessin, puis tester si l’algorithme kNN est capable de le reconnaître.