Effectuer une détection d'anomalies avec un modèle de prévision de séries temporelles multivariées

Ce tutoriel vous explique comment effectuer les tâches suivantes :

Ce tutoriel utilise les tables suivantes de l'ensemble de données public epa_historical_air_quality, qui contient des informations quotidiennes sur la concentration de particules fines PM 2,5, la température et la vitesse du vent, collectées pour plusieurs villes américaines :

Autorisations requises

  • Pour créer l'ensemble de données, vous devez disposer de l'autorisation IAM bigquery.datasets.create.

  • Pour créer le modèle, vous avez besoin des autorisations suivantes :

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • Pour exécuter une inférence, vous devez disposer des autorisations suivantes :

    • bigquery.models.getData
    • bigquery.jobs.create

Pour plus d'informations sur les rôles et les autorisations IAM dans BigQuery, consultez la page Présentation d'IAM.

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

  • BigQuery: You incur costs for the data you process in BigQuery.

Pour obtenir une estimation des coûts en fonction de votre utilisation prévue, utilisez le simulateur de coût.

Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Pour en savoir plus, consultez la page décrivant les tarifs de BigQuery.

Avant de commencer

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the BigQuery API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery API.

    Enable the API

  8. Créer un ensemble de données

    Créez un ensemble de données BigQuery pour stocker votre modèle de ML.

    Console

    1. Dans la console Google Cloud , accédez à la page BigQuery.

      Accéder à la page "BigQuery"

    2. Dans le volet Explorateur, cliquez sur le nom de votre projet.

    3. Cliquez sur Afficher les actions > Créer un ensemble de données.

      Option de menu "Créer un ensemble de données".

    4. Sur la page Créer un ensemble de données, procédez comme suit :

      • Dans le champ ID de l'ensemble de données, saisissez bqml_tutorial.

      • Pour Type d'emplacement, sélectionnez Multirégional, puis sélectionnez US (plusieurs régions aux États-Unis).

      • Conservez les autres paramètres par défaut, puis cliquez sur Créer un ensemble de données.

    bq

    Pour créer un ensemble de données, exécutez la commande bq mk en spécifiant l'option --location. Pour obtenir la liste complète des paramètres possibles, consultez la documentation de référence sur la commande bq mk --dataset.

    1. Créez un ensemble de données nommé bqml_tutorial avec l'emplacement des données défini sur US et une description de BigQuery ML tutorial dataset :

      bq --location=US mk -d \
       --description "BigQuery ML tutorial dataset." \
       bqml_tutorial

      Au lieu d'utiliser l'option --dataset, la commande utilise le raccourci -d. Si vous omettez -d et --dataset, la commande crée un ensemble de données par défaut.

    2. Vérifiez que l'ensemble de données a été créé :

      bq ls

    API

    Appelez la méthode datasets.insert avec une ressource d'ensemble de données définie.

    {
      "datasetReference": {
         "datasetId": "bqml_tutorial"
      }
    }

    BigQuery DataFrames

    Avant d'essayer cet exemple, suivez les instructions de configuration pour BigQuery DataFrames du guide de démarrage rapide de BigQuery DataFrames. Pour en savoir plus, consultez la documentation de référence sur BigQuery DataFrames.

    Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer les ADC pour un environnement de développement local.

    import google.cloud.bigquery
    
    bqclient = google.cloud.bigquery.Client()
    bqclient.create_dataset("bqml_tutorial", exists_ok=True)

    Préparer les données d'entraînement

    Les données de concentration de particules fines PM2.5, de température et de vitesse du vent sont situées dans des tables distinctes. Créez la table bqml_tutorial.seattle_air_quality_daily des données d'entraînement en combinant les données de ces tables publiques. bqml_tutorial.seattle_air_quality_daily contient les colonnes suivantes :

    • date : date de l'observation
    • PM2.5 : concentration moyenne de particules fines PM 2,5 enregistrée chaque jour
    • wind_speed : vitesse moyenne du vent enregistrée chaque jour
    • temperature : température la plus élevée enregistrée chaque jour

    La nouvelle table contient des données quotidiennes enregistrées du 11 août 2009 au 31 janvier 2022.

    1. Accédez à la page BigQuery.

      Accéder à BigQuery

    2. Dans le volet de l'éditeur, exécutez l'instruction SQL suivante :

      CREATE TABLE `bqml_tutorial.seattle_air_quality_daily`
      AS
      WITH
        pm25_daily AS (
          SELECT
            avg(arithmetic_mean) AS pm25, date_local AS date
          FROM
            `bigquery-public-data.epa_historical_air_quality.pm25_nonfrm_daily_summary`
          WHERE
            city_name = 'Seattle'
            AND parameter_name = 'Acceptable PM2.5 AQI & Speciation Mass'
          GROUP BY date_local
        ),
        wind_speed_daily AS (
          SELECT
            avg(arithmetic_mean) AS wind_speed, date_local AS date
          FROM
            `bigquery-public-data.epa_historical_air_quality.wind_daily_summary`
          WHERE
            city_name = 'Seattle' AND parameter_name = 'Wind Speed - Resultant'
          GROUP BY date_local
        ),
        temperature_daily AS (
          SELECT
            avg(first_max_value) AS temperature, date_local AS date
          FROM
            `bigquery-public-data.epa_historical_air_quality.temperature_daily_summary`
          WHERE
            city_name = 'Seattle' AND parameter_name = 'Outdoor Temperature'
          GROUP BY date_local
        )
      SELECT
        pm25_daily.date AS date, pm25, wind_speed, temperature
      FROM pm25_daily
      JOIN wind_speed_daily USING (date)
      JOIN temperature_daily USING (date)

    Créer le modèle

    Créez un modèle de série temporelle multivariée en utilisant les données de bqml_tutorial.seattle_air_quality_daily comme données d'entraînement.

    1. Accédez à la page BigQuery.

      Accéder à BigQuery

    2. Dans le volet de l'éditeur, exécutez l'instruction SQL suivante :

      CREATE OR REPLACE MODEL `bqml_tutorial.arimax_model`
        OPTIONS (
          model_type = 'ARIMA_PLUS_XREG',
          auto_arima=TRUE,
          time_series_data_col = 'temperature',
          time_series_timestamp_col = 'date'
          )
      AS
      SELECT
        *
      FROM
        `bqml_tutorial.seattle_air_quality_daily`
      WHERE
        date < "2023-02-01";

      L'exécution de la requête prend plusieurs secondes, après quoi le modèle arimax_model apparaît dans l'ensemble de données bqml_tutorial dans le volet Explorateur.

      Étant donné que la requête utilise une instruction CREATE MODEL pour créer un modèle, il n'y a aucun résultat de requête.

    Effectuer une détection d'anomalies sur des données historiques

    Lancez la détection d'anomalies sur les données historiques que vous avez utilisées pour entraîner le modèle.

    1. Accédez à la page BigQuery.

      Accéder à BigQuery

    2. Dans le volet de l'éditeur, exécutez l'instruction SQL suivante :

      SELECT
        *
      FROM
        ML.DETECT_ANOMALIES (
         MODEL `bqml_tutorial.arimax_model`,
         STRUCT(0.6 AS anomaly_prob_threshold)
        )
      ORDER BY
        date ASC;

      Les résultats ressemblent à ce qui suit :

      +-------------------------+-------------+------------+--------------------+--------------------+---------------------+
      | date                    | temperature | is_anomaly | lower_bound        | upper_bound        | anomaly_probability |
      +--------------------------------------------------------------------------------------------------------------------+
      | 2009-08-11 00:00:00 UTC | 70.1        | false      | 67.647370742988727 | 72.552629257011262 | 0                   |
      +--------------------------------------------------------------------------------------------------------------------+
      | 2009-08-12 00:00:00 UTC | 73.4        | false      | 71.7035428351283   | 76.608801349150838 | 0.20478819992561115 |
      +--------------------------------------------------------------------------------------------------------------------+
      | 2009-08-13 00:00:00 UTC | 64.6        | true       | 67.740408724826068 | 72.6456672388486   | 0.945588334903206   |
      +-------------------------+-------------+------------+--------------------+--------------------+---------------------+
      

    Effectuer une détection d'anomalies sur de nouvelles données

    Exécutez la détection d'anomalies sur les nouvelles données que vous générez.

    1. Accédez à la page BigQuery.

      Accéder à BigQuery

    2. Dans le volet de l'éditeur, exécutez l'instruction SQL suivante :

      SELECT
        *
      FROM
        ML.DETECT_ANOMALIES (
         MODEL `bqml_tutorial.arimax_model`,
         STRUCT(0.6 AS anomaly_prob_threshold),
         (
           SELECT
             *
           FROM
             UNNEST(
               [
                 STRUCT<date TIMESTAMP, pm25 FLOAT64, wind_speed FLOAT64, temperature FLOAT64>
                 ('2023-02-01 00:00:00 UTC', 8.8166665, 1.6525, 44.0),
                 ('2023-02-02 00:00:00 UTC', 11.8354165, 1.558333, 40.5),
                 ('2023-02-03 00:00:00 UTC', 10.1395835, 1.6895835, 46.5),
                 ('2023-02-04 00:00:00 UTC', 11.439583500000001, 2.0854165, 45.0),
                 ('2023-02-05 00:00:00 UTC', 9.7208335, 1.7083335, 46.0),
                 ('2023-02-06 00:00:00 UTC', 13.3020835, 2.23125, 43.5),
                 ('2023-02-07 00:00:00 UTC', 5.7229165, 2.377083, 47.5),
                 ('2023-02-08 00:00:00 UTC', 7.6291665, 2.24375, 44.5),
                 ('2023-02-09 00:00:00 UTC', 8.5208335, 2.2541665, 40.5),
                 ('2023-02-10 00:00:00 UTC', 9.9086955, 7.333335, 39.5)
               ]
             )
           )
         );

      Les résultats ressemblent à ce qui suit :

      +-------------------------+-------------+------------+--------------------+--------------------+---------------------+------------+------------+
      | date                    | temperature | is_anomaly | lower_bound        | upper_bound        | anomaly_probability | pm25       | wind_speed |
      +----------------------------------------------------------------------------------------------------------------------------------------------+
      | 2023-02-01 00:00:00 UTC | 44.0        | true       | 36.89918003713138  | 41.8044385511539   | 0.88975675709801583 | 8.8166665  | 1.6525     |
      +----------------------------------------------------------------------------------------------------------------------------------------------+
      | 2023-02-02 00:00:00 UTC | 40.5        | false      | 34.439946284051572 | 40.672021330796483 | 0.57358239699845348 | 11.8354165 | 1.558333   |
      +--------------------------------------------------------------------------------------------------------------------+-------------------------+
      | 2023-02-03 00:00:00 UTC | 46.5        | true       | 33.615139992931191 | 40.501364463964549 | 0.97902867696346974 | 10.1395835 | 1.6895835  |
      +-------------------------+-------------+------------+--------------------+--------------------+---------------------+-------------------------+
      

    Effectuer un nettoyage

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.