Prévision de séries temporelles avec Vertex AI et BigQuery ML

1. Présentation

Dans cet atelier, vous allez apprendre à créer un modèle de prévision de séries temporelles avec TensorFlow, puis à déployer ces modèles avec Vertex AI.

Objectifs de l'atelier

Vous allez apprendre à effectuer les opérations suivantes :

  • Transformer des données pour qu'elles puissent être utilisées dans un modèle de ML
  • Visualiser et explorer les données
  • Utiliser BigQuery ML pour créer un modèle de prévision de séries temporelles
  • Créer un modèle de prévision de séries temporelles avec TensorFlow en utilisant des architectures LSTM et CNN

2. Présentation des prévisions de séries temporelles

L'objectif de cet atelier de programmation est d'appliquer des techniques de prévision de séries temporelles à l'aide de Google Cloud Platform. Il ne s'agit pas d'un cours général sur la prévision de séries temporelles, mais une brève présentation des concepts peut être utile à nos utilisateurs.

Données de séries temporelles

Tout d'abord, qu'est-ce qu'une série temporelle ? Il s'agit d'un ensemble de données dont les données sont enregistrées à intervalles réguliers. Un ensemble de données de séries temporelles contient à la fois le temps et au moins une variable qui en dépend.

85af6a1ff05c69f2.png

Composants

Une série temporelle peut être décomposée en composants:

  • Tendance: hausse ou baisse selon un schéma raisonnablement prévisible.
  • Saisonnier: se répète sur une période spécifique (un jour, une semaine, un mois, une saison, etc.).
  • Aléatoire: fluctuations résiduelles

Il peut y avoir plusieurs niveaux de saisonnalité. Par exemple, un centre d'appel peut observer une tendance du volume d'appels certains jours de la semaine ainsi que certains mois. Le résiduel peut s'expliquer par d'autres variables que le temps.

6e8d45bbbbc388ec.png

Stationarité

Pour optimiser les résultats des prévisions, les données des séries temporelles doivent être immobiles, c'est-à-dire que les propriétés statistiques telles que la moyenne et la variance sont constantes au fil du temps. Des techniques telles que la différenciation et la rétrogradation peuvent être appliquées aux données brutes pour les rendre plus fixes.

Par exemple, le graphique ci-dessous de la concentration en CO2 montre un modèle annuel récurrent avec une tendance à la hausse. ( source).

ab82857e2e7d0b89.png

Une fois la tendance linéaire supprimée, les données sont plus adaptées à la prévision, car elles présentent désormais une moyenne constante.

c936381ab1095528.png

Utiliser des données de séries temporelles pour le machine learning

Pour utiliser des données de séries temporelles dans un problème de machine learning, vous devez les transformer afin que les valeurs précédentes puissent être utilisées pour prédire des valeurs futures. Ce tableau illustre la façon dont les variables différées sont créées pour aider à prédire la cible.

d667a941dbd470f5.png

Maintenant que nous avons vu certains principes de base, il est temps d'explorer les données et les prévisions.

3. Configurer votre environnement de notebook

Maintenant que nous avons découvert brièvement les données, configurons l'environnement de développement du modèle.

Étape 1 : Activez les API

Le connecteur BigQuery utilise l'API BigQuery Storage. Recherchez l'API BigQuery Storage dans la console et activez-la si elle est actuellement désactivée.

9895a2fd3cdf8f8c.png

Étape 2: Créez un notebook Vertex AI Workbench

Accédez à la section Vertex AI Workbench de la console Cloud, puis cliquez sur Nouveau notebook. Sélectionnez ensuite le dernier type de notebook TensorFlow Enterprise 2.x sans GPU:

4e7b73eabf2bc061.png

Utilisez les options par défaut, puis cliquez sur Créer. Une fois l'instance créée, sélectionnez Ouvrir JupyterLab:

18c9f3c462aafaee.png

Créez ensuite un notebook Python 3 à partir de JupyterLab:

58523671a252b95a.png

Étape 3: Téléchargez les supports de l'atelier

Créez une fenêtre de terminal à partir de l'interface JupyterLab: Fichier -> Nouveau -> Terminal.

À partir de là, clonez le contenu source à l'aide de la commande suivante:

git clone https://github.com/GoogleCloudPlatform/training-data-analyst

4. Explorer et visualiser les données

Dans cette section, vous allez effectuer les tâches suivantes :

  • Créer une requête qui regroupe les données dans une série temporelle
  • Remplir les valeurs manquantes
  • Visualiser des données
  • Décomposer les séries temporelles en composants tendance et saisonniers

