Prévision de séries chronologiques par apprentissage automatique

Si ce n’est déjà fait, lisez le Plan de vol du Propulseur Bluwave-ai, Prévision de séries chronologiques par apprentissage automatique, avant de tester la solution type.

Introduction

La solution que propose ce Propulseur permettra à l’utilisateur d’observer et d’étudier comment l’apprentissage automatique résout le problème consistant à développer un modèle qui prévoit des séries chronologiques.

Ce document décrit la Solution type et les technologies sur lesquelles elle repose. Les participants de l’ATIR qui souhaitent apprendre comment appliquer l’apprentissage automatique aux réseaux neuronaux pourront s’en servir pour déterminer comment, quand et pourquoi adopter une telle approche lorsqu’ils élaborent leur solution.

La documentation s’appuie sur les solutions créées par BluWave-ai pour accélérer l’adoption des sources d’énergie propre par l’intelligence artificielle. Nos solutions de contrôle et d’opération, optimisées grâce aux prévisions, accroissent la rentabilité du nombre grandissant de réseaux intelligents et de micro-réseaux d’électricité recourant à des sources d’énergie renouvelable, au stockage d’énergie et à l’alimentation des véhicules électriques.

On trouvera la définition des expressions en italique dans le glossaire, à la fin du document.

Énoncé du problème

La prévision de séries chronologiques a pour objectif principal le développement de modèles qui produiront des valeurs futures plausibles en fonction des observations réalisées dans le passé grâce à la série chronologique qui en résulte et d’autres séries.

Une série chronologique est une suite de données prélevées à intervalles réguliers dans le temps. On y recourt souvent dans de nombreuses applications en statistique, finances, météorologie, sciences naturelles et génie. Prévoir une série chronologique autorise la prise de certaines mesures par anticipation, pour ajuster le comportement d’un système d’après un événement susceptible de se produire dans l’avenir. Les applications possibles ne manquent pas comme l’illustrent les exemples que voici.

  • Optimisation de l’énergie : optimisation des réseaux intelligents par l’intelligence artificielle, surtout en présence de sources d’énergie renouvelable très variables et réparties comme l’énergie éolienne ou solaire.
  • Villes intelligentes : régulation intelligente de la circulation, détection de problèmes de sécurité et envoi de patrouilles, optimisation des transports en temps réel.
  • Sécurité des réseaux et des systèmes : détection et contrôle des intrusions.
  • Gestion des infrastructures : détection des défaillances au moyen de capteurs, calendriers d’entretien préventif, optimisation des amortissements et des réparations.
  • Logistique en temps réel : placement d’articles, location, optimisation du chargement et des expéditions.
  • Médecine : prévision des futurs risques pour la santé ou du rétablissement d’après des données chronologiques sur l’état de santé.

Parmi les techniques de prévision classiques à base de séries chronologiques les plus connues, mentionnons l’usage de variables explicatives linéaires, l’accentuation des problèmes en l’absence d’un volume suffisant de données pour entraîner le modèle et les efforts déployés pour établir les propriétés de distribution des valeurs résiduelles en vue de l’application de tests statistiques. Ces méthodes ont toujours une grande utilité.

L’affinement de la théorie, la plus grande disponibilité des données, un meilleur arsenal de logiciels et l’exploitation de plus gros ordinateurs ont élargi le nombre de problèmes d’inférence pouvant être traités. Il en découle des avantages tangibles.

  • Traitement de données plus volumineuses : il existe des périodes d’observation plus longues et on peut s’en servir avec des séries à chronologie parallèle pour prévoir l’exactitude des séries étudiées.
  • Robuste traitement préalable des données : les techniques de pointe en apprentissage automatique peuvent traiter les données quasi brutes, alors que les modèle d’inférence statistique classiques peuvent réagir à des données historiques erronées, comme les valeurs aberrantes ou absentes. On le doit à l’utilisation d’éléments non linéaires plutôt que linéaires et, depuis peu, il est possible de valider des modèles complets entre eux.
  • Apprentissage séquentiel : les modèles comme les réseaux neuronaux récurrents (RNR) ont suscité énormément d’intérêt pour la prévision des séries chronologiques, car ils ont un comportement dynamique dans le temps.
  • Automatisation : les techniques d’apprentissage automatique peuvent être automatisées très efficacement, ce qui facilite un apprentissage continu et l’auto-amélioration.

