Cours
Apprentissage Artificielle
Année 2011
TP 3 : Utilisation de WEKA
Ce TP est dédié
à l’utilisation de l’environnement open source WEKA
WEKA (Waikato Environment for Knowledge Analysis) propose un ensemble d’outils permettant de
manipuler et d’analyser des bases de données. Il implémente la plupart des algorithmes d’apprentissage
supervisé et non supervisé (arbres de décision, réseaux de neurones, etc.).
Cet environnement open
source est implémenté en java. Il est disponible à l’adresse suivante : http://www.cs.waikato.ac.nz/ml/weka/
WEKA se compose
principalement :
–
de classes Java
permettant de charger et de manipuler les données.
–
de classes pour
les principaux algorithmes de classification supervisée et non supervisée.
–
d’outils de
sélection d’attributs et de statistiques sur ces attributs.
–
de classes
permettant de visualiser les résultats.
Cet environnement peut être
utilisé de 3 manières:
1.
via l’interface
graphique, pour charger un fichier de données, lui appliquer un algorithme,
vérifier son efficacité.
2.
invoquer un
algorithme par ligne de commande.
3.
utiliser les
classes définies dans ses propres programmes pour créer d’autres méthodes,
implémenter d’autres algorithmes, comparer ou combiner plusieurs méthodes.
Dans
le cadre de ce TP, nous étudierons les possibilités 1 et 3.
WEKA
utilise (entre autres) le format de fichier arff pour enregistrer les
données. Un fichier arff est composé d’une
liste d’exemples définis par leurs valeurs d’attributs.
Ouvrez
le fichier iris.arff
(qui se trouve dans le répertoire data
d’installation de WEKA) avec un éditeur de texte (Wordpad par exemple).
Remarque préliminaire : le caractère
« % » marque les lignes de commentaires.
Un
fichier arff
comprend toujours trois types d’informations : un nom pour la base de
données, des attributs et des données.
La
chaîne de caractères @RELATION permet de donner un nom à la base de données.
Par exemple, dans le cas du fichier iris.arff, le nom donné est iris.
@RELATION iris
La
chaîne de caractères @ATTRIBUTE permet de définir un attribut. Un attribut
peut être de 4 types :
–
réel (NUMERIC ou REAL)
–
Nominal ({valeurs-possible}) : par exemple :
@ATTRIBUTE class {Iris-setosa,Iris-versicolor,Iris-virginica} signifie que l’attribut class peut avoir comme valeur soit Iris-setosa, soit Iris-versicolor
ou soit Iris-virginica.
–
Chaîne de caractère (STRING)
–
Date (date
[<date-format>])
A
noter que WEKA propose un éditeur de fichier arff (tools→arffViewer) permettant de visualiser les fichiers arff sous la
forme d’un tableau, et éventuellement de les modifier.
Dans un premier temps, vous allez vous familiariser avec l'utilisation de
WEKA en utilisant l’interface graphique.
·
Lancez WEKA. Dans la fenêtre « Weka GUI chooser » qui s’est ouverte, cliquez
sur le bouton « Explorer ». Une
fenêtre « Weka Explorer » doit s’ouvrir. C’est elle
qui nous servira d’interface principale.
·
Cliquez sur le bouton « Open file… ». Choisissez le fichier de données, ici, iris.arff.
Un certain nombre d’informations vont apparaître dans la fenêtre « Weka Explorer ».
Q1. Combien
y a-t-il d’instances dans cette base de données ?
Q2. Quels
sont les noms des attributs ?
Q3. À
quoi correspond la zone « Selected attribute » à droite juste sous le bouton « Apply » ?
Q4. Vérifiez
ce qui se produit lorsque vous cliquez sur les différents attributs. À quoi correspondent
les valeurs « Name », « Type », « Missing », « Distinct » et « Unique » ?
Q5. A
quoi correspond le graphique en bas à droite ? Que fait le bouton « Vizualize all » ?
La
visualisation de données peut permettre de se faire une idée de l’organisation
de celles-ci.
·
Cliquez sur l’onglet « Visualize ». Vous voyez un tableau de graphiques
étiquetés par les attributs des données. Chaque graphique correspond à un graphique
où chaque point représente une instance colorée en fonction de sa classe. La
position du point est donnée en abscisse par l’attribut situé en haut du
tableau et en ordonnée par l’attribut situé à gauche du tableau.
Q6. Vérifiez
que la diagonale du tableau ne contient des graphiques ou toutes les instances
sont sur la droite x=y.
Q7.
Pour le jeu de données iris.arff,
pouvez vous dire s’il existe un attribut unique avec lequel on va pouvoir bien
classer ? Si oui lequel ?
Q8. Existe-t-il
deux attributs avec lesquels le classement peut être très bon ? Si oui lesquels
?
·
En cliquant sur une croix dans une fenêtre de visualisation, l’ensemble des
instances correspondant à cette croix sont décrits de façon plus précise dans
une autre fenêtre. En particulier cette fenêtre permet d’accéder au numéro des
instances cliquées.
Q9. Qu’elle
est l’utilité du Jitter ?
Q10. Expliquez
comment on peut simuler un graphique tridimensionnel en changeant la coloration
des instances.
Nous
allons maintenant tester une méthode d’apprentissage sur ces données.
·
Choisissez l’onglet « Classify » dans la barre du haut.
·
Choisissez une méthode d’apprentissage
grâce au bouton « Choose
». Par exemple, sélectionner le classifieur « Classifiers→Trees→J48 »
afin de tester la méthode d’induction d’arbres de décision C4.5.
o En haut à gauche,
dans la partie « Test options »,
vous pouvez sélectionner le type de validation souhaité. Par exemple, l’option
« Use training set » permet
de calculer l’erreur empirique du classifieur sur la
base d’apprentissage.
o Cliquez ensuite
sur le bouton « Start »
pour généré le modèle prédictif (ici l’arbre de décision).
o L’arbre construit
(en mode texte + taille de l’arbre et nombre de feuilles) ainsi que les
résultats obtenus (taux d’erreur, matrice de confusion) s’affichent dans la
fenêtre de droite.
o Il est possible de
faire afficher l’arbre obtenu en cliquant avec le bouton droit de la souris sur
la ligne « heure – trees.J48 »
(en bas à droite) puis en choisissant « Visualize tree ». Dans
la fenêtre de visualisation de l’arbre, des options sont disponibles afin de
faciliter cette visualisation (« feet to screen », « auto scale », etc.).
Utilisation du classifieur
« J48 » sur la base « credit-g.arff »
Q11. Quelle est l’erreur obtenue sur la base
d’apprentissage ? Quelle est la taille de l’arbre ?
Q12. Dans les options du classifieur
J48, passez la valeur du paramètre « unprunned » à « true » (on
supprime le post-élagage de l’arbre). Quel est le taux d’erreurs obtenu sur la
base d’apprentissage ? Quelle est la taille de l’arbre ?
Q13. Tester de nouveau ce classifieur
avec et sans élagage, en prenant cette fois comme « Test options », « Percentage split »
à 66% (on apprend sur 66% des exemples et on évalue le résultat sur les
exemples restants). Quels sont les taux d’erreurs obtenus avec et sans
élagage ? Expliquez pourquoi on obtient ces résultats.
Utilisation d’un filtrage des attributs. Ouvrez de
nouveau la base « credit-g.arff »
Q14. Les exemples de cette base sont décrits par combien
d’attributs ?
Q15. Appliquer sur cette base un filtrage des attributs (dans la
partie « filter »
de l’onglet « Preprocess »,
appuyez sur le bouton « choose », puis sélectionnez « filters→supervised→attribute→AttributeSelection »
puis appliquer sur « Apply »). Combien reste-t-il d’attributs ?
Q16. Tester de nouveau le classifieur J48 (avec élagage) en prenant comme
« Test options », « Percentage split » à 66%. Quel est le taux
d’erreurs obtenu ? Quelle est la taille de l’arbre ?
Q17. Comparez ces résultats aux résultats obtenus sans filtrage.
Expliquez.
Utilisation du boosting
·
Ouvrez de nouveau la base credit-g.arff.
·
Testez le classifieur « Classifiers→Trees→Decision Stump » (classifieur
faible basé, pour la classification, sur le calcul de l’entropie), en prenant
comme « Test options »,
« Percentage split » à 66%.
Q18. Quelles est le taux d’erreurs obtenu ?
·
Testez maintenant l’algorithme Adaboost « Classifiers→meta→AdaboostM1 ». Par défaut, cet algorithme de boosting utilise le classifieur Decision Stump comme classifieur de base.
Q19. Quel est le taux d’erreurs obtenu ? Expliquez.
Q20. Refaites le même test (avec et sans boosting)
avec comme classifieur de base l’algorithme des k
plus proches voisins : « Classifieurs→lazy→IB1 »
(k plus proches voisins avec k = 1). Qu’observez-vous ? Expliquez.
·
Ouvrez la base iris.arff.
·
Allez dans l’onglet « cluster »
·
Choisissez comme algorithme de clustering,
l’algorithme « SimpleKMeans ».
Dans les options de l’algorithme, choisissez comme valeur pour le paramètre
« numClusters »
(nombre de cluster) 3.
·
Dans la partie haut gauche « cluster mode », choisissez l’option « Classes to clusters evaluation »
qui permet de tester la qualité des groupes formés par rapport à la classe
donnée par les experts.
·
Appuyez ensuite sur le bouton « start ».
·
Pour visualiser les groupes formés, cliquez avec le
bouton droit de la souris sur la ligne « heure – SimpleKMeans » (en bas
à droite) puis sélectionnez « Visualize clusters assignments ».
Q21. Faîtes le même test avec l’algorithme « EM ». Les
résultats sont-ils meilleurs ? Pourquoi ?
·
Ouvrez la base bank-data.arff.
·
Allez dans l’onglet « Associate ».
·
Appuyer sur Start pour lancer l’algorithme Apriori (algorithme par défaut pour les
règles d’association).
Q22. Quelles sont les trois règles les plus fiables générées par
l’algorithme et quel est le taux de confiance de chacune de ces règles ?
L’objectif de cette partie est de vous familiarisez à l’utilisation de WEKA
en tant que librairie java.
Remarque
préliminaire : Une javadoc est fournie avec WEKA (dans
le dossier « doc »).
·
Commencez par créer un nouveau projet java sous eclipse.
·
Ajoutez dans le « Java Build Path → librairie »
du projet le fichier « weka.jar » (il également est possible d’attacher le code
source à ce jar).
·
Créez un nouveau package
·
Créez une nouvelle classe dans ce package avec une méthode « main » (lors de la création de la
classe cocher la case public « static void main(String[] args) ».
Chargement d’un fichier arff
//Lecture
du fichier d'apprentissage
FileReader reader = new FileReader(fichierEntrainement);
//création des exemples d'apprentissage à partir du
fichier
Instances instances = new Instances(reader);
//Fermeture du flux de lecture
reader.close();
//choix
de la classe à apprendre
instances.setClassIndex(instances.numAttributes() - 1);
Instanciation d’un classifieur
de type C4.5 (appelé ici J48) et apprentissage
//on instancie les paramètre de l'algorithme d'apprentissage
J48 classifieur = new J48();
Evaluation par validation croisée (avec
k = 10)
//Evaluation par
validation croisée
Evaluation eval = new Evaluation(instances);
eval.crossValidateModel(classifieur, instances, 10, new Random());
System.out.println("Taux
d’erreurs par VC :" + eval.errorRate());
Q23. Effectuer le même test avec un réseau de neurone (« MultilayerPerceptron »).
Que remarque-t-on ?
Q24. Dans le cadre de la base credit-g.arff, nous souhaitons
apprendre un modèle de type arbre de décision (avec l’algorithme c4.5) qui privilégie le classement des
exemples en « bad »
plutôt qu’en « good ».
Comment faire ?
Aide : on peut utiliser pour cela le meta classifieur « Classifiers→meta→ CostSensitiveClassifier» qui permet de
donner un poids plus important à certaines classes.