Les algorithmes d'apprentissage automatique (ou machine learning) utilisent les statistiques pour trouver des schémas dans de vastes quantités de données. Ce processus alimente de nombreux services que nous utilisons aujourd'hui : systèmes de recommandation, moteurs de recherche, fils d'actualité des réseaux sociaux, assistants vocaux. La liste est longue.
Supposons que nous disposions d'un ensemble de données à partir duquel nous souhaitons obtenir un modèle prédictif. L'approche traditionnelle d'apprentissage automatique exige la séquence d'actions suivante :
L'automatisation de ce processus est l'objectif de l'Apprentissage Automatique Automatisé (AutoML).
L'essence d'AutoML est d'automatiser les tâches mentionnées ci-dessus (qui peuvent prendre un temps considérable) afin que les data scientists puissent consacrer plus de temps aux problèmes métier en pratique. AutoML permet également à tout le monde, et non plus à un petit groupe d'experts, d'utiliser la technologie d'apprentissage automatique.
Ces dernières années, d'excellents cadres AutoML ont émergé. Voici une brève description des plus populaires :
Les entreprises peuvent automatiser leurs processus d'apprentissage automatique à diverses fins. Le plus souvent, elles cherchent à obtenir des informations automatisées pour prendre de meilleures décisions basées sur les données et faire de meilleures prédictions.
Un exemple réel d'utilisation d'AutoML est la détection de fraude par PayPal. La détection de fraude est le processus d'identification et de prévention des activités financières non autorisées (transactions par carte de crédit frauduleuses, usurpation d'identité, piratage informatique, escroqueries à l'assurance, etc.). PayPal a utilisé AutoML pour améliorer la précision de sa solution ML existante à 95 % et a réduit le temps d'entraînement du modèle à moins de 2 heures.
Au fond, tout service AutoML efficace doit résoudre les problèmes fondamentaux suivants, en tenant compte d'un budget temps et mémoire : décider quel algorithme d'apprentissage automatique utiliser sur un ensemble de données donné, s'il faut et comment prétraiter ses caractéristiques, et comment définir tous les hyperparamètres. C'est le problème qu'Auto-sklearn tente de résoudre.
Auto-sklearn est un paquet logiciel open source d'apprentissage automatique automatisé, construit sur scikit-learn. Auto-sklearn définit AutoML comme un problème de recherche du meilleur modèle d'apprentissage automatique et de ses hyperparamètres pour un ensemble de données, au sein d'un vaste espace de recherche, comprenant de nombreux classifieurs et un grand nombre d'hyperparamètres.
En général, Auto-sklearn comporte trois composants principaux :
Auto-sklearn applique le méta-apprentissage pour sélectionner des instanciations de notre cadre d'apprentissage automatique susceptibles de bien fonctionner sur un nouvel ensemble de données. Plus précisément, Auto-sklearn a été entraîné sur un grand nombre d'ensembles de données afin de déterminer quels modèles fonctionnent le mieux sur quels types de données.
Lorsqu'un nouvel ensemble de données est présenté à Auto-sklearn, il calcule un certain nombre de méta-caractéristiques (statistiques générales sur les données). Ces méta-caractéristiques sont utilisées pour faire correspondre nos nouvelles données à l'un des nombreux ensembles de données mentionnés précédemment qui lui ressemblent le plus. De cette façon, nous connaissons déjà certains modèles et cadres ML susceptibles de bien fonctionner sur nos nouvelles données. Cela sert de « démarrage à chaud » (warm start) pour le processus d'optimisation.
L'optimisation bayésienne est une stratégie puissante pour trouver les extrema de fonctions objectives coûteuses à évaluer. Elle est particulièrement utile lorsque l'on n'a pas accès aux dérivées, ou lorsque le problème en question est non-convexe.
Définition du problème
Considérons c(x) comme la fonction de coût associée au bloc du cadre ML, x étant les différentes configurations qu'il peut avoir. C'est ce que l'on appelle la fonction objective. c(x) est une fonction « boîte noire » (black-box function) dont nous voulons trouver le minimum global, c'est-à-dire trouver la configuration d'hyperparamètres la plus performante pour le cadre ML. Supposons que c(x) ait la « vraie » forme suivante.
Approximation par fonction de substitution (Surrogate function)
L'optimisation bayésienne aborde cette tâche par une méthode connue sous le nom d'optimisation de substitution. Une fonction de substitution (ou surrogate function) est une approximation de la fonction objective. Elle est formée à partir de points échantillonnés. Les échantillons équivalent aux différentes configurations x du cadre ML, et à leurs scores de fonction objective correspondants, c(x). Notez que la fonction de substitution sera exprimée mathématiquement d'une manière significativement moins coûteuse à évaluer que la vraie fonction objective.
Sur la base de la fonction de substitution, nous pouvons identifier les points qui sont des minimums prometteurs. Nous décidons d'échantillonner davantage à partir de ces régions prometteuses et de mettre à jour la fonction de substitution en conséquence. À chaque itération, nous continuons d'examiner la fonction de substitution actuelle, d'en apprendre davantage sur les zones d'intérêt par échantillonnage, et de mettre à jour la fonction.
Après un certain nombre d'itérations, nous devrions trouver un minimum global. Notez que cette méthode ne fait aucune hypothèse sur la fonction objective (sauf qu'elle peut être optimisée) et ne nécessite aucune dérivée. Mais qu'est-ce qui la rend bayésienne, exactement ?
Lien avec les statistiques bayésiennes
L'essence des statistiques bayésiennes et de la modélisation est de prendre en compte une croyance a priori (précédente) à la lumière de nouvelles informations pour produire une croyance a posteriori (« après ») mise à jour. Cette affirmation est représentée mathématiquement par le célèbre théorème de Bayes.
P(A∣B)=P(B)P(B∣A)P(A)
où A et B sont des événements, et P(A∣B) est une probabilité conditionnelle : la probabilité que l'événement A se produise étant donné que B est vrai. C'est aussi appelé la probabilité a posteriori de A étant donné B. P(B∣A) est également une probabilité conditionnelle : la probabilité que l'événement B se produise étant donné que A est vrai. P(A) et P(B) sont les probabilités d'observer A et B respectivement sans aucune condition donnée ; elles sont connues sous le nom de probabilité a priori.
C'est exactement ce que fait l'optimisation de substitution dans ce cas, elle peut donc être mieux représentée par les systèmes, les formules et les idées bayésiennes. Cependant, pour appliquer le théorème de Bayes, nous devons représenter la fonction de substitution comme une distribution de probabilité. Ceci est fait à l'aide d'un Processus Gaussien.
Processus Gaussien
Un Processus Gaussien est une distribution de probabilité sur des fonctions possibles. On peut l'imaginer comme un lancer de dés qui renvoie des fonctions ajustées à des points de données donnés au lieu des chiffres de 1 à 6. Le processus renvoie plusieurs fonctions, auxquelles sont attachées des probabilités. Cela crée une distribution de probabilité pour notre fonction de substitution.
Par exemple, nous pouvons définir l'ensemble actuel de points de données comme étant représentable à 40 % par une fonction a(x), à 10 % par une fonction b(x), etc. En représentant la fonction de substitution comme une distribution de probabilité, elle peut être mise à jour avec de nouvelles informations. Si de nouvelles informations sont introduites, les données ne sont peut-être plus représentables qu'à 20 % par la fonction a(x). Ces changements sont régis par les formules bayésiennes (vues ci-dessus).
Ce qui suit est un exemple visuel d'inférence bayésienne avec des Processus Gaussiens pour mieux la comprendre. Disons que nous avons une fonction inconnue que nous essayons d'estimer. Notre croyance a priori sur la fonction inconnue est visualisée ci-dessous. À droite se trouvent la moyenne et l'écart-type de notre Processus Gaussien – ils sont de 0 puisque nous n'avons encore aucune connaissance. À gauche, chaque ligne est un échantillon de la distribution des fonctions et notre manque de connaissances se reflète dans la large gamme de fonctions possibles et les formes de fonctions diverses affichées.
Après avoir observé certaines preuves, nous pouvons utiliser la règle de Bayes pour mettre à jour notre croyance sur la fonction afin d'obtenir le Processus Gaussien a posteriori, c'est-à-dire notre croyance mise à jour sur la fonction que nous essayons d'ajuster.
Le Processus Gaussien mis à jour est contraint aux fonctions possibles qui correspondent à nos données, ce qui se traduit par une distribution de fonctions plus étroite.
Une fois que des échantillons supplémentaires et leur évaluation via la fonction objective c(x) ont été collectés, ils sont ajoutés aux données et la probabilité a posteriori est ensuite mise à jour. Ce processus est répété jusqu'à ce que l'extremum global de la fonction objective soit localisé, qu'un résultat suffisamment bon soit trouvé, ou que les ressources soient épuisées.
Résumé
L'optimisation bayésienne est principalement utilisée pour optimiser des fonctions « boîte noire » coûteuses. Elle peut être effectuée comme suit :
Les méthodes d'ensemble (ensemble methods) sont une technique d'apprentissage automatique qui combine plusieurs modèles de base afin de produire un modèle prédictif optimal unique. Il est bien connu que les ensembles surpassent souvent les modèles individuels, et que des ensembles efficaces peuvent être créés à partir d'une bibliothèque de modèles. Ils sont particulièrement performants si les modèles sur lesquels ils sont basés sont individuellement solides et commettent des erreurs non corrélées. Étant donné que cela est beaucoup plus probable lorsque les modèles individuels sont de nature différente, la construction d'ensembles est particulièrement bien adaptée pour combiner des instanciations solides d'un cadre ML flexible.
L'ensemble de données présenté dans cet article est l'ensemble de données sur l'électricité. Ces données ont été collectées sur le Marché de l'électricité de Nouvelle-Galles du Sud en Australie, où les prix de l'électricité sont fixés toutes les cinq minutes en fonction de l'offre et de la demande.
L'ensemble de données contient 45 312 instances datées du 7 mai 1996 au 5 décembre 1998. Chaque exemple de l'ensemble de données se réfère à une période de 30 minutes. À partir de ces données historiques, nous devons prédire si les prix de l'électricité vont monter ou descendre. Il s'agit d'un problème de classification binaire, et nos étiquettes de classe sont UP (Hausse) et DOWN (Baisse).
Nous voulons construire le meilleur ensemble possible à l'aide d'Auto-sklearn dans un délai donné. La meilleure façon d'y parvenir est d'entraîner plusieurs modèles en parallèle et d'augmenter nos chances de construire un ensemble solide. Une solution à cela est d'utiliser le service HPC Qarnot, qui est bien adapté pour paralléliser le calcul d'Auto-sklearn sur plusieurs nœuds dans un cluster.
La première étape consiste à créer un compte Qarnot. Nous offrons 15 € de calcul sur votre abonnement, ce qui couvre largement le coût d'exécution de cet exemple.
Ensuite, nous devons créer localement un dossier input à l'intérieur duquel nous plaçons les fichiers nécessaires au calcul :
electricity-normalized.csv
: l'ensemble de données sur l'électricité.Ce qui suit est le script d'exécution Qarnot et le fichier de configuration situés au même niveau que le dossier input :
cluster_run.py
: script Python pour exécuter auto-sklearn sur un cluster Qarnot de plusieurs nœuds.Il ne reste plus qu'à suivre ces étapes pour configurer un environnement virtuel Python et installer le SDK Python de Qarnot.
Une fois que l'environnement est prêt avec tous les fichiers nécessaires, vous pouvez exécuter python3 cluster_run.py
depuis votre terminal pour lancer le calcul sur Qarnot.
Dans l'exemple suivant, nous allons exécuter Auto-sklearn sur un cluster de 3 nœuds (1 maître et 2 travailleurs) pour un temps d'entraînement total de 15 minutes et une limite de temps de 5 minutes par modèle entraîné. 80% des données seront utilisées pour l'entraînement et la validation, tandis que 20% seront conservées comme ensemble de test. Ces paramètres et d'autres peuvent être définis dans cluster_run.py
.
Assurez-vous de copier votre jeton d'authentification correspondant à votre compte Qarnot dans le script (à la place de <<<MY_SECRET_TOKEN>>>
) pour pouvoir lancer la tâche sur Qarnot.
## cluster_run.py
<details><summary>Click to see the code</summary>
<p>
```
#!/usr/bin/env python
# Import the Qarnot SDK
import qarnot
# Connect to the Qarnot platform
conn=qarnot.connection.Connection(client_token='<<<MY_SECRET_TOKEN>>>')
# Create a task
task = conn.create_task('cluster_run', 'auto-sklearn-cluster', 3)
# Create a resource bucket and add input files
input_bucket = conn.create_bucket('auto-sklearn-input')
input_bucket.sync_directory('input/')
# Attach the bucket to the task
task.resources.append(input_bucket)
# Create a result bucket and attach it to the task
output_bucket = conn.create_bucket('auto-sklearn-output')
task.results = output_bucket
task.constants['TARGET_COL'] = 'class' # Target column for classification
task.constants['TOTAL_TIME_LIMIT'] = '15' # Total training time limit in minutes
task.constants['PER_RUN_TIME_LIMIT'] = '5' # Per iteration training time limit in minutes
task.constants['N_CV_FOLDS'] = '3' # Number of cross validation folds
# Keep only the contents of ./outputs/ in the output bucket
task.results_whitelist='outputs'
# Submit the task to the Api, that will launch it on the cluster
task.run(output_dir=".")
```
</p>
</details>
Vous pouvez ensuite visualiser les détails de la tâche sur notre plateforme en cliquant sur votre tâche. Une fois l'exécution de la tâche terminée, plusieurs fichiers de sortie seront automatiquement téléchargés sur votre ordinateur.
Après 15 minutes d'entraînement sur 3 nœuds, l'ensemble final atteint une précision de test de 94,49% (plus d'informations sont disponibles dans le fichier log_autosklearn.log
). Ce sont de très bons résultats compte tenu du temps d'exécution court et de la relative facilité d'utilisation.
Pour illustrer les avantages de la parallélisation sur plusieurs nœuds et cœurs, nous proposons le benchmark suivant réalisé sur la plateforme Qarnot. Nous avons exécuté Auto-sklearn pendant 25 minutes sur les mêmes données en utilisant différentes configurations :
Notez que sur un cluster multi-nœuds, un nœud est le maître (master) qui gère la planification des tâches et l'optimisation bayésienne, et le reste des nœuds sont les travailleurs (workers) qui entraînent réellement les modèles d'apprentissage automatique.
Nous avons choisi de baser notre benchmark sur trois métriques :
Nous pouvons voir que le nombre de tentatives et d'exécutions réussies augmente à un rythme constant. Ainsi, plus nous avons de cœurs, plus nous pouvons entraîner de modèles potentiels. En théorie, l'augmentation du nombre de tentatives et d'exécutions réussies pourrait conduire à l'amélioration des performances sur n'importe quel problème. La précision du test s'améliore également à mesure que nous augmentons le nombre de nœuds dans le cluster. Cependant, son taux de croissance ralentit à la fin. Cela signifie que nous approchons de la meilleure performance possible pour ce problème spécifique avec Auto-sklearn.
Dans cet article, nous avons présenté le concept d'AutoML ainsi que plusieurs des cadres les plus utilisés, en particulier Auto-sklearn. Nous avons brièvement examiné son fonctionnement et la manière d'effectuer une prédiction précise sur les prix de l'électricité en utilisant un cluster multi-nœuds sur Qarnot.
Pour aller plus loin dans le domaine d'AutoML, on pourrait s'intéresser aux systèmes AutoML pour l'automatisation de l'apprentissage profond (deep learning) comme AutoKeras ou H2O. De telles technologies sont très prometteuses, car la tâche de réglage fin (fine-tuning) d'un réseau neuronal (nombre de couches, profondeur des couches, optimiseurs, etc.) n'est pas aisée et pourrait grandement bénéficier de la philosophie AutoML.
Nous espérons que ce tutoriel vous a plu ! Si vous avez des questions ou si vous souhaitez utiliser notre plateforme pour des calculs plus lourds (nous pouvons fournir des ressources de pointe sur demande), n'hésitez pas à nous contacter.