Solution type

La Solution type illustre l’application de l’apprentissage automatique à la production et à la validation d’un modèle capable de prévoir des valeurs chronologiques.

Aperçu

La solution présente deux exemples illustrant la formation d’une variable explicative pour les séries chronologiques : le premier prévoit la charge (modèle A) et le second, la vitesse du vent (modèle B). Nous avons recouru aux données historiques et météorologiques pertinentes dans chaque cas. On commence par télécharger les données brutes de la source correspondante. Les données sont ensuite épurées pour en accroître l’utilité. Cela fait, on les affine en supprimant ou modifiant les propriétés existantes, s’il y a lieu, et en leur en conférant de nouvelles, d’après leur nature chronologique ou la connaissance du domaine. À ce point, si les propriétés sont toujours trop nombreuses pour qu’on forme efficacement le modèle, on procède à un choix. Par la suite, les données sont divisées en deux jeux (formation, prévision). Le premier sert à entraîner le modèle (réseau neuronal). Un aspect important de l’entraînement consiste à optimiser les hyper-paramètres du modèle, c’est-à-dire les paramètres de l’architecture et de la formation. Enfin, on recourt au modèle formé pour effectuer des prévisions et en vérifier l’exactitude avec le deuxième jeu de données. Bien construit, le modèle qui s’appuie sur l’apprentissage automatique produira des valeurs futures plausibles pour la série chronologique à laquelle on s’intéresse.

Diagramme

Le diagramme qui suit montre comment la Solution type est structurée.

Description des composants

Voici une description succincte des éléments constituant la solution:

ComposantRésumé
Source des donnéesProvenance des données sur le Web
Données brutesSérie chronologique de données historiques ou météorologiques se rapportant au problème, téléchargée d’une source publique
ÉpurationScript Python employé pour le traitement préalable des données. Parmi les étapes requises, mentionnons l’intégration des jeux de données, la suppression ou l’estimation des données manquantes et la mise à l’échelle des valeurs.
Données épuréesDonnées résultant de l’épuration des données brutes lors de leur traitement préalable
ConstructionScript Python servant à bâtir de nouvelles fonctionnalités, surtout d’après la nature chronologique des données
PropriétésNouvelles données éventuelles reposant sur les données épurées, ajoutées au modèle avec les données et propriétés existantes
SélectionScript Python exécutant les algorithmes qui sélectionnent les propriétés et produisent un sous-ensemble de données aux propriétés établies
Données de formationDonnées et propriétés sélectionnées qui serviront à entraîner le modèle et à optimiser le réseau neuronal
Données prévuesDonnées et propriétés sélectionnées qui serviront à formuler les prévisions
FormationScript Python mettant en place le réseau neuronal qui apprendra à prédire la quantité étudiée en fonction des données saisies. La démonstration utilise les bibliothèques TensorFlow et Keras.
ModèleRéseau neuronal artificiel sous formation surveillée
PrévisionScript Python qui prévoit la quantité à l’étude à partir des données prévues, après entraînement du réseau neuronal
PrévisionsValeurs futures plausibles de la quantité à l’étude

Démonstration de la technologie

Cette partie illustre comment générer un modèle par apprentissage automatique et le valider avec les réseaux de neurones artificiels (RNA). Recourir à l’apprentissage automatique est séduisant, car les modèles de ce genre ne cessent d’apprendre à partir d’un volume important de données séquentielles et présentent une grande robustesse à la saisie.

