Optimiser des modèles de Machine Learning à l’aide de la théorie de l’évolution

  • Innovation

    28 février 2022

En Machine Learning, de l’optimisation est faite à chaque fois qu’un modèle est entrainé : l’algorithme d’apprentissage optimise les valeurs des paramètres du modèle afin de minimiser l’erreur de prédiction sur le jeu de données d’entraînement. Mais il est possible de pousser l’optimisation d’un modèle de Machine Learning encore plus loin.

Optimisation des hyperparamètres

En effet, il existe un certain nombre de paramètres définissant un modèle, appelés hyperparamètres, qui ne sont pas optimisés lors de l’entrainement. Par exemple : le nombre d’arbres d’un modèle Random Forest, le nombre de couches d’un réseau de neurones ainsi que le nombre de neurones par couche, le paramètre qui règle l’intensité d’une régularisation, etc. Le choix de valeurs pour les hyperparamètres influence la qualité du modèle final, parfois fortement. Par contre, la sélection manuelle des meilleures valeur d’hyperparamètres peut être complexe, même pour les datascientists les plus expérimentés. Heureusement, ce processus peut être automatisé, au moins partiellement.

En effet, une possibilité est d’exploiter des simples algorithmes de recherche, comme Grid Search ou Random Search, afin d’explorer l’espace de recherche et de retenir la meilleur solution explorée. Ces simples algorithmes sont très utiles si le nombre de combinaisons possibles de valeurs d’hyperparamètres est assez limité et l’espace de recherche est simple, mais leur usage devient prohibitif pour des espaces de recherche plus grands et complexes, comme c’est le cas pour les modèles les plus sophistiqués.

Donc, quoi faire dans ces cas ?

Plusieurs pistes sont possibles, mais si vous avez suivi nos publications précédentes, vous aurez probablement une intuition sur la suite.

Application des algorithmes génétiques au tuning d’hyperparamètres

En effet, le problème d’optimisation des hyperparamètres d’un modèle de Machine Learning est, en général, un problème d’optimisation avec variables mixtes discrètes/continues (des hyperparamètres peuvent prendre des valeurs entières, d’autres des réelles, d’autres encore des chaînes de caractères). De plus, il n’est pas possible de calculer facilement les gradients de la performance du modèle (le score d’accuracy ou de précision, par exemple) par rapport aux hyperparamètres. Enfin, comme vu en précédence, l’espace de recherche peut être assez grand et complexe, si le nombre d’hyperparamètres est suffisamment élevé. Donc, sur la base de cette réflexion, il s’agit d’une application idéale pour des algorithmes d’optimisation stochastiques comme les Algorithmes Génétiques, dont nous avons parlé dans notre article précédent. Voyons ensemble comment à l’aide d’un exemple.

Exemple

Nous allons travailler sur une simple tâche de classification de vins (dataset UCI ML Wine recognition datasets). L’objectif est de construire un modèle capable de repartir des vins en trois classes, correspondantes à trois producteurs différents, sur la base de 13 variables (features) numériques qui mesurent des caractéristiques chimiques de chaque vin.

En raison de la simplicité de la tâche e la petite taille du dataset, nous choisissons d’utiliser un modèle de classification du type arbre de décision (DecisionTreeClassifier dans Scikit-Learn). Nous divisons le dataset comme suit : 118 données d’entrainement, 30 de validation pour calculer la métrique de performance du modèle utilisé lors de l’optimisation et 30 instances de test pour vérifier l’augmentation des performances suite au tuning.

Avant toute optimisation, nous entrainons le modèle de référence en utilisant les valeurs par défaut de tous les hyperparamètres. Nous allons utiliser le score d’accuracy pour quantifier ses performances : nous observons les valeurs de 0.83 sur le jeu de validation et de 0.90 sur celui de test.

Pour essayer d’améliorer les performances de notre modèle de classification, nous mettons en place un algorithme génétique à l’aide du package Python DEAP, afin d’optimiser la valeur des hyperparamètres suivants: criterion, splitter, max_depth, min_samples_split, min_samples_leaf, min_weight_fraction_leaf, max_features, max_leaf_nodes, min_impurity_decrease, class_weight.

Nous utilisons une implémentation assez classique de l’algorithme, avec mutation et croisement, que nous laissons évoluer pendant 20 générations, avec des populations de 300 individus (voir notre article précédent pour plus de détails). Au cours de l’optimisation, comme montré dans la figure suivante, en moyenne les individus sont de plus en plus adaptés à leur environnement : le score d’accuracy moyen augmente, ainsi que celui associé au meilleur individu exploré.

Evolution des courbes de convergence du score d’accuracy au cours de l’optimisation.

Graphique : Evolution des courbes de convergence du score d’accuracy au cours de l’optimisation.

Après l’optimisation, nous pouvons vérifier les performances du meilleur individu trouvé par l’algorithme. Son score d’accuracy est de 0.93 sur le jeu de validation : l’AG a donc réussi dans sa tâche ! Pour vérifier que ce résultat soit généralisable aussi sur d’autres données, nous avons calculé l’accuracy du modèle optimisé aussi sur le jeu de test, en obtenant une valeur de 0.96. Donc, nous pouvons conclure que l’optimisation par algorithme génétique des hyperparamètres nous a permis d’améliorer les performances du modèle utilisé dans cet exemple.

Sources iconographiques : Photo by Simon Infanger on Unsplash

algorithmes génétiques hyperparamètres machine learning score d'accuracy