Recherche de site Web

Comment préparer des données de séries chronologiques univariées pour les réseaux de mémoire à long terme


Il peut être difficile de préparer des données lorsque vous débutez dans le deep learning.

Les réseaux de neurones récurrents à mémoire à long terme ou LSTM attendent une entrée tridimensionnelle dans la bibliothèque d'apprentissage en profondeur Keras Python.

Si vos données de série chronologique contiennent une longue séquence de milliers d'observations, vous devez diviser votre série chronologique en échantillons, puis la remodeler pour votre modèle LSTM.

Dans ce tutoriel, vous découvrirez exactement comment préparer vos données de séries chronologiques univariées pour un modèle LSTM en Python avec Keras.

Démarrez votre projet avec mon nouveau livre Deep Learning for Time Series Forecasting, comprenant des tutoriels pas à pas et les fichiers code source Python pour tous les exemples.

Commençons.

Comment préparer des données de séries chronologiques

La question la plus courante que l’on me pose est peut-être de savoir comment préparer des données de séries chronologiques pour l’apprentissage supervisé.

J'ai écrit quelques articles sur le sujet, tels que :

  • Comment convertir une série chronologique en problème d'apprentissage supervisé en Python
  • Prévision de séries chronologiques en tant qu'apprentissage supervisé

Mais ces messages n’aident pas tout le monde.

J'ai récemment reçu cet e-mail :

