Réduction de dimension : éléments de correction

Dans ce TP, nous abordons la réduction de dimension d'un jeu de données, en particulier l'analyse en composantes principales, méthode très connue, très utile et très utilisée. On pourra consulter mes notes de cours de fouille de données pour une présentation de la réduction de dimension (chapitre 11).

À l'issue de ce TP, vous m'envoyez par email un compte-rendu (format pdf) indiquant la réponse aux questions qui sont posées. Vous m'envoyez également un fichier python réalisant toutes les manipulations de ce TP : je dois pouvoir exécuter ce fichier en tapant python3 nom-de-votre-fichier.py et reproduire vos résultats. Cette exécution ne doit pas provoquer d'erreur de python. Remarque : un notebook ne convient pas.

J'indique quelques éléments de correction mais tout a été vu en cours, décrit dans on poly et explique dans le sujet du TP. Donc, voir ses notes, le poly et le sujet.

Introduction

La réduction de dimension a pour objectif de diminuer le nombre d'attributs d'un jeu de données, en se concentrant sur des attributs réellement pertinents. D'un point de vue géométrique, son objectif est de déterminer le sous-espace (la variété) dans lequel les données vivent.

Là encore, à chaque fois que cela est possible, une exploration visuelle des données est essentielle pour anticiper et comprendre.

Analyse en composantes principales

Description de l'objet PCA de scikit_learn

On utilise la méthode PCA () de scikit_learn. Sous sa forme la plus simple, on l'utilise comme suit. On commence par créer un objet PCA :
acp = sklearn.decomposition.PCA ()
que l'on applique ensuite sur un jeu de données centrées réduites contenu dans une matrice X :
acp.fit (X)
Remarque : pour centrer-réduire le jeu de données, on peut/pourrait utiliser un objet scaler() mais cette méthode est buggée : le calcul de l'écart-type est faux car la moyenne est estimée et non pas connue, donc le dénominateur doit être N-1 et non N, où N est le nombre de données. Si N est grand cela ne fait pas de grande différence ; si N est petit, il vaut mieux faire le centrage et la réduction « à la main ». Pour obtenir la valeur correcte de la variance, il faut ajouter l'option ddof = 1 à l'appel de la méthode numpy. var ().
Après l'appel de la méthode fit (), l'objet acp contient différentes informations :

Mise en application

On va mettre en application l'analyse en composantes principales sur un petit jeu de données disponible . Il contient les caractéristiques de 10 élèves : leur taille, leur poids, leur âge et leur moyenne.
À faire :

  1. lire le jeu de données dans un tableau de données.
  2. centrer et réduire les attributs.
  3. Visualiser ce jeu de données : que voyez-vous ?
    on fait les graphiques habituels pour visualiser les attributs et on ne voit pas grand chose.
  4. En réaliser l'ACP.
    faire ce qui a été expliqué ci-dessus.

Pour l'instant, on a fait des calculs qui n'ont pas beaucoup d'intérêt en tant que tel. Nous abordons maintenant la partie vraiment importante : l'interprétation de ces calculs savants.
Commençons par observer et visualiser la proportion de variance expliquée par les composantes principales successives. Faites un graphique comme celui-ci :
Scree-plot élèves

ce graphique est obtenu avec acp.explained_variance_. Aucune difficulté.

Qu'en déduisez-vous ?

On voit que le premier facteur contient beaucoup d'informations (60 %), que les deux facteurs suivants en contiennent à peu près autant (environ 20% chacun) et le dernier peu.

Une autre manière de représenter ces mêmes données consiste à visualiser le cumul de proportion de variance expliquée, comme ci-dessous :
Cumul des proportions de variance expliquée.

ce graphique est obtenu avec acp.explained_variance_ratio_. Aucune difficulté.

On voit bien que le plan principal contient 80% de l'information, donc la projection dans ce plan est informative. Parfois, le plan principal comporte peu d'information (10, 20%). On en verra un exemple dans le travail en autonomie.
On peut ensuite visualiser les données dans les plans principaux. Les coordonnées des données dans l'espace factoriel sont obtenues par acp. transform (X).
À faire : représenter les données dans le plan principal et dans le plan défini par les axes principaux 1 et 3.