La démonstration porte sur la formation de deux RNA et sur l’efficacité avec laquelle ils prévoient respectivement la charge électrique et la vitesse du vent.

Déploiement et configuration

Si vous êtes un participant de l’ATIR et avez accès à une unité de traitement graphique (GPU), suivez les instructions ci-dessous pour déployer la Solution type. Pour cela, vous devrez toutefois d’abord avoir ouvert un compte dans le nuage OpenStack de l’ATIR ou avoir formulé une demande en ce sens, et avoir accès à une GPU.

  1. Ouvrez une séance sur la plateforme en nuage OpenStack de l’ATIR.
  2. Allez à Projects > Orchestration > Stacks et cliquez le bouton + Launch Stack.

3. Dans la boîte de dialogue Select Template, sélectionnez URL comme source du modèle et collez l’URL:

https://gpu-boosterpack-heat-templates.s3.ca-central-1.amazonaws.com/bluwave.yaml

dans le champ Template URL, puis cliquez Next.

Dans la boîte de dialogue Launch Stack, configurez l’application de la façon indiquée sur l’illustration ci-dessous, comme suit :

  1. donnez un nom à la pile (Stack Name);
  2. donnez un mot de passe (Password) à l’utilisateur (n’importe quoi sauf des espaces);
  3. inscrivez « v2.medium » pour le type d’instance (Flavor/Instance Type);
  4. inscrivez « Ubuntu 18.04 – 510 » pour l’image (Image).

Ensuite, cliquez Launch.

4. Le déploiement de l’application dure cinq à dix minutes. Les scripts postérieurs au provisionnement s’exécutent automatiquement et configurent la plateforme en fonction de la Solution type. Miniconda sera installé, le dépôt contenant le code de la solution sera cloné et il y a aura création des environnements conda.

5. Le déploiement terminé, vous devrez copier la clé privée pour pouvoir ouvrir une console (SSH) sur la nouvelle instance de la GPU qui vient d’être créée. Pour obtenir la clé privée, cliquez le nom de la pile (Stack Name) et parcourez la liste jusqu’au champ private.key. Copiez-en le contenu, dont vous vous servirez pour votre client SSH.

Configuration et lancement de l’application

1. Après le déploiement de l’application, amorcez une console pour l’instance de la GPU avec SSH en utilisant l’adresse IP externe que vous trouverez à Project > Compute > Instances, tel qu’indiqué ci-dessous.

Ouvrez une séance SSH avec l’adresse IP et l’identifiant « ubuntu », sans mot de passe.

2. Exécutez les commandes qui suivent pour compléter l’initialisation de Miniconda :

/home/tsp/miniconda/bin/conda init
exec bash

 

 

La Solution type comporte deux exemples. Le modèle A produit une variable explicative sur l’énergie dans Keras (avec TensorFlow en arrière-plan); le modèle B produit une variable explicative météorologique avec TensorFlow. Il faut de quinze à vingt minutes pour entraîner chaque modèle et le valider.

Pour déployer le premier modèle, lancez les commandes qui suivent, en attendant que l’exécution soit terminée avant de passer à la commande suivante.cd /home/tsp/time-series-prediction/energy-prediction/
make all

La première commande vous amène au bon répertoire. La deuxième active l’environnement Miniconda de Python approprié. La troisième (make all) exécute les scripts Python qui préparent les données, forment le modèle et formulent les prévisions. (Dans ce cas, le terme « make » se rapporte à l’outil de construction automatique du logiciel.)

Pour déployer le deuxième modèle, exécutez les commandes que voici.

cd /home/tsp/time-series-prediction/weather-prediction
make all

Vous devriez voir ce qui suit s’afficher à l’écran pour le modèle A.

Remarque : les valeurs de la fonction de perte varieront en raison des éléments stochastiques (aléatoires) du modèle

