Data Mining
TP k-plus proches voisins
Wilson Toussile
25/11/2021
1 Données et problème
1.1 Données
Nous considérons le problème de classification supervisée sur les données digits du module datasets de la
librairie scikit-learn. Ces données ont été obtenues en numérisant l’écriture manuscrite des chiffres de 0 à
9, à la résolution 8 × 8. Cela signifie que chaque image est décrite par 8 × 8 = 64 variables, chaque variable
correspondant au niveau d’activation d’un pixel représenté par un nombre compris entre 0 et 255. On a par
ailleurs le nombre représenté sur chaque image, que nous considérons comme variable à expliquer. La variable
à expliquer est qualitative et ses modélités sont 0, 1, · · · , 9.
import numpy as np
import pandas as pd
from sklearn import datasets
import matplotlib.pyplot as plt
digits0 = datasets.load_digits()
digits = pd.DataFrame(digits0.data)
digits["y"] = digits0.target
digits.head()
## 0 1 2 3 4 5 6 ... 58 59 60 61 62 63 y
## 0 0.0 0.0 5.0 13.0 9.0 1.0 0.0 ... 6.0 13.0 10.0 0.0 0.0 0.0 0
## 1 0.0 0.0 0.0 12.0 13.0 5.0 0.0 ... 0.0 11.0 16.0 10.0 0.0 0.0 1
## 2 0.0 0.0 0.0 4.0 15.0 12.0 0.0 ... 0.0 3.0 11.0 16.0 9.0 0.0 2
## 3 0.0 0.0 7.0 15.0 13.0 1.0 0.0 ... 7.0 13.0 13.0 9.0 0.0 0.0 3
## 4 0.0 0.0 0.0 1.0 11.0 0.0 0.0 ... 0.0 2.0 16.0 4.0 0.0 0.0 4
##
## [5 rows x 65 columns]
Voici quelques images sélectionnées aléatoirement, avec les chiffres qu’ils représentent:
# Dimensions du jeu de données
n, p = tuple(digits.shape)
# Indices sous forme de matrice 5*5
indices = np.random.choice(range(n), size=25, replace=False).reshape((5, 5))
# Figure
plt.figure(figsize = (10, 20))
fig, axs = plt.subplots(nrows=5, ncols=5, sharex='col', sharey='row')
for i in range(5):
for j in range(5):
1
axs[i, j].imshow(digits0.images[indices[i, j]])
axs[i, j].set_title(digits0.target[indices[i, j]])
plt.show()
2 4 1 4 5
0
5
9 1 9 1 2
0
5
4 2 4 5 9
0
5
0 0 6 8 7
0
5
8 9 3 3 9
0
5
0 5 0 5 0 5 0 5 0 5
1.2 Problème
Le but de ce TP est d’entraîner un classifieur sur ces données, de sorte à reconnaître un chiffre manuscrit
pour lequel on a une image en résolution 8 × 8.
2 Description des données
Pour nous conforter à l’idée que les données des images permettent d’automatiser la reconnaissance des
chiffres correspondant, il convient de faire une représentation graphique des données avec différentes couleurs
pour différents chiffres.
Question: Comment représenter 64 dimensions en dimension 2 de sorte à ressortir la discrimination des
classes?
Réponse: L’analyse factorielle discriminante (AFD) permet de le faire: Réduire la dimension de représentation
des données tout en conservant au mieux la discrimination des classes.
Sous Python, l’AFD est mise en œuvre dans la classe LinearDiscriminantAnalysis.
Travail à faire
En vous inspirant de ce qui est fait ici https://scikit-learn.org/stable/modules/lda_qda.html, réaliser une
AFD sur les données digits, puis comment les résultats
2
3 Classifieur des k plus proches voisins
Un des enjeux du classifieur des k plus proches voisins est la sélection de l’hyper-paramètre k. Rappelons-nous
que la complexité de l’algorithme k-pp décroît lorsque k croît.
Le classifieur k-pp est implémenté dans la classe KNeighborsClassifier du module neighbors de la librairie
scikit-learn. La classe GridSearchCV du module model_selection de la même librairie permet de
sélectionner l’hyper-paramètre optimal par validation croisée.
Travail à faire
1. Scinder aléatoirement le jeu de données en échantillon d’entraînement/échantillon test, de sorte de 70%
des données soient consacrées à l’entraînement. Pour cela, utiliser la fonction train_test_split du
module model_selection de scikit-learn.
k de voisins. Utiliser la classe
2. Utiliser l’échantillon d’entraînement pour sélectionner le nombre optimal b
GridSearchCV du module model_selection. Cette classe est basée sur la validation croisée par cv-fold.
Choisir cv = 5.
3. Utiliser l’échantillon test pour évaluer le classifieur sélectionné à la question précédente. Des mesures
de performances sont implémentées dans le module metrics de la librairie scikit-learn.
4. (Bonus)
1. Proposez votre propre implémentation de la classe GridSearchCV vous nommerez MyKnnGridSearchCV,
spécifique pour la sélection du nombre de voisins.
2. Sans refaire le découpage échantollon apprentissage/échantillon test, appliquez votre classe aux
données précédentes et comparez vos résultats aux précédents.