Etude de cas¶

Données¶

pendigits de l'UCI Machine Learning Repository

  • Tracé des chiffres de 0 à 9 par plusieurs personnes
  • Pour chaque tracé, coordonnées $(X, Y)$ de 8 points et le chiffre tracé

Objectifs¶

  • Rechercher les différentes façons d'écrire chaque chiffre

Méthodes¶

  • Importation et quelques manipulations
  • Application de 2 méthodes (ACP et classification)

Présentation des données¶

In [32]:
print("Dimensions des données : ", pen.shape)
pen.head(10)
Dimensions des données :  (10992, 17)
Out[32]:
x1 y1 x2 y2 x3 y3 x4 y4 x5 y5 x6 y6 x7 y7 x8 y8 chiffre
0 88 92 2 99 16 66 94 37 70 0 0 24 42 65 100 100 8
1 80 100 18 98 60 66 100 29 42 0 0 23 42 61 56 98 8
2 0 94 9 57 20 19 7 0 20 36 70 68 100 100 18 92 8
3 95 82 71 100 27 77 77 73 100 80 93 42 56 13 0 0 9
4 68 100 6 88 47 75 87 82 85 56 100 29 75 6 0 0 9
5 70 100 100 97 70 81 45 65 30 49 20 33 0 16 0 0 1
6 40 100 0 81 15 58 100 57 47 87 50 88 40 42 36 0 4
7 3 71 0 95 45 100 100 99 79 78 48 53 31 24 54 0 7
8 79 87 98 81 71 100 72 73 100 66 91 21 48 0 0 13 9
9 92 95 30 100 34 68 87 89 84 78 100 35 64 0 0 19 9

Représentation du premier tracé de chaque chiffre¶

  • Représenter chaque premier exemple de chaque chiffre
In [4]:
sub_first_xyc = [[s.loc[0, xN], s.loc[0, yN], s.loc[0, "chiffre"]] for s in sub]
fig = plt.figure(figsize = (15, 5))
for i in range(10):
    ax = fig.add_subplot(2, 5, i + 1)
    dessin(ax, sub_first_xyc[i][0], sub_first_xyc[i][1], sub_first_xyc[i][2])

Représentation des chiffres moyens¶

  • Les chiffres 0, 1, 2, 3, 4, 6 semblent cohérents ;
  • Le chiffre 8 paraît concentré sur la zone centrale ;
  • Le chiffre 7, bien que presque reconnaissable, semble étonnant ;
  • Les chiffres 5 et 9 sont difficilement reconnaissables.
In [5]:
fig = plt.figure(figsize = (15, 5))
for i in range(10):
    ax = fig.add_subplot(2, 5, i + 1)
    dessin(ax, cmoy.loc[i,xN], cmoy.loc[i,yN], str(i), pos = True)

Représentation des tracés en 2D | sur données originales¶

In [6]:
seaborn.lmplot(data = pen_original_df, x = "Dim1", y = "Dim2", hue = "Chiffre",
              fit_reg = False, height = 7, aspect = 1.5)
plt.show()

Représentation des tracés en 2D | sur données originales¶

  • 2, 3, 4 et 6 : regroupés sur une zone restreinte ;
  • 1, 5 (particulièrement), 7, 8 et 9 : avec groupes séparés ;
  • 0 : forme allongée courbe.
In [7]:
g = seaborn.lmplot(data = pen_original_df, x = "Dim1", y = "Dim2", hue = "Chiffre", 
               col = "Chiffre", col_wrap = 5, fit_reg = False)
g.set_titles(col_template = "chiffre : {col_name}", fontweight = "bold", size = 24)
plt.show()

Représentation des tracés en 2D | sur données standardisées¶

  • Forme sphérique due aux valeurs entre 0 et 100 d'une part, et à la standardisation d'autre part
In [8]:
seaborn.lmplot(data = pen_scale_df, x = "Dim1", y = "Dim2", hue = "Chiffre",
              fit_reg = False, height = 7, aspect = 1)
plt.show()

Représentation des tracés en 2D | sur données standardisées¶

  • 2, 3, 4 et 6 : aussi regroupés sur une zone restreinte ;
  • 1, 5 (particulièrement), 7, 8 et 9 : encore des groupes séparés ;
  • 0 : toujours une forme allongée courbe.
In [9]:
g = seaborn.lmplot(data = pen_scale_df, x = "Dim1", y = "Dim2", hue = "Chiffre", 
               col = "Chiffre", col_wrap = 5, fit_reg = False)
g.set_titles(col_template = "chiffre : {col_name}", fontweight = "bold", size = 24)
plt.show()

Recherche des différentes manières d'écrire chaque chiffre¶

Définition de 2 fonctions¶

recherche(chiffre)¶

  • Recherche du nombre de classes
  • Représentation du dendrogramme de la CAH et l'évolution de l'inertie intra-classe avec $k$-means

