Prévision avec Prophet

Prophet est un modèle de prévision géré par Meta. Consultez l'article sur Prophet pour obtenir des détails sur l'algorithme et la documentation pour en savoir plus sur la bibliothèque.

Comme BigQuery ML ARIMA_PLUS, Prophet tente de décomposer chaque série temporelle en tendances, saisons et jours fériés, afin de produire une prévision à l'aide de l'agrégation des prédictions de ces modèles. Cependant, une différence importante est que BQML ARIMA+ utilise ARIMA pour modéliser le composant de tendance, tandis que Prophet tente d'ajuster une courbe à l'aide d'un modèle logistique ou linéaire par fragments.

Google Cloud propose un pipeline pour l'entraînement d'un modèle Prophet et un autre pour obtenir des prédictions par lot à partir d'un modèle Prophet. Les deux pipelines sont des instances de Vertex AI Pipelines provenant des composants du pipeline Google Cloud (GCPC).

L'intégration de Prophet à Vertex AI vous permet d'effectuer les opérations suivantes :

Bien que Prophet soit un modèle multivarié, Vertex AI n'accepte qu'une version univariée de ce modèle.

Pour en savoir plus sur les comptes de service utilisés par ce workflow, consultez la page Comptes de service pour les workflows tabulaires.

API de workflows

Ce workflow utilise les API suivantes :

  • Vertex AI
  • Dataflow
  • BigQuery
  • Cloud Storage

Entraîner un modèle avec Prophet

Prophet est conçu pour une seule série temporelle. Vertex AI regroupe les données par ID de série temporelle et entraîne un modèle Prophet pour chaque série temporelle. Le pipeline d'entraînement de modèle effectue un réglage des hyperparamètres à l'aide de la recherche par grille et de la logique intégrée de test de rétropropagation.

Pour accepter plusieurs séries temporelles, le pipeline utilise un job d'entraînement personnalisé et Dataflow pour entraîner plusieurs modèles Prophet en parallèle. Dans l'ensemble, le nombre de modèles entraînés est le produit du nombre de séries temporelles et du nombre d'essais de réglage des hyperparamètres.

L'exemple de code suivant montre comment exécuter un pipeline d'entraînement de modèle Prophet :

job = aiplatform.PipelineJob(
    ...
    template_path=train_job_spec_path,
    parameter_values=train_parameter_values,
    ...
)
job.run(service_account=SERVICE_ACCOUNT)

Le paramètre facultatif service_account dans job.run() vous permet de définir le compte de service Vertex AI Pipelines sur le compte de votre choix.

Le pipeline et les valeurs des paramètres sont définis par la fonction suivante.

(
    train_job_spec_path,
    train_parameter_values,
) = utils.get_prophet_train_pipeline_and_parameters(
    ...
)

Voici un sous-ensemble de paramètres get_prophet_train_pipeline_and_parameters :

Nom du paramètre Type Définition
project String L'ID de votre projet.
location String Votre région.
root_dir String Emplacement Cloud Storage pour stocker le résultat.
target_column String Colonne (valeur) que le modèle doit prédire.
time_column String Colonne Heure. Vous devez spécifier une colonne heure et chaque ligne doit contenir une valeur. La colonne Heure indique l'heure à laquelle une observation donnée a été effectuée.
time_series_identifier_column String Colonne de l'identifiant de série temporelle. Vous devez spécifier une colonne d'identifiant de série temporelle et elle doit comporter une valeur pour chaque ligne. La prévision des données d'entraînement comprend généralement plusieurs séries temporelles. L'identifiant indique à Vertex AI dans quelle série temporelle se trouvent les données d'entraînement faisant l'objet d'une observation. Toutes les lignes d'une série temporelle donnée ont la même valeur dans la colonne d'identifiant de la série temporelle. Il est courant d'utiliser l'ID d'un produit, l'identifiant d'un magasin ou une région comme identifiant de série temporelle. Il est possible d'entraîner un modèle de prévision sur une seule série temporelle, avec une valeur identique pour toutes les lignes de la colonne d'identifiant de la série temporelle. Toutefois, Vertex AI est une solution plus adaptée pour les données d'entraînement contenant au moins deux séries temporelles. Pour des résultats optimaux, utilisez au moins 10 séries temporelles pour chaque colonne utilisée pour entraîner le modèle.
data_granularity_unit String Unité à utiliser pour la précision de vos données d'entraînement, de l'horizon de prévision et de la fenêtre de contexte. Il peut s'agir de minute, hour, day, week, month ou year. Découvrez comment choisir le niveau de précision des données.
data_source_csv_filenames String URI d'un fichier CSV stocké dans Cloud Storage.
data_source_bigquery_table_path Chaîne URI d'une table BigQuery.
forecast_horizon Integer L'horizon de prévision détermine jusqu'à quand le modèle prévoit la valeur cible pour chaque ligne de données de prédiction. L'horizon de prévision est spécifié en unités de précision des données. En savoir plus
optimization_objective String Objectif d'optimisation du modèle. En savoir plus
max_num_trials Integer Nombre maximal d'essais de réglage à effectuer par série temporelle.