J'ai deux colonnes dans mon fichier de données avec 5 000 lignes, la colonne 1 est l'heure (avec un intervalle d'une heure) et la colonne 2 est en bits/s et j'essaie de prévoir les bits/s. Dans ce cas, pouvez-vous m'aider à définir l'échantillon, le pas de temps et la fonctionnalité [pour les LSTM] ?

Il y a quelques problèmes ici :

  • Les LSTM attendent une entrée 3D, et il peut être difficile de comprendre cela du premier coup.
  • Les LSTM n'aiment pas les séquences de plus de 200 à 400 pas de temps, les données devront donc être divisées en échantillons.

Dans ce didacticiel, nous utiliserons cette question comme base pour montrer une manière de préparer spécifiquement les données pour le réseau LSTM dans Keras.

1. Chargez les données

Je suppose que vous savez comment charger les données en tant que série Pandas ou DataFrame.

Sinon, consultez ces messages :

  • Comment charger et explorer des données de séries chronologiques en Python
  • Comment charger des données d'apprentissage automatique en Python

Ici, nous allons simuler le chargement en définissant un nouvel ensemble de données en mémoire avec 5 000 pas de temps.

from numpy import array

# load...
data = list()
n = 5000
for i in range(n):
	data.append([i+1, (i+1)*10])
data = array(data)
print(data[:5, :])
print(data.shape)

L'exécution de cette pièce imprime à la fois les 5 premières lignes de données et la forme des données chargées.

Nous pouvons voir que nous avons 5 000 lignes et 2 colonnes : un ensemble de données de série chronologique univariée standard.

[[ 1 10]
 [ 2 20]
 [ 3 30]
 [ 4 40]
 [ 5 50]]
(5000, 2)

2. Temps de dépôt

Si vos données de série chronologique sont uniformes dans le temps et qu'il n'y a aucune valeur manquante, nous pouvons supprimer la colonne temporelle.

Sinon, vous souhaiterez peut-être envisager d'imputer les valeurs manquantes, de rééchantillonner les données sur une nouvelle échelle de temps ou de développer un modèle capable de gérer les valeurs manquantes. Voir des articles comme :

  • Comment gérer les pas de temps manquants dans les problèmes de prédiction de séquence avec Python
  • Comment gérer les données manquantes avec Python
  • Comment rééchantillonner et interpoler vos données de séries chronologiques avec Python

Ici, nous supprimons simplement la première colonne :

# drop time
data = data[:, 1]
print(data.shape)

Nous disposons désormais d’un tableau de 5 000 valeurs.

(5000,)

3. Divisé en échantillons

Les LSTM doivent traiter des échantillons où chaque échantillon est une série chronologique unique.

Dans ce cas, 5 000 pas de temps, c’est trop long ; Les LSTM fonctionnent mieux avec des pas de temps de 200 à 400, d'après certains articles que j'ai lus. Par conséquent, nous devons diviser les 5 000 pas de temps en plusieurs sous-séquences plus courtes.

J'écris plus sur le fractionnement de longues séquences ici :

  • Comment gérer des séquences très longues avec des réseaux de neurones récurrents à mémoire longue et à court terme
  • Comment préparer la prédiction de séquence pour la rétropropagation tronquée dans le temps dans Keras

Il existe de nombreuses façons de procéder et vous souhaiterez peut-être en explorer certaines en fonction de votre problème.

Par exemple, vous avez peut-être besoin de séquences qui se chevauchent, peut-être que le fait de ne pas se chevaucher est une bonne chose, mais votre modèle a besoin d'un état dans les sous-séquences, etc.

Ici, nous diviserons les 5 000 pas de temps en 25 sous-séquences de 200 pas de temps chacune. Plutôt que d'utiliser des astuces NumPy ou Python, nous procéderons à l'ancienne afin que vous puissiez voir ce qui se passe.

# split into samples (e.g. 5000/200 = 25)
samples = list()
length = 200
# step over the 5,000 in jumps of 200
for i in range(0,n,length):
	# grab from i to i + 200
	sample = data[i:i+length]
	samples.append(sample)
print(len(samples))

Nous avons maintenant 25 sous-séquences de 200 pas de temps chacune.

25

Si vous préférez le faire en une seule ligne, allez-y. J'aimerais voir ce que vous pouvez proposer.
Publiez votre approche dans les commentaires ci-dessous.

4. Remodeler les sous-séquences

Le LSTM a besoin de données au format [échantillons, pas de temps et caractéristiques].

Ici, nous avons 25 échantillons, 200 pas de temps par échantillon et 1 fonctionnalité.

Tout d’abord, nous devons convertir notre liste de tableaux en un tableau NumPy 2D de 25 x 200.

# convert list of arrays into 2d array
data = array(samples)
print(data.shape)

En exécutant cet article, vous devriez voir :

(25, 200)

Ensuite, nous pouvons utiliser la fonction reshape() pour ajouter une dimension supplémentaire pour notre fonctionnalité unique.

# reshape into [samples, timesteps, features]
# expect [25, 200, 1]
data = data.reshape((len(samples), length, 1))
print(data.shape)

Et c'est tout.

Les données peuvent désormais être utilisées comme entrée (X) dans un modèle LSTM.

(25, 200, 1)

Lectures complémentaires

Cette section fournit plus de ressources sur le sujet si vous souhaitez approfondir.

Articles connexes

  • Comment convertir une série chronologique en problème d'apprentissage supervisé en Python
  • Prévision de séries chronologiques en tant qu'apprentissage supervisé
  • Comment charger et explorer des données de séries chronologiques en Python
  • Comment charger des données d'apprentissage automatique en Python
  • Comment gérer les pas de temps manquants dans les problèmes de prédiction de séquence avec Python
  • Comment gérer les données manquantes avec Python
  • Comment rééchantillonner et interpoler vos données de séries chronologiques avec Python
  • Comment gérer des séquences très longues avec des réseaux de neurones récurrents à mémoire longue et à court terme
  • Comment préparer la prédiction de séquence pour la rétropropagation tronquée dans le temps dans Keras

API

  • API LSTM dans Keras
  • API numpy.reshape

Résumé

Dans ce didacticiel, vous avez découvert comment convertir vos longues données de séries chronologiques univariées en un formulaire que vous pouvez utiliser pour entraîner un modèle LSTM en Python.

Ce message vous a-t-il aidé ? Avez-vous des questions ?
Faites-le-moi savoir dans les commentaires ci-dessous.

Articles connexes