0% ont trouvé ce document utile (0 vote)
30 vues3 pages

Data Mining: 1 Données Et Problème

Transféré par

melileffy
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
30 vues3 pages

Data Mining: 1 Données Et Problème

Transféré par

melileffy
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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.

Vous aimerez peut-être aussi