Paramètres Dataflow

Voici un sous-ensemble de paramètres get_prophet_train_pipeline_and_parameters pour la personnalisation Dataflow :

Nom du paramètre Type Définition
trainer_dataflow_machine_type String Type de machine Dataflow à utiliser pour l'entraînement.
trainer_dataflow_max_num_workers Integer Nombre maximal de nœuds de calcul Dataflow à utiliser pour l'entraînement.
evaluation_dataflow_machine_type String Type de machine Dataflow à utiliser pour l'évaluation.
evaluation_dataflow_max_num_workers Integer Nombre maximal de nœuds de calcul Dataflow à utiliser pour l'évaluation.
dataflow_service_account String Compte de service personnalisé permettant d'exécuter des tâches Dataflow. La tâche Dataflow peut être configurée pour utiliser des adresses IP privées et un sous-réseau VPC spécifique. Ce paramètre sert de valeur de remplacement pour le compte de service de nœud de calcul Dataflow par défaut.

Étant donné que les tâches d'entraînement Prophet s'exécutent sur Dataflow, le temps de démarrage initial est de 5 à 7 minutes. Pour réduire un environnement d'exécution supplémentaire, vous pouvez effectuer un scaling à la hausse ou à la baisse. Par exemple, pour effectuer un scaling à la hausse, vous pouvez remplacer le type de machine n1-standard-1 par e2-highcpu-8. Vous pouvez augmenter le nombre de nœuds de calcul de 1 à 200 pour effectuer un scaling horizontal.

Paramètres de répartition des données

Le pipeline d'entraînement propose les options suivantes pour répartir vos données :

Répartition des données Description Paramètres
Répartition par défaut Par défaut, Vertex AI sélectionne de manière aléatoire 80 % des lignes de données pour l'ensemble d'entraînement, 10 % pour l'ensemble de validation et 10 % pour l'ensemble de test. Vertex AI utilise la colonne Heure pour déterminer l'ordre chronologique des lignes de données. Aucun
Fractionnement de la fraction Vertex AI utilise les valeurs que vous fournissez pour partitionner vos données dans l'ensemble d'entraînement, l'ensemble de validation et l'ensemble de test. Vertex AI utilise la colonne Heure pour déterminer l'ordre chronologique des lignes de données.
  • training_fraction
  • validation_fraction
  • test_fraction
Répartition par horodatage Vertex AI utilise les valeurs training_fraction, validation_fraction et test_fraction pour partitionner vos données dans l'ensemble d'entraînement, l'ensemble de validation et l'ensemble de test. Vertex AI utilise la colonne timestamp_split_key pour déterminer l'ordre chronologique des lignes de données.
  • training_fraction
  • validation_fraction
  • test_fraction
  • timestamp_split_key
Répartition manuelle (prédéfinie) Vertex AI divise les données à l'aide des valeurs TRAIN, VALIDATE ou TEST dans la colonne predefined_split_key.
  • predefined_split_key

Vous définissez les paramètres de répartition des données dans get_prophet_train_pipeline_and_parameters comme suit :

Nom du paramètre Type Définition
predefined_split_key String Nom de la colonne contenant les valeurs TRAIN, VALIDATE ou TEST. Définissez cette valeur si vous utilisez une répartition manuelle (prédéfinie).
training_fraction Nombre à virgule flottante Pourcentage de données à attribuer à l'ensemble d'entraînement. Définissez cette valeur si vous utilisez une division de fraction ou une répartition d'horodatage.
validation_fraction Nombre à virgule flottante Pourcentage de données à attribuer à l'ensemble de validation. Définissez cette valeur si vous utilisez une division de fraction ou une répartition d'horodatage.
test_fraction Nombre à virgule flottante Pourcentage de données à attribuer à l'ensemble de test. Définissez cette valeur si vous utilisez une division de fraction ou une répartition d'horodatage.
timestamp_split_key String Nom de la colonne contenant les horodatages pour la répartition des données. Définissez cette valeur si vous utilisez une répartition par horodatage.

Paramètres de fenêtrage

Vertex AI génère des fenêtres de prévision à partir des données d'entrée à l'aide d'une stratégie de fenêtre glissante. Si vous ne définissez pas les paramètres de fenêtrage, Vertex AI utilise la stratégie Count avec la valeur maximale par défaut de 100,000,000. Le pipeline d'entraînement propose les stratégies de fenêtre glissante suivantes :

