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é).
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.
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.