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 les 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 à l'aide des architectures LSTM et CNN

2. Présentation de la prévision de séries temporelles

Cet atelier de programmation se concentre sur la façon 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 enregistrées à intervalles de temps réguliers. Un ensemble de données de série temporelle contient à la fois l'heure et au moins une variable qui en dépend.

85af6a1ff05c69f2.png

Composants

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

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

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

6e8d45bbbbc388ec.png

Stationnarité

Pour obtenir les meilleurs résultats de prévision, les données de séries temporelles doivent être stationnaires, 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 suppression de la tendance peuvent être appliquées aux données brutes pour les rendre plus stationnaires.

Par exemple, le graphique ci-dessous de la concentration de 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 ont 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érie temporelle 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 les valeurs futures. Ce tableau montre un exemple de création de variables différées pour prédire la cible.

d667a941dbd470f5.png

Maintenant que nous avons abordé quelques principes de base, commençons à explorer les données et à faire des prévisions.

3. Configurer votre environnement Notebook

Maintenant que nous avons brièvement présenté les données, configurons notre environnement de développement de 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 dans l'interface JupyterLab : Fichier > Nouveau > Terminal.

Clonez ensuite le matériel 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 de tendance et saisonniers

Étape 1

Dans Vertex AI Workbench, accédez à training-data-analyst/courses/ai-for-time-series/notebooks et 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 visualisé différentes dimensions. Maintenant que vous avez une idée plus précise des données, vous êtes prêt à passer à la modélisation du machine learning à l'aide de ces données.

55839e7bc0427915.png

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

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

  • Importer vos données d'entrée de série temporelle 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 précision de votre modèle.
  • Prévoir à 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'explorer. Commençons par télécharger le fichier CSV depuis l'environnement du notebook.

Dans le répertoire training-data-analyst/courses/ai-for-time-series/notebooks/data, effectuez un clic droit sur cta_ridership.csv, puis cliquez sur Télécharger pour le télécharger 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 utilisant 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 un nom, par exemple demo, acceptez les valeurs par défaut et 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 tableau, sélectionnez :

  • Créer une table à partir de : Importer
  • Sélectionnez le fichier : cta_ridership.csv
  • Nom de la table : cta_ridership
  • Schéma : cochez la case pour détecter automatiquement le schéma et les 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 par le nom de votre ensemble de données aux deux endroits, si nécessaire :

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`

Pour comprendre la syntaxe, examinons-en les éléments clés :

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 du même nom ici.

OPTIONS(MODEL_TYPE=‘ARIMA' ... )

Ici, nous définissons les options du modèle, la première étant le type de modèle. Si vous sélectionnez ARIMA, un modèle de prévision de séries temporelles sera créé.

TIME_SERIES_TIMESTAMP_COL=‘service_date'

Colonne contenant des informations sur la date et l'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 notre exploration des données à l'étape précédente a montré que le nombre de passagers était plus faible les jours fériés, et que les données proviennent de Chicago, dans l'Illinois (États-Unis), nous incluons les jours fériés américains dans le modèle.

AS SELECT ... FROM ...

Cette section permet de sélectionner les données d'entrée que nous utiliserons pour entraîner le modèle.

Vous pouvez ajouter d'autres options à la requête, par exemple définir une colonne si vous avez 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

Découvrons plus en détail notre modèle. Une fois l'entraînement terminé, exécutons 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 affiche un modèle candidat, avec ses paramètres et ses statistiques d'évaluation. Les résultats sont renvoyés par ordre croissant d'AIC (critère d'information Akaike), qui fournit un indicateur relatif de la qualité du modèle. Le modèle de la première ligne présente l'AIC le plus bas, et il est considéré comme le meilleur modèle.

Vous pourrez voir les paramètres p, d et q du modèle ARIMA, ainsi que la saisonnalité découverte dans le modèle. Dans ce cas, le modèle le plus performant inclut à la fois la saisonnalité hebdomadaire et annuelle.

5b5b1e129c70a340.png

Étape 5

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

Collez/saisissez les éléments suivants (en remplaçant demo si nécessaire) :

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

Cette requête prévoit simplement les sept prochains jours à l'aide de notre modèle. Les sept lignes renvoyées sont visibles ci-dessous. La prévision inclut également un intervalle de confiance, qui est défini par défaut sur 0,95, mais qui peut être configuré dans la requête.

b8a7f22657dc2d27.png

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

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

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

  • Supprimer les valeurs aberrantes des données
  • Effectuer des prévisions en plusieurs étapes
  • Inclure des fonctionnalités 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
  • En savoir plus sur 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 et 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 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 du job avec AI Platform Training
  • Prédire à 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 et 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 montré comment utiliser le SDK Python pour Vertex AI depuis 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 nouvel ensemble de données.

Nous ne fournirons pas d'instructions détaillées, mais simplement quelques indices (si vous le souhaitez).

L'objectif est de prédire les demandes d'intervention auprès du 311 de la ville de New York. Ces demandes non urgentes incluent les plaintes pour bruit, les problèmes d'éclairage public, etc.

Étape 1

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

Commencez par accéder à l'ensemble de données Demandes de service 311 de la ville de New York.

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

  • Quel est le nombre de demandes 311 liées aux camions de glaces ?
  • Quels sont les jours où le plus grand nombre de demandes au 311 concernant des fêtes sont enregistrées ?

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

Étape 2

Nous sommes prêts à commencer. Dans cette section, modifiez le notebook Explorer et visualiser pour qu'il fonctionne avec 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. Aucune fonctionnalité supplémentaire n'est disponible.
  • Pensez à modifier le nom du fichier dans lequel vous exportez les données pour le prochain atelier.
  • Exportez 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 mensuelle (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édiction sur 3 mois)
  • Saisons : 12 (la saisonnalité est de 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 du dernier mois sera beaucoup plus bas que prévu. Pour les besoins de cet atelier, supprimons le dernier mois de l'ensemble de données à l'aide de la commande suivante : df = df[:-1]
  • Il ne semble pas y avoir de valeurs aberrantes évidentes dans les données. Vous pouvez donc ignorer ou commenter ces cellules.
  • Ajustez les unités LSTM, ainsi que les filtres et la taille du noyau CNN pour ce nouveau modèle.

9. Nettoyage

Si vous souhaitez continuer à utiliser ce notebook, nous vous recommandons de le désactiver quand vous ne vous en servez pas. À partir de l'interface utilisateur de Workbench dans la console Cloud, sélectionnez le notebook et 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.

Dans le menu de navigation de la console Cloud, accédez à Stockage et supprimez les deux buckets que vous avez créés pour stocker les composants de votre modèle (AVERTISSEMENT : ne le faites que si vous avez créé de nouveaux buckets uniquement pour cet atelier).