Realizar la detección de anomalías con un modelo de previsión de series temporales multivariable

En este instructivo, se muestra cómo realizar las siguientes tareas:

En este instructivo, se usan las siguientes tablas del conjunto de datos públicos epa_historical_air_quality, que contiene información diaria de PM 2.5, la temperatura y la velocidad del viento recopilada de varias ciudades de EE.UU.:

Permisos necesarios

  • Para crear el conjunto de datos, necesitas el permiso bigquery.datasets.create de IAM.

  • Para crear el modelo, necesitas los siguientes permisos:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • Para ejecutar inferencias, necesitas los siguientes permisos:

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

Para obtener más información sobre los roles y permisos de IAM en BigQuery, consulta Introducción a IAM.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

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

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.

Es posible que los usuarios de Google Cloud nuevos cumplan con los requisitos para acceder a una prueba gratuita.

Para obtener más información, consulte los Precios de BigQuery.

Antes de comenzar

  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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

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

  4. Enable the BigQuery API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

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

  7. Enable the BigQuery API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  8. Crea un conjunto de datos

    Crea un conjunto de datos de BigQuery para almacenar tu modelo de AA.

    Console

    1. En la consola de Google Cloud , ve a la página BigQuery.

      Ir a la página de BigQuery

    2. En el panel Explorador, haz clic en el nombre de tu proyecto.

    3. Haz clic en Ver acciones > Crear conjunto de datos.

    4. En la página Crear conjunto de datos, haz lo siguiente:

      • En ID del conjunto de datos, ingresa bqml_tutorial.

      • En Tipo de ubicación, selecciona Multirregión y, luego, EE.UU. (varias regiones en Estados Unidos).

      • Deja la configuración predeterminada restante como está y haz clic en Crear conjunto de datos.

    bq

    Para crear un conjunto de datos nuevo, usa el comando bq mk con la marca --location. Para obtener una lista completa de los parámetros posibles, consulta la referencia del comando bq mk --dataset.

    1. Crea un conjunto de datos llamado bqml_tutorial con la ubicación de los datos establecida en US y una descripción de BigQuery ML tutorial dataset:

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

      En lugar de usar la marca --dataset, el comando usa el acceso directo -d. Si omites -d y --dataset, el comando crea un conjunto de datos de manera predeterminada.

    2. Confirma que se haya creado el conjunto de datos:

      bq ls

    API

    Llama al método datasets.insert con un recurso de conjunto de datos definido.

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

    Permite trabajar con BigQuery DataFrames.

    Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de BigQuery DataFrames.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura ADC para un entorno de desarrollo local.

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

    Prepara los datos de entrenamiento

    Los datos de PM2.5, temperatura y velocidad del viento están en tablas separadas. Para crear la tabla bqml_tutorial.seattle_air_quality_daily de datos de entrenamiento, combina los datos de estas tablas públicas. bqml_tutorial.seattle_air_quality_daily contiene las siguientes columnas:

    • date: la fecha de la observación
    • PM2.5: el valor promedio de PM2.5 de cada día
    • wind_speed: la velocidad del viento promedio de cada día
    • temperature: la temperatura más alta de cada día

    La tabla nueva tiene datos diarios del 11 de agosto de 2009 al 31 de enero de 2022.

    1. Ve a la página de BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción de SQL:

      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)

    Crea el modelo

    Crea un modelo de serie temporal multivariable, con los datos de bqml_tutorial.seattle_air_quality_daily como datos de entrenamiento.

    1. Ve a la página de BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción de SQL:

      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";

      La consulta tarda varios segundos en completarse, después de eso, el modelo arimax_model aparece en el conjunto de datos bqml_tutorial y se puede acceder a él en el panel Explorador.

      Debido a que la consulta usa una declaración CREATE MODEL para crear un modelo, no hay resultados de consultas.

    Realiza la detección de anomalías en los datos históricos

    Ejecuta la detección de anomalías en los datos históricos que usaste para entrenar el modelo.

    1. Ve a la página de BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción de SQL:

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

      Los resultados son similares a los siguientes:

      +-------------------------+-------------+------------+--------------------+--------------------+---------------------+
      | 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   |
      +-------------------------+-------------+------------+--------------------+--------------------+---------------------+
      

    Realiza la detección de anomalías en los datos nuevos

    Ejecuta la detección de anomalías en los datos nuevos que generes.

    1. Ve a la página de BigQuery.

      Ir a BigQuery

    2. En el panel del editor de SQL, ejecuta la siguiente instrucción de SQL:

      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)
               ]
             )
           )
         );

      Los resultados son similares a los siguientes:

      +-------------------------+-------------+------------+--------------------+--------------------+---------------------+------------+------------+
      | 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  |
      +-------------------------+-------------+------------+--------------------+--------------------+---------------------+-------------------------+
      

    Limpia

    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.