XD blog

blog page

machine learning, python


2014-03-28 Quelques astuces pour faire du machine learning

On a parfois l'impression qu'il suffit de choisir un modèle (réseau de neurones, SVM, random forests, ou autres scikit-learn), de l'entraîner puis de l'appliquer pour obtenir un prédicteur de bonne qualité. Mais ça ne marche pas toujours... Voici quelques raisons qui pourraient l'expliquer.

Le machine learning se résume souvent à un problème d'optimisation. On cherche à trouver la meilleure fonction f qui permettent de prédire Y en fonction de X : Y ~ f(X,w)w est un ensemble de paramètres. f appartient à une classe de modèles. Les réseaux de neurones en sont unes, les SVM une autre. Au sein de cette classe, on peut choisir des modèles avec plus ou moins de paramètres (le nombre de neurones sur la couche cachée pour les réseaux de neurones). Après avoir effectué ces deux choix, on optimise le vecteur de poids w sur une base d'apprentissage :

 w^* = \arg \min_{w} \sum_i e( f(X_i,w), Y_i)

La fonction e est une fonction évalue l'erreur de prédiction. (X_i,Y_i) sont des données d'entraînement pour lesquelles on connaît la meilleure prédiction. (X_{ik}) est une matrice avec K colonnes qui correspondent aux variables de la base d'apprentissage. Dans le cas courant d'une régression :

 W^* = \arg \min_{w} \sum_i (f(X_i,w)- Y_i)^2 = \arg \min{w} \sum_i \left( Y_i - \sum_k w_k X_{ik} \right)^2

Pour tirer meilleur parti du machine learning, il est utile de se poser quelques questions sur la nature du problème et les données dont on dispose.

Types de problèmes

Voici les principaux types :

Classes de modèles

Les modèles en vogue aujourd'hui sont les random forests. Ils s'accomodent des variables discrètes ou continues et des valeurs manquantes. Ce n'est pas le cas des réseaux de neurones et des SVM qui sont un peu passés de mode même si ceux-ci reviennent sur le devant de la scène avec les Deep Neural Network.

Variables continues, discrètes

A chaque classe de modèle correspond un algorithme d'apprentissage. Les réseaux de neurones sont optimisés par des méthodes de gradient. Ce type d'apprentissage fonctionne moins bien sur une variable discrète. C'est d'autant plus vrai si cette variable est une modalité (ou variable catégorielle) : il n'y a pas d'ordre. Dans ce cas, il est possible de créer une variable binaire pour chaque modalité. Si la variable discrète n'a pas d'échelle de valeur (du texte par exemple) et si le nombre de valeurs distinctes n'est pas trop grand (=N), on peut transformer cette variable en N variables booléennes. C'est préférable pour un modèle linéaire par exemple.

Interprétabilité

Parfois, le résultat qu'on souhaite n'est pas une prédiction fiable mais la possibilité de comprendre un peu mieux les données. Les réseaux de neurones qu'on associe à une boîte noire sont à éviter. Les arbres de décisions, la régression linéaires ou logistique sont plus indiqués.

Une classe sur-représentée

Imaginons qu'on cherche à classer des observations en deux classes A et B. Dans les faits, 99% des observations sont de la classe A. Certains modèles prédirons A car cela ne fera que 1% d'erreur. Si l'objectif est discriminer entre A et B, il est préférable de biaiser la base d'apprentissage : on prend toutes les observations de la classe B et autant d'observations de la classe A choisi au hasard. La prédiction sera évaluée avec une matrice de confusion :

prédiction Aprédiction B
classe Abien classémal classé
classe Bmal classébien classé

On peut également être amené à multiplier les exemples sous-représentés en introduisant un peu de bruit. Mais cela nécessite d'introduire quelques hypothèses sur ce bruit. L'autre direction consiste à considérer des modèles discriminants tels que l'analyse linéaire discriminante ou la régression logistique. On n'apprend pas à prédire une classe, on apprend une classe contre l'autre. Lorsqu'on construit les bases d'apprentissage et de tests, certaines classes rares peuvent ne pas être présentes dans l'une des deux bases. Il en est de même de la distribution de certaines features sparses. Constuire deux bases homogènes veut peut-être dire choisir avec un peu plus d'attention les exemples aléatoires dans chaque base de sorte que les distributions des features soient homogènes.

Score de confiance

Certains modèles retournent un score de confiance en plus de la prédiction. Plus le score est haut, plus le résultat a de chance d'être correct ou d'être précis. Mais le modèle prédit rarement avec un haut score de confiance. Choisir un seuil pour ce score revient à choisir entre précision (le fait de prédire correctement) et rappel (le fait de valider la prédiction). On représente ces deux ratios avec la courbe ROC.

Base d'apprentissage et de test

Pour éviter l'overfitting (ou le fait d'apprendre par coeur), on divise aléatoirement l'ensemble d'apprentissage en apprentissage et test. On apprend plusieurs modèles sur la base d'apprentissage mais on choisit le modèle qui fait le moins d'erreurs sur la base de tests.

Normalisation

Lorsqu'on n'utilise un modèle optimisé avec un méthode de descente de gradient, pendant les premières itérations d'apprentissage, le gradient est naturellement plus élevé pour les coefficients qui multiplient ces variables. On normalise pour que les variables soient traitées également. Cette configuration peut également arriver pour une même variable, le maximum peut être dix à cent fois plus élevé que la moyenne. Dans ce cas, il est conseillé d'appliquer une échelle logarithmique.

Données très bruitées

Lorsqu'on veut construire un prédicteur, on construit d'abord une base d'apprentissage de n observations parmi N. n est parfois petit mais construire cette base est souvent coûteuse, c'est pourquoi on commence par petit. Après quelques essais, on s'aperçoit que cela ne marche pas bien. Les données sont bruitées, voire très bruitées. Une solution consiste à utiliser les N observations pour enlever le bruit en diminuant le nombre de variables, en les compressant. On peut utiliser les premiers axes d'une ACP (Analyse en Composante Principale) ou un réseau diabolo : l'entrée et la sortie sont les mêmes (X) mais la couche cachée contient moins de neurones que de variables et c'est celle-ci qu'on utilise.

Boosting

Le boosting est une technique qui permet, au cours de l'apprentissage, de donner plus de poids aux erreurs comme l'algorithme AdaBoost.

Active Learning

L'active learning consiste à augmenter au fur et à mesure la base d'apprentissage à chaque itération du modèle et si possible, en ajoutant des exemples pour lesquels le modèle actuel fait beaucoup d'erreurs.

Queues de distributions étranges

Le notebook Supervised Learning: Regression of Housing Data (à propos de scikit-learn), la dernière barre de l'histogramme est plus élevée que celle qui précède :

Cela est probablement dû à un effet de seuil lors de la construction de la base de données : toutes les données au-dessus d'un certain seuil ont été regroupées dans la même catégorie.


<-- -->

Xavier Dupré