Introduction à PLearn



Au cours de cette démo pratique, vous allez utiliser PLearn, une librairie d'apprentissage statistique développée à l'Université de Montréal et écrite en C++.

Installation de PLearn

Installation des fichiers de la démo

Fichiers de données PLearn

Ouvrez avec un éditeur de texte le fichier train.amat. Remarquez l'en-tête:
#sizes: 2 1 0
#: x y class

Il s'agit des mêmes données que dans la démo 1, mais l'en-tête est un peu plus évolué que celui utilisé par nos classes Java.

La première ligne indique que les dimensions des partie input, target et weight sont respectivement 2, 1 et 0. La partie input correspond ici à deux coordonnées puisque les points sont en 2D. La partie target correspond à la classe à laquelle le point appartient (un entier entre 0 et n_classes -1, où n_classes est le nombre de classes présentes). Il n'y a pas de partie weight (car sa taille est 0) : cette partie peut être utilisée par certains algorithmes de PLearn pour affecter un poids différent à chaque exemple, mais on ne l'utilisera pas ici.

La seconde ligne de l'en-tête est facultative et indique des noms (labels) pour chaque columne de la matrice de données. Les deux premières sont donc les coordonnées (x,y) des points, et la troisième la classe.

Si votre compilation de PLearn n'est pas encore terminée, copiez l'exécutable par cp ~dift3390/PLearn/commands/plearn $PLEARNDIR/commands

Faites alors plearn vmat view train.amat pour visualiser les données en mode texte. La touche 'h' affiche l'aide et 'q' permet de quitter. Vous pouvez aussi visualiser de la même manière les données de test dans test.amat.

Vous pouvez aussi visualiser graphiquement les données en utilisant le script pyplot : faites pyplot plot_2d train.amat (cela nécessite également un PLearn correctement compilé).

Classifieur de Bayes

Vous allez utiliser PLearn pour construire un classifieur de Bayes basé sur une densité Gaussienne pour chaque classe. Ouvrez avec un éditeur de texte le fichier bayes.plearn. Il s'agit d'un script PLearn qui décrit un objet de la classe ClassifierFromDensity, qui est un classifieur de Bayes générique : il faut lui fournir un estimateur de densité pour chaque classe (ou ici, un seul estimateur, qui va être dupliqué autant de fois qu'il y a de classes).

L'estimateur de densité utilisé ici est un objet de type GaussMix, qui est une mixture de Gaussiennes. Comme chaque classe ne va être représentée ici que par une seule gaussienne, le nombre de gaussiennes (l'option L de l'objet GaussMix) est fixé à 1 (il n'y donc pas vraiment de mixture). L'option type est fixée à spherical pour indiquer qu'on cherche une Gaussienne sphérique, i.e. dont la matrice de covariance est diagonale.

Contrairement à ce que vous avez sans doute implémenté en Java, l'objet ClassifierFromDensity n'est pas capable de trouver par lui-même le nombre de classes : vous devez donc le préciser par l'option nclasses. Ici, aucune valeur n'est fixée dans le script, on utilise la valeur ${nc} qui indique la variable nommée nc, qui va devoir être précisée sur la ligne de commande (voir ci-dessous).

Pour entraîner votre classifieur sur l'ensemble d'entraînement, lancez la commande suivante :
plearn learner train bayes.plearn::nc=6 train.amat bayes_trained.psave

Vous allez maintenant tester votre classifieur sur l'ensemble de test, par la commande :
plearn learner test bayes_trained.psave test.amat costs.psave out.pmat costs.pmat

Ignorez pour l'instant les fichiers costs.psave et out.pmat, et faites un plearn vmat view costs.pmat ce qui vous permet de visualiser les coûts pour chaque exemple de test. Le coût qui nous intéresse se trouve dans la première colonne : il s'agit de l'erreur de classification (1 = erreur, 0 = pas d'erreur). Si vous comptez les erreurs à la main, vous devriez en trouver 8. Pour calculer l'erreur moyenne, quittez le mode visualisation et tapez:
plearn vmat stats costs.pmat
La colonne mean du champ 0 (correspondant à la première colonne) indique presque 22% d'erreurs.

Pour visualiser la surface de décision, faites:
pyplot 2d_classif train.amat bayes.plearn::nc=6
Le script pyplot va lui-même faire l'entraînement et calculer la surface de décision, puis l'afficher.

Nous avons utilisé des Gaussiennes sphériques, qui ne sont pas ici bien adaptées pour capturer la forme de toutes les classes (en particulier celle en bas à gauche). Editez le fichier bayes.plearn et remplacez-y type = "spherical" par type = "${type}" pour indiquer que le type doit être donné sur la ligne de commande. Lancez les deux commandes suivantes (attendez l'affichage du résultat de la première avant de lancez la seconde) et comparez (la première commande est la même que précédemment, et la seconde utilise le type general, qui utilise la matrice de covariance empirique pleine et pas seulement sa diagonale) :
pyplot 2d_classif train.amat bayes.plearn::nc=6::type=spherical &
pyplot 2d_classif train.amat bayes.plearn::nc=6::type=general &

Relancez la procédure d'entraînement et de test avec le type general, et comparez l'erreur de test. Vous devrez effacer le répertoire costs.pmat.metadata avant de lancer plearn vmat stats, car sinon il ré-utilisera les statistiques calculées précédemment.

Affichage d'une densité

Pour bien voir la différence entre le modèle sphérique et le modèle général, vous allez maintenant afficher la densité pour la classe en bas à gauche pour les deux modèles.

Regardez le fichier class_4.vmat. Il s'agit d'un fichier script typique de PLearn décrivant un jeu de données : la classe FilteredVMatrix permet de sélectionner un sous-ensemble de la matrice source (ici train.amat, chargée par une classe générique appelée AutoVMatrix). Le critère de sélection est donné dans un langage propre à PLearn, le VPL (VMat Processing Language). Ici, le code "@class 4 ==" retourne le booléen 1 (vrai) si le champ class de l'exemple est 4, et retourne 0 (faux) sinon. Cela permet de ne garder que les exemples de la classe 4. Faites plearn vmat view class_4.vmat pour le vérifier.

Regardez le fichier gauss.plearn : il s'agit d'un script décrivant une simple Gaussienne, comme utilisée précédemment dans le ClassifierFromDensity.

Tapez maintenant la commande suivante pour entraîner une Gaussienne sur la classe 4 :
pyplot 2d_density class_4.vmat gauss.plearn::type=spherical
et comparez avec la matrice de covariance pleine :
pyplot 2d_density class_4.vmat gauss.plearn::type=general

Finalement, modifiez le script gauss.plearn pour accepter plus d'une Gaussienne (L sera donc une variable donnée en paramètre). Affichez la densité avec plusieurs Gaussiennes sur tout l'ensemble d'entraînement (train.amat), en comparant les modèles sphérique et général. Notez que l'apprentissage de la mixture se fait de manière non supervisée, i.e. l'algorithme n'a pas accès aux classes : il est donc normal qu'il ne parvienne pas nécessairement à placer une Gaussienne sur chaque classe.