comme dit ci-dessus, les coordonnées des points sur les axes principaux 1, 2 et 3 sont disponibles dans les colonnes 0, 1 et 2 de acp. transform (X). Donc, il suffit de faire des graphiques avec les colonnes 0 et 1 d'une part, les colonnes 0 et 2 d'autre part pour obtenir les représentations demandées.


J'obtiens cela :
eleves dans le plan principal 1x2 eleves dans le plan principal 1x3
Pensez-vous que le second graphique (plan principal 1x3) soit pertinent ?

comme vu ci-dessus, l'axe 3 contient un peu moins d'information que l'axe 2. Donc, ce graphique des points dans le plan principal 1x3 n'est pas très informatif : il apporte moins d'information que la projection dans le plan principal des axes 1 et 2.

Comme on l'a vu en cours, le fait de réduire la dimension déforme le nuage de points. Il faut donc calculer cette déformation pour chaque donnée et écarter ou du moins identifier les données dont la projection dans un plan principal n'est pas fidèle à sa position relative dans l'espace des données. Pour cela, on mesure le cosinus au carré de l'angle entre la demi-droite passant par l'origine et cette donnée d'une part et le plan principal que l'on considère d'autre part. Si ce cosinus au carré est inférieur à 0,3, la déformation est importante (angle > 57°).
À faire : sur le graphique précédent, identifier les points dont la projection est déformée et les affichez avec une couleur particulière.

il suffit d'appliquer la formule vue en cours et d'indiquer sur le graphique les points dont le cosinus est inférieur à 0,3 avec une couleur.

J'obtiens cela :
eleves dans le plan principal 1x2 eleves dans le plan principal 1x3

Il faut déterminer le nombre de dimensions dans l'espace factoriel qui sont pertinentes. Pour cela, on utilise la proportion de variance expliquée par chacun des facteurs, autrement dit, les valeurs propres de la décomposition spectrale. Le creux du coude indique ce nombre.
À faire : faire un graphique indiquant la proportion de variance expliquée. Déterminer la dimension de l'espace factoriel.

le graphique a été fait plus haut. Le coude est clairement observé pour 2.

Les axes principaux correspondent à des combinaisons linéaires des attributs originaux. La corrélation entre ces axes et les attributs originaux indique l'information que contient chaque axe principal par rapport aux attributs initiaux. On peut calculer, afficher et analyser ces nombres. On peut aussi réaliser le cercle de corrélation. Le faire.
J'obtiens cela :
cercle de corrélation

encore une fois, c'est l'application directe du cours. On calcule les coordonnées des attributs initiaux du jeu de données avec les formules qui ont été vues.
Pour tracer un cercle de rayon 1, on peut calculer les coordonnées de points de ce cercle tous les degrés (cosinus et sinus des angles variant de 0 à 2π) et afficher ces 360 points.
Petit truc : pour que le cercle ressemble à un cercle et non pas à un ovale, il faut spécifier ax. set_aspect (1) qui fait en sorte que la longueur correspondant à une unité soit la même horizontalement et verticalement.
Sur ce cercle, on voit une forte corrélation positive entre le premier axe factoriel et la moyenne de l'élève (0,83) et une forte corrélation négative avec son poids (-0,79). Le premier axe est également assez fortement corrélé avec l'âge (-0,69) et la taille de l'élève (-0,78), lesquels sont assez corrélés avec le second axe. Avec des coefficients de corrélation aussi élevés entre les 4 attributs décrivant les élèves et le premier axe factoriel, la projection des points dans le plan principal est une représentation assez fidèle de la réparition des points dans l'espace initial à 4 dimensions.
Si on identifie par leur numéro les élèves dans leur projection dans le plan principal comme ci-dessous :

(c'est le même graphique que plus haut, mais ici les élèves sont repérés par leur numéro), on peut combiner cette projection avec le cercle de corrélation pour effectuer les observations suivantes :

Activités en autonomie

Appliquer ce qui vient d'être expliqué aux jeux de données suivants :