La qualité de l’ajustement de la variable explicative apparaît à la fin. Cette valeur est comparée à la persistance (l’hypothèse naïve), qui attribue simplement la valeur présente à la valeur suivante. Cette comparaison sert habituellement à vérifier la qualité de la série chronologique. La précision du modèle après formation se reflète dans le faible écart-type de la prévision (259,3146), comparativement à celui obtenu pour l’hypothèse de la persistance (700,5231).

On trouvera aussi la représentation visuelle de la qualité de l’ajustement dans /home/tsp/time-series-prediction/energy-prediction/reports/figures. Au début, toutes les prévisions sont tracées.

Pour autoriser un examen plus précis, le modèle trace un sous-ensemble de prévisions.

Comme vous pouvez le constater, le modèle a appris à prévoir la charge avec une grande précision.

Le modèle B devrait afficher ce qui suit sur la console.

Le modèle a appris à prévoir la vitesse du vent de façon assez précise et réussi à vaincre la persistance : l’écart-type de la prévision est de 4, 6354, contre 4,9801 pour l’hypothèse de la persistance.

On obtient les tracés que voici, qu’on retrouvera dans le répertoire  /home/tsp/time-series-prediction/weather-prediction/reports/figures:

Clôture

Quand vous aurez fini d’explorer la Solution type, fermez l’application pour libérer les ressources de la GPU afin que les autres participants de l’ATIR puissent s’en servir.

Allez à Projects > Orchestration > Stacks, sélectionnez la pile correspondante et cliquez Delete Stacks, en haut (voir la figure ci-dessou). De cette façon, vous supprimerez la pile et l’instance de la GPU qui y est associée. Cela devrait vous prendre moins d’une minute.

Considérations d’ordre technique

Déploiement

Pour améliorer la performance de la variable explicative, on pourrait élargir l’espace dans lequel l’ordinateur cherche les hyper-paramètres. Pour cela, il suffit d’enrichir le dictionnaire qui se trouve dans src/models/train_model.py avec d’autres valeurs, comme nous l’illustrons ci-dessous pour le modèle A.

105   all_params = {'num_hidden': [75, 35],
106                 'learn_rate': [0.001],
107                 'lambda': [0, 0.01],
108                 'dropout': [0, 0.2],
109                 'num_epochs': [10000],
110                 'activation': ['relu']}

Évidemment, élargir le champ de recherche se fait au détriment du temps, puisque le nombre de modèles à former et à évaluer augmente de façon exponentielle.

Les scripts Python de la Solution type ne fonctionnent que sur les systèmes Linux.

Solutions de rechange

Une des principales décisions techniques retenues pour la Solution type était d’utiliser un RNA pour l’apprentissage automatique. Pour cela, nous avons créé un perceptron multicouche (MLP) par rétropropagation. L’idée était de chercher la simplicité, car le perceptron est la forme la plus rudimentaire du RNA. Le réseau de neurones récurrents (RNR) demeure cependant une bonne solution de rechange, car son comportement dynamique dans le temps se prête bien aux séries chronologiques. Les réseaux long short-term memory (LSTM) sont de très puissants RNR et on devrait en envisager l’utilisation pour obtenir une meilleure performance avec les problèmes d’une plus grande complexité.

L’usage d’un réseau de neurones artificiels n’est pas obligatoire. Effectuer des prévisions avec des données chronologiques suppose presque toujours un problème de régression dans lequel la prévision a une valeur réelle. D’autres modèles comme ceux recourant à la régression linéaire ou à la régression polynomiale peuvent s’avérer d’une grande efficacité. Vous pourriez donc les envisager si le jeu de données est relativement modeste ou repose lourdement sur la capacité d’interpréter le modèle, car les RNA sont moins efficaces sur ce plan.

Côté logiciels, le développement du modèle repose sur les bibliothèques Python Keras et TensorFlow. La décision a été prise en raison de la popularité de Python et de ces deux bibliothèques, mais aussi parce que la combinaison Python + Keras est idéale pour les débutants. Il existe cependant d’autres bibliothèques d’apprentissage automatique en Python (Theano, PyTorch, scikit-learn). En C++, on trouvera CNTK et Caffe, de Microsoft, ou Torch en langage C. Elles sont toutes généralement plus rapides que les applications Python.