Étape 1

Dans Vertex AI Workbench, accédez à training-data-analyst/courses/ai-for-time-series/notebooks, puis ouvrez 01-explore.ipynb.

Étape 2

Effacez toutes les cellules du notebook (Modifier > Supprimer tous les éléments de sortie), modifiez les paramètres de région, de projet et de bucket dans l'une des premières cellules, puis exécutez les cellules une par une.

Étape 3

Dans cette section, vous avez importé les données et en avez visualisé différentes dimensions. Maintenant que vous disposez d'une image plus claire des données, vous pouvez passer à la modélisation du machine learning à l'aide de ces données.

55839e7bc0427915.png

5. Créer un modèle avec les prévisions de séries temporelles BigQuery

Dans cette section, vous allez effectuer les tâches suivantes :

  • Importer les données d'entrée de vos séries temporelles dans une table BigQuery
  • Créer un modèle de série temporelle à l'aide de la syntaxe BQML
  • Découvrez comment évaluer les paramètres et la justesse de votre modèle
  • Effectuer des prévisions à l'aide de votre modèle

Étape 1

Nous allons créer une table BigQuery avec les données brutes du fichier CSV que nous venons d'examiner. Commençons par télécharger le fichier CSV à partir de l'environnement de notebook.

À partir du répertoire training-data-analyst/courses/ai-for-time-series/notebooks/data, effectuez un clic droit sur cta_ridership.csv, puis téléchargez-le dans votre environnement local.

Étape 2

Nous allons ensuite importer ces données dans une table BigQuery.

Accédez à BigQuery dans la console (en effectuant une recherche ou en cliquant sur ce lien):

649e7ab1c44b75e8.png

Vous pouvez ajouter la table à un ensemble de données nouveau ou existant, qui regroupe les tables associées. Si vous n'avez pas encore créé d'ensemble de données, vous pouvez cliquer sur votre projet en bas à gauche, puis sélectionner Créer un ensemble de données en bas à droite.

281b97020cd52f29.png

Choisissez le nom de votre choix, par exemple demo, acceptez le nom par défaut, puis continuez.

Une fois cet ensemble de données sélectionné, cliquez sur Créer une table en bas à droite pour créer une table.

ad47810d44cfb289.png

Pour les options de création de table, sélectionnez:

  • Créer une table à partir de : Importer
  • Sélectionner un fichier: cta_ridership.csv
  • Nom de la table: cta_ridership
  • Schéma: cochez la case pour détecter automatiquement Schéma et paramètres d'entrée.

213e4177e9e79544.png

Étape 3

Il est maintenant temps de créer notre modèle. BigQuery ML fournit une syntaxe simple semblable à SQL, qui vous permet de créer une grande variété de types de modèles.

Dans l'éditeur de requête, collez/saisissez cette requête, en remplaçant demo si nécessaire par le nom de votre ensemble de données aux deux emplacements:

CREATE OR REPLACE MODEL
  `demo.cta_ridership_model` OPTIONS(MODEL_TYPE='ARIMA',
    TIME_SERIES_TIMESTAMP_COL='service_date',
    TIME_SERIES_DATA_COL='total_rides',
    HOLIDAY_REGION='us') AS
SELECT
  service_date, total_rides
FROM
  `demo.cta_ridership`

Examinons les éléments clés de la syntaxe pour les comprendre:

CREATE OR REPLACE MODEL
demo.cta_ridership_model

Cette instruction crée le modèle. Il existe des variantes de cette instruction, par exemple : CREATE MODEL, mais nous avons choisi de remplacer un modèle existant portant le même nom.