Stratégie de fenêtre glissante Description Paramètres
Nombre Le nombre de fenêtres générées par Vertex AI ne doit pas dépasser une valeur maximale fournie par l'utilisateur. Si le nombre de lignes dans l'ensemble de données d'entrée est inférieur au nombre maximal de fenêtres, chaque ligne est utilisée pour générer une fenêtre. Sinon, Vertex AI effectue un échantillonnage aléatoire pour sélectionner les lignes. La valeur par défaut pour le nombre maximal de fenêtres est 100,000,000. Le nombre maximal de fenêtres ne peut pas dépasser 100,000,000. window_max_count
Pas Vertex AI utilise une ligne toutes les X lignes d'entrée pour générer une fenêtre, jusqu'à 100 000 000 de fenêtres maximum. Cette option est utile pour les prédictions saisonnières ou périodiques. Par exemple, vous pouvez limiter les prévisions à un seul jour de la semaine en définissant la valeur du pas sur 7. Cette valeur peut être comprise entre 1 et 1000. window_stride_length
Colonne Vous pouvez ajouter à vos données d'entrée une colonne dont les valeurs sont True ou False. Vertex AI génère une fenêtre pour chaque ligne d'entrée dont la valeur de colonne est True. Les valeurs True et False peuvent être définies dans n'importe quel ordre, à condition que le nombre total de lignes True soit inférieur à 100,000,000. Les valeurs booléennes sont préférées, mais les valeurs de chaîne sont également acceptées. Les valeurs de chaîne ne sont pas sensibles à la casse. window_column

Vous définissez les paramètres de fenêtrage dans get_prophet_train_pipeline_and_parameters comme suit :

Nom du paramètre Type Définition
window_column String Nom de la colonne avec les valeurs True et False.
window_stride_length Integer Valeur de la longueur du pas.
window_max_count Integer Nombre maximal de fenêtres.

Effectuer des prédictions avec Prophet

Le pipeline d'entraînement de modèle pour Prophet de Vertex AI crée un modèle Prophet pour chaque série temporelle dans les données. Le pipeline de prédiction regroupe les données d'entrée par ID de séries temporelles et calcule les prédictions séparément pour chaque série temporelle. Le pipeline dissocie ensuite les résultats de la prédiction pour qu'ils correspondent au format des prévisions Vertex AI.

L'exemple de code suivant montre comment exécuter un pipeline de prédiction Prophet :

job = aiplatform.PipelineJob(
    ...
    template_path=prediction_job_spec_path,
    parameter_values=prediction_parameter_values,
    ...
)
job.run(...)

Le pipeline et les valeurs des paramètres sont définis par la fonction suivante.

(
    prediction_job_spec_path,
    prediction_parameter_values,
) = utils.get_prophet_prediction_pipeline_and_parameters(
    ...
)

Voici un sous-ensemble de paramètres get_prophet_prediction_pipeline_and_parameters :

Nom du paramètre Type Définition
project String L'ID de votre projet.
location String Votre région.
model_name String Nom de la ressource de modèle. Formatez la chaîne comme suit : projects/{project}/locations/{location}/models/{model}.
time_column String Colonne Heure. Vous devez spécifier une colonne heure et chaque ligne doit contenir une valeur. La colonne Heure indique l'heure à laquelle une observation donnée a été effectuée.
time_series_identifier_column String Colonne de l'identifiant de série temporelle. Vous devez spécifier une colonne d'identifiant de série temporelle et elle doit comporter une valeur pour chaque ligne. La prévision des données d'entraînement comprend généralement plusieurs séries temporelles. L'identifiant indique à Vertex AI dans quelle série temporelle se trouvent les données d'entraînement faisant l'objet d'une observation. Toutes les lignes d'une série temporelle donnée ont la même valeur dans la colonne d'identifiant de la série temporelle. Il est courant d'utiliser l'ID d'un produit, l'identifiant d'un magasin ou une région comme identifiant de série temporelle. Il est possible d'entraîner un modèle de prévision sur une seule série temporelle, avec une valeur identique pour toutes les lignes de la colonne d'identifiant de la série temporelle. Toutefois, Vertex AI est une solution plus adaptée pour les données d'entraînement contenant au moins deux séries temporelles. Pour des résultats optimaux, utilisez au moins 10 séries temporelles pour chaque colonne utilisée pour entraîner le modèle.
target_column String Colonne (valeur) que le modèle doit prédire.
data_source_csv_filenames String URI d'un fichier CSV stocké dans Cloud Storage.
data_source_bigquery_table_path Chaîne URI d'une table BigQuery.
bigquery_destination_uri String URI de l'ensemble de données de destination souhaité Si cette valeur n'est pas définie, les ressources sont créées sous un nouvel ensemble de données dans le projet.
machine_type String Type de machine à utiliser pour la prédiction par lot.
max_num_workers Integer Nombre maximal de nœuds de calcul à utiliser pour la prédiction par lot.