Méthodes stochastiques pour l’apprentissage automatique Projets de TP Gianluca Bontempi - Yann-Ael Le Borgne 1 1.1 Projet 1 : Classificateur naïf bayésien But Comme son nom l’ indique, ce classificateur se base sur le théorème de Bayes, théorème permettant de calculer les probabilités conditionnelles à posteriori : P (cj |a1 , a2 , a3 , ..., an ) = P (a1 , a2 , ..., an |cj )P (cj ) P (a1 , a2 , ..., an ) où cj est une catégorie et ai est un attribut. La simplification apportée (d’où le nom de naïf) est que l’on suppose les ai indépendants conditionnellement aux cj , et donc n Y P (ai |cj ) P (a1 , a2 , ..., an |cj ) = i=1 . Bien qu’étant une forte hypothèse, les classificateurs naïfs bayésiens permettent d’atteindre des performances satisfaisantes comparativement à d’autres modèles, tout en restant simples à implémenter. Le but de ce projet sera d’implémenter un tel classificateur en R, et de tester ses performances sur le jeu de données ’golub’ (fichier golub.Rdata). Ce fichier contient : – Une matrice d’entrées X, de 72 lignes (patients) et 7129 variables (gènes). – Un vecteur de sortie Y de 72 valeurs, associant à chaque patient un type de leucémie (Lymphoblastique ou myeloide aigu) par l’identifiant 0 ou 1. 1.2 Specifications La fonction predict.bayes à programmer prendra en entrée : – Un training set X.tr et Y.tr, contenant les valeurs des inputs et outputs pour les exemples d’apprentissage, – Un test set X.ts contenant les inputs des données à tester, – Un paramètre k, précisant le nombre d’intervalles de discrétisation de l’espace d’entrée, 1 et devra renvoyer un vecteur Y.pred, des prédictions pour les données à prédire à partir de X.ts. Nous fournissons ici l’algorithme de base : Discrétiser l’espace des entrées en un nombre d’intervalles k pour chacune des n variables d’entrée (utiliser la fonction quantile) Créer une matrice proba_mat k*n pour stocker les probabilités P(a_i|c_j) (Comptage à partir du training set X.tr) Pour chacun des exemples dans X.ts | Calculer la probabilité à posteriori à partir de la formule de Bayes | Déterminer la classe correspondante et la stocker dans le vecteur de | sortie Y.pred Fin pour 1.3 Evaluations et questions Utilisez le jeu de données golub. 1. Implémenter la fonction ’predict.bayes’. 2. Implémenter une fonction de cross validation qui permettra de renvoyer l’erreur de cross validation du classificateur bayésien pour un k donné. 3. Déterminez la valeur optimale pour le paramètre k par 10-fold cross validation. NB : La commande ’browser()’ vous permet de mettre des points d’arrêts dans un code pour le débugging. 2 2.1 Projet 2 : Sélection de variables but Reduire le nombre de variables d’entrées dans un problème de prédiction permet souvent de réduire le nombre de paramètres à estimer, et donc d’améliorer les performances du modèle de prédiction par une réduction de la variance dans l’estimation des paramètres du modèles. Aussi, cela facilite l’interprétation des relations entre variables d’entrées et variable de sortie. Le but de ce second projet est d’implémenter en R une méthode de sélection de variables appelée ’forward selection’, puisqu’elle consiste à ajouter une à une les variables d’entrées au modèle, jusqu’à ce que la qualité des performances du modèle de prédiction se détériore. Le principe d’ajout des variables est détaillé dans la section suivante. 2.2 Spécifications La fonction feature.selection à programmer prendra en entrée un ensemble d’observations sous la forme d’une matrice X et d’un vecteur Y, contenant respecti2 vement les valeurs des inputs et outputs pour les exemples d’apprentissage. Elle devra renvoyer : – Un vecteur feature.selected contenant les variables d’entrées (sous forme d’indice se rapportant aux colonnes de la matrice X) pour lesquelles la prédiction de l’algorithme était optimal. – Une valeur err.pred, contenant l’estimation de l’erreur de prédiction du modèle utilisé pour le subset optimal feature.selected déterminé par l’algorithme de sélection de variables. Nous fournissons ici l’algorithme de base : n<-nombre de variables feature.selected<-{} feature.remaining<-{ensemble des variables} Pour i de 1 à n | Pour j dans feature.remaining | | feature.act<-{feature.selected,j} | | Erreur_j<-estimation de l’erreur par 10-fold cross validation | | du modèle pour X,Y réduit aux entrées feature.act | Fin pour | Erreur_i<-Erreur minimale obtenue dans Erreur_j | Rajouter à feature.selected l’indice de la variables dont la contribution | a le plus minimisé l’erreur | Enlever à feature.remaining ce même indice Fin pour Renvoyer la partie de feature.selected pour laquelle l’erreur Erreur_i fut la plus basse, avec cette erreur Le jeu de données à utiliser se trouve dans le fichier ’breastCancer.Rdata’. Ce fichier contient : – Une matrice d’entrées X, de 683 lignes (patientes) et 9 variables (données physiologiques). – Un vecteur de sortie Y de 683 valeurs, indiquant par 0 et 1 le type de tumeur (benigne ou maligne). C’est une version légèrement modifiée qui est plus facile à manipuler que celle de la librarie dont ce jeu de données est issue (mlbench). Référez-vous à l’aide de mlbench (http ://cran.r-project.org, package mlbench), page 3, pour une description du dataset. L’algorithme à utiliser est celui des K-Nearest Neighbors (KNN). Etant donné un exemple (un vecteur x de valeurs pour l’ensemble des variables d’entrées), la procédure de classification d’un K-NN est la suivante : Classer par ordre croissant les différents exemples de la base d’apprentissage en fonction de la distance par rapport à x Selectionner un sous ensemble K des plus proches voisins Retouner la classe majoritaire parmi les output y associées aux K plus proches voisins 3 2.3 Evaluations et questions 1. Testez la procédure avec comme modèles de prédictions les plus proches voisins. 2. Implémenter une fonction de cross validation qui permettra de renvoyer l’erreur de cross validation du classificateur K-NN pour un K donné. 3. Déterminez la valeur optimale pour le paramètre k par 10-fold cross validation. 4. Implémentez la fonction de sélection de variables, et déterminez les paramètre optimaux en terme de nombre de voisins/subset de variables. NB : La commande ’browser()’ vous permet de mettre des points d’arrêts dans un code pour le débugging. 3 Compte rendu et deadline Le compte rendu sera composé du code commenté et des résultats obtenus pour les différentes questions. Il sera à envoyer par mail avant le .... à [email protected]. Bon travail ! 4