OPTIONS(MODEL_TYPE=‘ARIMA' ... )

Ici, nous définissons les options du modèle, la première option étant le type de modèle. La sélection d'ARIMA permet de créer un modèle de prévision de séries temporelles.

TIME_SERIES_TIMESTAMP_COL=‘service_date'

La colonne contenant les informations de date/heure

TIME_SERIES_DATA_COL=‘total_rides'

Colonne de données

HOLIDAY_REGION=‘us'

Ce paramètre facultatif nous permet d'inclure les jours fériés dans le modèle. Comme l'exploration des données de l'étape précédente a montré que la fréquentation était plus faible pendant les jours fériés et que les données proviennent de Chicago, Illinois, États-Unis, nous incluons les jours fériés des États-Unis dans le modèle.

AS SELECT ... FROM ...

Cette section sélectionne les données d'entrée qui serviront à entraîner le modèle.

Vous pouvez ajouter un certain nombre d'autres options à la requête. Par exemple, vous pouvez définir une colonne si vous disposez de plusieurs séries temporelles ou choisir de découvrir automatiquement les paramètres du modèle ARIMA. Pour en savoir plus, consultez la documentation de référence sur la syntaxe de l'instruction CREATE MODEL pour les modèles de série temporelle.

Étape 4

Apprenons-en plus sur notre modèle. Une fois l'entraînement terminé, exécutez une autre requête en remplaçant à nouveau demo si nécessaire:

SELECT
  *
FROM
  ML.EVALUATE(MODEL `demo.cta_ridership_model`)

Interprétons les résultats. Chaque ligne contient un modèle candidat, ainsi que ses paramètres et ses statistiques d'évaluation. Les résultats sont renvoyés par ordre croissant d'AIC, ou critère d'information d'Akaike, qui fournit un indicateur relatif de la qualité du modèle. Ainsi, le modèle de la première ligne présente l'AIC le plus faible et est considéré comme le meilleur modèle.

Vous pouvez voir les paramètres "p", "d" et "q" du modèle ARIMA, ainsi que la saisonnalité détectée dans le modèle. Dans ce cas, le modèle principal prend en compte à la fois la saisonnalité hebdomadaire et la saisonnalité annuelle.

5b5b1e129c70a340.png

Étape 5

Nous sommes maintenant prêts à effectuer des prévisions avec la fonction ML.FORECAST.

Collez/saisissez le texte suivant (en remplaçant demo si nécessaire):

SELECT
  *
FROM
  ML.FORECAST(MODEL `demo.cta_ridership_model`,
    STRUCT(7 AS horizon))

Cette requête se contente d'effectuer une prévision sur sept jours à l'aide de notre modèle. Nous pouvons voir les sept lignes renvoyées ci-dessous. La prévision inclut également un intervalle de confiance, défini par défaut sur 0,95, mais configurable dans la requête.

b8a7f22657dc2d27.png

Bravo ! Nous avons créé un modèle de série temporelle avec quelques requêtes BQML seulement.

6. Créer un modèle de prévision personnalisé

Dans cette section, vous allez effectuer les tâches suivantes :

  • Supprimer les anomalies des données
  • Effectuer des prévisions en plusieurs étapes
  • Inclure des caractéristiques supplémentaires dans un modèle de série temporelle
  • Découvrez les architectures de réseaux de neurones pour la prévision de séries temporelles: LSTM et CNN
  • Découvrir les modèles statistiques, y compris le lissage exponentiel Holt-Winters
  • Modèles ensemblistes

Étape 1

Dans Vertex AI Workbench, accédez à training-data-analyst/courses/ai-for-time-series/notebooks, puis ouvrez 02-model.ipynb.

Étape 2

Effacez toutes les cellules du notebook (Modifier > Supprimer tous les éléments de sortie), modifiez les paramètres de région, de projet et de bucket dans l'une des premières cellules, puis exécutez les cellules une par une.

Étape 3

Dans le notebook, vous avez maintenant exploré plusieurs architectures de modèles: LSTM, CNN et modèles statistiques. Pour chaque modèle, vous pouvez voir ses performances par rapport aux données de test:

a528df58f4e6d372.png

7. Entraîner et prédire dans le cloud

Dans cette section, vous allez effectuer les tâches suivantes :

  • Préparer les données et les modèles pour l'entraînement dans le cloud
  • Entraîner votre modèle et surveiller la progression de la tâche avec AI Platform Training
  • Effectuer des prédictions à l'aide du modèle avec AI Platform Predictions

Étape 1

Dans Vertex AI Workbench, accédez à training-data-analyst/courses/ai-for-time-series/notebooks, puis ouvrez 03-cloud-training.ipynb.

Étape 2

Effacez toutes les cellules du notebook (Modifier > Supprimer tous les éléments de sortie), modifiez les paramètres de région, de projet et de bucket dans l'une des premières cellules, puis exécutez les cellules une par une.

Étape 3

Dans la section précédente, nous avons entraîné un modèle et effectué des prédictions avec celui-ci, le tout dans un notebook Workbench. Dans cette section, nous avons expliqué comment utiliser le SDK Python pour Vertex AI à partir de votre notebook afin d'utiliser les services Vertex AI pour l'entraînement et le déploiement.

a3f6b5dc895a24fb.png

8. Défi

Dans cette section, vous allez essayer d'appliquer les concepts que vous avez appris à un nouveau jeu de données !

Nous ne vous fournirons pas d'instructions détaillées, mais simplement quelques astuces (si vous en avez besoin).

L'objectif est de prédire les requêtes au service 311 provenant de la ville de New York. Ces demandes ne relevant pas des situations d'urgence incluent les réclamations liées au bruit, les problèmes d'éclairage public, etc.

Étape 1

Commençons par étudier l'ensemble de données.

Accédez tout d'abord à l'ensemble de données City of New York 311 Service requests (Demandes au service 311 de la ville de New York).

Pour mieux connaître les données, essayez quelques exemples de requêtes listés dans la description de l'ensemble de données:

  • Quel est le nombre de 311 demandes liées à des camions de glaces ?
  • Quels jours reçoivent le plus de demandes 311 liées à des parties ?

Dans l'interface utilisateur BigQuery, sélectionnez Créer une requête pour voir comment accéder à l'ensemble de données. Notez que l'instruction select effectue l'interrogation à partir de bigquery-public-data.new_york_311.311_service_requests.

Étape 2

Nous sommes prêts à commencer. Dans cette section, vous allez modifier le notebook Explore and Visualize (Explorer et visualiser) pour qu'il utilise ces données.

Conseils

  • Dupliquez le notebook 01-explore.ipynb et commencez à travailler à partir de celui-ci.
  • Pour explorer les données, essayez cette requête:
from google.cloud import bigquery as bq

sql = """
SELECT * FROM `bigquery-public-data.new_york_311.311_service_requests` LIMIT 5
"""

client = bq.Client(project=PROJECT)
df = client.query(sql).to_dataframe()

df.head()
  • Pour obtenir le nombre d'incidents par mois, utilisez la requête suivante:
SELECT
  COUNT(unique_key) as y,
  DATE_TRUNC(DATE(created_date), month) as ds  
FROM `bigquery-public-data.new_york_311.311_service_requests`
GROUP by ds ORDER BY ds asc
  • Mettez à jour les variables de colonne dans la section des constantes. Dans la requête ci-dessus, la colonne cible est y et la colonne de date est ds. Il n'y a pas de fonctionnalités supplémentaires.
  • Pensez à modifier le nom du fichier dans lequel vous exportez les données pour le prochain atelier.
  • Exporter les données à l'aide de df.to_csv(YOUR-EXPORT-FILENAME, index=False)

Étape 3

Créons maintenant un modèle de série temporelle avec les données mensuelles.

Conseils:

  • Dupliquez le notebook 02-model.ipynb et commencez à travailler à partir de celui-ci.
  • Mettez à jour les paramètres de l'ensemble de données:
  • Mettez à jour les paramètres target_col et ts_col pour qu'ils correspondent à votre nouvel ensemble de données.
  • Mettez à jour les paramètres du modèle:
  • Fréquence à tous les mois (le code pour le début du mois est "MS")
  • Étapes d'entrée: 12 (la période d'analyse est de 12 mois)
  • Étapes de sortie: 3 (prédire pour 3 mois à venir)
  • Saisons: 12 (la saisonnalité correspond à 12 mois)
  • Modifiez le nom du fichier d'entrée si vous l'avez modifié dans le notebook précédent.
  • Si vous exécutez la requête en milieu de mois, le total mensuel pour le dernier mois sera beaucoup plus faible que prévu. Pour les besoins de cet atelier, nous allons supprimer le dernier mois de l'ensemble de données en utilisant: df = df[:-1]
  • Il ne semble pas y avoir de valeurs aberrantes évidentes dans les données, alors ignorez ou mettez en commentaire ces cellules.
  • Ajustez les unités LSTM, les filtres CNN et la taille du noyau pour ce nouveau modèle.

9. Nettoyage

Si vous souhaitez continuer à utiliser cet ordinateur portable, nous vous recommandons de le désactiver lorsqu'il n'est pas utilisé. Dans l'interface utilisateur Workbench de votre console Cloud, sélectionnez le notebook, puis cliquez sur Arrêter:

57213ef2edad9257.png

Si vous souhaitez supprimer toutes les ressources que vous avez créées dans cet atelier, il vous suffit de supprimer le notebook Workbench au lieu de l'arrêter.

À l'aide du menu de navigation de la console Cloud, accédez à "Storage" (Stockage) et supprimez les deux buckets que vous avez créés pour stocker les ressources de votre modèle (AVERTISSEMENT: faites-le uniquement si vous avez créé des buckets uniquement pour cet atelier).