Influence du Prétraitement des Données



Au cours de cette démo pratique, vous observerez comment le prétraitement des données peut influencer un algorithme d'apprentissage comme un réseau de neurones.

Installation des fichiers de la démo

Données brutes

Faites un plearn vmat view abalone.amat pour avoir une idée du jeu de données sur lequel vous allez travailler. Il s'agit d'une base de données du répertoire UCI. Le but est de prédire l'âge d'abalones, qui sont des sortes de mollusques, à partir d'autres données comme leur taille, leur poids, etc. Remarquez que la première colonne est une catégorie (M, F, ou I pour Infant): appuyez sur la touche 's' pour visualiser les nombres par lesquels PLearn a automatiquement remplacé les caractères.

Le script abalone_nnet.plearn va vous permettre d'entraîner un réseau de neurones sur l'ensemble d'entraînement (100 exemples) et l'ensemble de test (1044 exemples). Utilisez-le par exemple avec la ligne de commande suivante :
plearn abalone_nnet.plearn nh=10 wd=0 nstages=50 lr=1e-1
Remarquez que l'erreur d'entraînement augmente! Cela est dû généralement à un taux d'apprentissage (paramètre lr) trop haut, alors réduisez-le jusqu'à avoir une courbe plus raisonnable. Essayez également plusieurs valeurs du nombre de neurones cachés (nh) pour voir si vous pouvez faire mieux.

Une fois (plus ou moins) satisfait de la courbe, faites un plearn vmat view results_abalone.amat pour visualiser la MSE sur les ensembles d'entraînement (test1) et de test (test2). Le script d'apprentissage enregistre automatiquement l'erreur correspondant au point de la courbe où l'erreur en test est minimale (il fait donc de la sélection de modèle). En général augmenter le nombre d'époques (nstages) ne devrait donc pas avoir d'effet puisqu'on s'attend à ce que l'erreur en test augmente au bout d'un certain temps (sur-apprentissage), ce qui devrait être le cas sur les courbes affichées. Trouvez-vous quelque chose d'étrange dans les résultats ainsi obtenus ?

Prétraitement des données

La classe PreprocessVMatrix fournie dans la démo est incomplète. Il lui manque une implémentation correcte de la méthode getNewRow, qui permet d'obtenir une rangée de la matrice. Le but de cette matrice est de prétraiter les données, en étant capable de faire sur chaque champ de la matrice source une des trois opérations suivantes :

Complétez l'implémentation de PreprocessVMatrix (vous devrez sans doute lire le reste du code de la classe pour au moins comprendre ce qu'elle fait exactement). Vous pourrez en particulier utiliser les méthodes mean() et stddev() de la classe StatsCollector. Lorsque vous pensez avoir terminé (et que PLearn compile bien), faites:
plearn vmat diff test.vmat solution.amat
Si aucune différence n'est trouvée, votre code semble fonctionner. Sinon, appelez au secours !

Editez abalone.vmat pour effectuer le prétraitement qui vous semble le plus approprié pour chacune des colonnes. Pour l'instant, gardez la colonne target intacte, afin de pouvoir comparer les erreurs aux résultats précédents. Relancez l'apprentissage d'un réseau de neurones avec ce nouveau prétraitement. Comment l'apprentissage est-il modifié ?

Optimisation des hyper-paramètres et early stopping

Le script PLearn fourni dans la démo permet de choisir le modèle obtenant la meilleure erreur sur l'ensemble de test lors des itérations de l'optimisation : c'est ce que l'on appelle faire de l'early stopping. Rappelez-vous que, en pratique, il faut le faire sur un ensemble de validation qui n'est pas l'ensemble de test, sinon on triche ! Les autres hyper-paramètres à spécifier sont : le taux d'apprentissage, le nombre de neurones cachés, et le weight decay (pénalité sur les poids de manière à éviter les poids trop élevés). Essayez plusieurs combinaisons d'hyperparamètres pour obtenir la meilleure erreur de test possible.

Comparez en particulier les courbes d'apprentissage pour deux modèles fonctionnant "bien", l'un avec un weight decay de 0 et l'autre avec une valeur plus grande. Comment expliquez-vous les différences ?

Prétraitement de la colonne target

Effectuez un prétraitement qui vous semble approprié sur la colonne target. Quelles différences cela fait-il ?

(Si vous n'avez rien d'autre à faire) Ajout d'un nouveau type de prétraitement

Rajoutez dans le code de la PreprocessVMatrix un nouveau type de prétraitement appelé center : il s'agit de centrer une colonne, mais sans forcer sa déviation standard à être 1. On pourrait imaginer que l'apprentissage sur les données brutes était très pénalisé par les valeurs 1001, 1002 ou 1003 par lesquelles PLearn avait remplacé les chaînes de caractères dans le premier champ. Vérifiez (ou contredisez) cette hypothèse en appliquant le prétraitement center sur ce champ. Comparez au prétraitement discretize.