Architecture des données

Ne s’applique pas à ce Propulseur

Sécurité

Ne s’applique pas à ce Propulseur

Réseau

Ne s’applique pas à ce Propulseur

Mise à l’échelle

Une des forces de l’apprentissage profond réside dans les nettes améliorations observées au niveau de la performance dès que le volume de données utilisé pour former le modèle augmente. Outre le réglage des hyper-paramètres, la solution de référence s’adaptera au jeu de données. Bien sûr, la meilleure performance a un coût. Dans le cas présent, le prix à payer ne se résume pas à la collecte d’un plus grand nombre de données, il faudra aussi plus de puissance de calcul et plus de temps.

Pour gérer les contraintes computationnelles, on pourrait songer à utiliser plusieurs GPU. La solution de référence n’en utilise qu’un, mais Keras et TensorFlow peuvent en maîtriser plusieurs. À mesure que le jeu de données grandit, ou que le nombre de nœuds du réseau neuronal se multiplie, augmenter le nombre de GPU raccourcira la durée de la formation parce que les unités de traitement graphique sont d’une grande efficacité avec les multiplications matricielles.

Disponibilité

Ne s’applique pas à ce Propulseur

Interface utilisateur

Ne s’applique pas à ce Propulseur

API

Ne s’applique pas à ce Propulseur

Coût

Rassembler assez de puissance de calcul figure parmi les principaux coûts associés à la formation d’un réseau neuronal. L’entraînement du modèle devient beaucoup plus onéreux à mesure que le volume de données augmente ou que le réseau grandit. Vous devrez aussi déterminer si les calculs se feront en nuage ou sur les lieux.

Le coût des données requises pour former le RNA est un autre aspect à prendre en considération. De nos jours, la puissance des modèles d’apprentissage automatique vient essentiellement des données avec lesquelles on les entraîne, pas de la façon dont on met en place le modèle. Souvent, c’est le prix des données qui empêche le développement de modèles intelligents.

Licence d’exploitation

Les codes BluWave-ai sont couverts par la licence MIT.

Les données du modèle A viennent d’ISO New England et sont disponibles aux conditions décrites sur le site https://www.iso-ne.com. Celles du modèle B viennent du gouvernement du Canada.

Code source

On trouvera le code source de la Solution type dans le dépôt BluWave-ai à l’adresse https://code.cloud.canarie.ca:3000/bluwave-ai/time-series-prediction.

Glossaire

Expressions et abréviations employées dans ce document et le Propulseur

ExpressionDescription
Apprentissage automatiqueCadre servant à produire un modèle sans programmation explicite
Apprentissage profondApprentissage automatique avec des réseaux de neurones artificiels
Apprentissage superviséApprentissage automatique avec données de formation étiquetées
ATIRAccélérateur technologique pour l’innovation et la recherche. Quand la version n’est pas précisée, correspond à la plateforme pilote pour les Propulseurs (nuage hybride combinant nuage public et nuage privé, plutôt que le service privé d’infonuagique habituel de l’ATIR)
ChargeÉlectricité consommée par un composant
Cible, quantité étudiéeQuantité qu’on désire prévoir
GPUUnité de traitement graphique
Hyper-paramètreParamètre établi avant la formation du modèle, plutôt que dérivé durant la formation
LSTMLong Short-Term Memory (type de réseau neuronal)
MLPPerceptron multicouche
Modèle de régressionModèle produisant une valeur numérique
PerceptronRéseau de neurones à une couche
RétropropagationTechnique utilisée pour ajuster les facteurs de pondération d’un réseau neuronal
RNARéseau de neurones artificiels
RNRRéseau de neurones récurrents
Série chronologiqueDonnées séquentielles prélevées à intervalles réguliers dans le temps