application(chiffre, nb_classes)¶

  • Application du nombre de classes
  • Lancement de $k$-means
  • Représentation double
    • Sur le plan factoriel
    • Tracé moyen de chaque classe

Chiffre 0¶

  • Choix de $k=4$ classes
In [12]:
recherche(0)
  • Représentations identique, différence entre les 4 types de tracés venant du démarrage
In [13]:
application(0, 4)

Chiffre 1¶

  • On peut hésiter entre 2 et 4 classes
In [14]:
recherche(1)

Avec 4 classes, on est plus fin sur les distinctions entre les types de tracé :

  • deux classes ont un tracé similaire
  • une classe concerne les tracés avec une barre en bas ;
  • une concerne elle les tracés en un seul trait vertical.
In [15]:
application(1, 4)

Chiffre 2¶

  • Il ne semble pas vraiment y avoir plus d'une classe
In [16]:
recherche(2)
  • En testant 2, 3 ou 4 classes (qui peuvent se justifier via la CAH), on remarque que les tracés moyens des classes sont tous identiques.
In [17]:
application(2, 1)

Chiffre 3¶

  • Il ne semble pas vraiment y avoir plus d'une classe
In [18]:
recherche(3)
  • En testant 2 classes (qui peut se justifier via la CAH), on remarque que les tracés moyens des 2 classes sont identiques.
In [19]:
application(3, 1)

Chiffre 4¶

  • Ici, seule une partition en 3 classes semble avoir du sens
In [20]:
recherche(4)
  • Les tracés sont assez similaires et divergent entre eux principalement sur la deuxième partie du dessin.
In [21]:
application(4, 3)

Chiffre 5¶

  • Il semble assez clair qu'il y a 2 classes très différentes
In [22]:
recherche(5)
  • Une classe concerne les tracés en un seul mouvement, l'autre concernant les tracés en 2 mouvements (avec soulèvement du stylo donc).
In [23]:
application(5, 2)

Chiffre 6¶

  • Il ne semble pas vraiment y avoir plus d'une classe, même si la recherche tend à choisir 2 classes
In [24]:
recherche(6)
  • Les 2 classes ont des tracés moyens quasiment identiques.
In [25]:
application(6, 2)

Chiffre 7¶

  • On peut hésiter entre 2 et 3 classes
In [26]:
recherche(7)
  • La différence est flagrante entre les deux :
    • une classe majoritaire contient les tracés avec une barre au milieu ;
    • une classe minoritaire contient les tracés sans barre au milieu.
In [27]:
application(7, 2)

Chiffre 8¶

  • On pourrait être tenter de choisir 2 ou 3 classes
In [28]:
recherche(8)
  • La partition en 8 classes, bien que sûrement trop fine, dégagent tout de même des profils différents de tracés :
    • en partant du haut (assez classiquement), avec des points de départs différents ;
    • en partant du bas (une classe) ;
    • en réalisant 2 ronds (une classe) ;
    • en tournant dans l'autre sens pour une classe.
In [29]:
application(8, 8)

Chiffre 9¶

  • Le choix de 4 classes semble pertinent
In [30]:
recherche(9)
  • Les tracés sont ainsi assez différents :
    • une classe avec des tracés partant du bas ;
    • une classe avec un rond assez prononcé au début, puis la descente ;
    • deux classes assez proches dans la réalisation au début, et qui divergent sur la fin du dessin.
In [31]:
application(9, 4)

Conclusion¶

  • Pour certains chiffres : plusieurs façons de réaliser leur tracé
    • parfois de façon très nette
  • Pour d'autres : un seul tracé
    • avec quelque fois des ajustements

Mais que faire de ces informations?¶

Processus de Machine Learning usuel

  • Importation et nettoyage des données (étape prenant beaucoup de temps)
  • Découverte des données $\rightarrow$ Apprentissage non-supervisé
    • Statistiques descriptives
    • Analyse exploratoire (type ACP, AFC, ACM...)
    • Recherche de structures en classes (avec $k$-means, CAH...)
  • Définition d'une variable cible (très souvent évidente)
    • Caractéristique des individus qu'on veut expliquer par d'autres caractéristiques
    • Souvent binaire (Oui/Non)
  • Recherche d'un modèle $\rightarrow$ Apprentissage supervisé
    • Régression logistique, arbres de décision, réseaux de neurones...
  • Si partition obtenue, création d'une nouvelle variable cible
    • Oui$_k$ et Non$_k$, pour $k=1,\ldots,K$
    • Ex : 3 classes $\rightarrow$ Oui$_1$, Oui$_2$, Oui$_3$, Non$_1$, Non$_2$, Non$_3$
    • Partitionnement permettant éventuellement d'améliorer la qualité de la prédiction
  • Autre possibilité : faire un modèle par classe
In [ ]: