Previsión de varias series temporales con un modelo multivariante

En este tutorial se explica cómo usar un modelo de serie temporal multivariante para predecir el valor futuro de una columna determinada en función del valor histórico de varias funciones de entrada.

En este tutorial se hacen previsiones de varias series temporales. Los valores previstos se calculan para cada punto temporal y para cada valor de una o varias columnas especificadas. Por ejemplo, si quieres predecir el tiempo y especificas una columna que contenga datos de estados, los datos previstos incluirán las previsiones de todos los puntos temporales del estado A, los valores previstos de todos los puntos temporales del estado B, etc. Si quieres predecir el tiempo y has especificado columnas que contienen datos de estado y ciudad, los datos previstos incluirán previsiones para todos los puntos temporales del estado A y la ciudad A, después los valores previstos para todos los puntos temporales del estado A y la ciudad B, y así sucesivamente.

En este tutorial se usan datos de las tablas públicas bigquery-public-data.iowa_liquor_sales.sales y bigquery-public-data.covid19_weathersource_com.postal_code_day_history. La tabla bigquery-public-data.iowa_liquor_sales.sales contiene datos de ventas de bebidas alcohólicas recogidos de varias ciudades del estado de Iowa. La tabla bigquery-public-data.covid19_weathersource_com.postal_code_day_history contiene datos meteorológicos históricos, como la temperatura y la humedad, de todo el mundo.

Antes de leer este tutorial, te recomendamos que leas el artículo Previsión de una serie temporal con un modelo multivariante.

Crear conjunto de datos

Crea un conjunto de datos de BigQuery para almacenar tu modelo de aprendizaje automático.

Consola

  1. En la Cloud de Confiance consola, 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. Haga 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, introduce bqml_tutorial.

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

    • Deje el resto de los ajustes predeterminados como están y haga clic en Crear conjunto de datos.

bq

Para crear un conjunto de datos, usa el comando bq mk con la marca --location. Para ver 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 definida como US y la descripción 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 omite -d y --dataset, el comando creará un conjunto de datos de forma predeterminada.

  2. Confirma que se ha 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"
  }
}

BigQuery DataFrames

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican 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 los DataFrames de BigQuery.

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

import google.cloud.bigquery

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

Crear una tabla de datos de entrada

Crea una tabla de datos que puedas usar para entrenar y evaluar el modelo. Esta tabla combina columnas de las tablas bigquery-public-data.iowa_liquor_sales.sales y bigquery-public-data.covid19_weathersource_com.postal_code_day_history para analizar cómo afecta el tiempo al tipo y al número de artículos pedidos por las licorerías. También puede crear las siguientes columnas adicionales que puede usar como variables de entrada del modelo:

  • date: la fecha del pedido
  • store_number: número único de la tienda que ha realizado el pedido
  • item_number: número único del artículo que se ha pedido
  • bottles_sold: número de botellas pedidas del artículo asociado
  • temperature: la temperatura media en la ubicación de la tienda en la fecha del pedido.
  • humidity: la humedad media en la ubicación de la tienda en la fecha del pedido.

Sigue estos pasos para crear la tabla de datos de entrada:

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

    Ir a BigQuery

  2. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    CREATE OR REPLACE TABLE
      `bqml_tutorial.iowa_liquor_sales_with_weather` AS
    WITH
      sales AS (
        SELECT
          DATE,
          store_number,
          item_number,
          bottles_sold,
          SAFE_CAST(SAFE_CAST(zip_code AS FLOAT64) AS INT64) AS zip_code
        FROM
          `bigquery-public-data.iowa_liquor_sales.sales` AS sales
        WHERE
          SAFE_CAST(zip_code AS FLOAT64) IS NOT NULL
      ),
      aggregated_sales AS (
        SELECT
          DATE,
          store_number,
          item_number,
          ANY_VALUE(zip_code) AS zip_code,
          SUM(bottles_sold) AS bottles_sold,
        FROM
          sales
        GROUP BY
          DATE,
          store_number,
          item_number
      ),
      weather AS (
        SELECT
          DATE,
          SAFE_CAST(postal_code AS INT64) AS zip_code,
          avg_temperature_air_2m_f AS temperature,
          avg_humidity_specific_2m_gpkg AS humidity,
        FROM
          `bigquery-public-data.covid19_weathersource_com.postal_code_day_history`
        WHERE
          country = 'US' AND
          SAFE_CAST(postal_code AS INT64) IS NOT NULL
      )
    SELECT
      aggregated_sales.date,
      aggregated_sales.store_number,
      aggregated_sales.item_number,
      aggregated_sales.bottles_sold,
      weather.temperature AS temperature,
      weather.humidity AS humidity
    FROM
      aggregated_sales
      LEFT JOIN weather ON aggregated_sales.zip_code=weather.zip_code
      AND aggregated_sales.DATE=weather.DATE;

Crear el modelo de serie temporal

Crea un modelo de serie temporal para predecir las botellas vendidas de cada combinación de ID de tienda e ID de artículo, para cada fecha de la tabla bqml_tutorial.iowa_liquor_sales_with_weather anterior al 1 de septiembre del 2022. Usa la temperatura y la humedad medias de la tienda en cada fecha como características que evaluar durante la previsión. En la tabla bqml_tutorial.iowa_liquor_sales_with_weather hay aproximadamente 1 millón de combinaciones distintas de número de artículo y número de tienda, lo que significa que hay 1 millón de series temporales diferentes que predecir.

Sigue estos pasos para crear el modelo:

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

    Ir a BigQuery

  2. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    CREATE
    OR REPLACE MODEL `bqml_tutorial.multi_time_series_arimax_model`
    OPTIONS(
      model_type = 'ARIMA_PLUS_XREG',
      time_series_id_col = ['store_number', 'item_number'],
      time_series_data_col = 'bottles_sold',
      time_series_timestamp_col = 'date'
    )
    AS SELECT
      *
    FROM
      `bqml_tutorial.iowa_liquor_sales_with_weather`
    WHERE
      DATE < DATE('2022-09-01');

    La consulta tarda unos 38 minutos en completarse. Después, podrás acceder al modelo multi_time_series_arimax_model. Como la consulta usa una instrucción CREATE MODEL para crear un modelo, no se muestran resultados de la consulta.

Usar el modelo para predecir datos

Prevé valores futuros de series temporales con la función ML.FORECAST.

En la siguiente consulta de GoogleSQL, la cláusula STRUCT(5 AS horizon, 0.8 AS confidence_level) indica que la consulta pronostica 5 puntos temporales futuros y genera un intervalo de predicción con un nivel de confianza del 80 %.

La firma de datos de los datos de entrada de la función ML.FORECAST es la misma que la de los datos de entrenamiento que has usado para crear el modelo. La columna bottles_sold no se incluye en la entrada porque son los datos que el modelo intenta predecir.

Sigue estos pasos para predecir datos con el modelo:

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

    Ir a BigQuery

  2. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    SELECT
      *
    FROM
      ML.FORECAST (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        STRUCT (5 AS horizon, 0.8 AS confidence_level),
        (
          SELECT
            * EXCEPT (bottles_sold)
          FROM
            `bqml_tutorial.iowa_liquor_sales_with_weather`
          WHERE
            DATE>=DATE('2022-09-01')
        )
      );

    Los resultados deberían ser similares a los siguientes:

    Datos previstos del número de botellas vendidas.

    Las filas de salida se ordenan por el valor de store_number, después por el valor de item_ID y, por último, por el valor de la columna forecast_timestamp en orden cronológico. En la previsión de series temporales, el intervalo de predicción, representado por los valores de las columnas prediction_interval_lower_bound y prediction_interval_upper_bound, es tan importante como el valor de la columna forecast_value. El valor forecast_value es el punto medio del intervalo de predicción. El intervalo de predicción depende de los valores de las columnas standard_error y confidence_level.

    Para obtener más información sobre las columnas de salida, consulta ML.FORECAST.

Explicar los resultados de las previsiones

Puede obtener métricas de interpretabilidad además de datos de previsión mediante la función ML.EXPLAIN_FORECAST. La función ML.EXPLAIN_FORECAST predice los valores de series temporales futuras y también devuelve todos los componentes independientes de la serie temporal.

Al igual que la función ML.FORECAST, la cláusula STRUCT(5 AS horizon, 0.8 AS confidence_level) utilizada en la función ML.EXPLAIN_FORECAST indica que la consulta pronostica 30 puntos temporales futuros y genera un intervalo de predicción con una confianza del 80 %.

La función ML.EXPLAIN_FORECAST proporciona datos históricos y previsiones. Para ver solo los datos de previsión, añade la opción time_series_type a la consulta y especifica forecast como valor de la opción.

Sigue estos pasos para explicar los resultados del modelo:

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

    Ir a BigQuery

  2. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    SELECT
      *
    FROM
      ML.EXPLAIN_FORECAST (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        STRUCT (5 AS horizon, 0.8 AS confidence_level),
        (
          SELECT
            * EXCEPT (bottles_sold)
          FROM
            `bqml_tutorial.iowa_liquor_sales_with_weather`
          WHERE
            DATE >= DATE('2022-09-01')
        )
      );

    Los resultados deberían ser similares a los siguientes:

    Las nueve primeras columnas de salida de los datos previstos y las explicaciones de las previsiones. Las columnas de salida de la décima a la decimoséptima, que contienen datos previstos y explicaciones de las previsiones. Las seis últimas columnas de resultados de datos previstos y explicaciones de las previsiones.

    Las filas de salida se ordenan cronológicamente por el valor de la columna time_series_timestamp.

    Para obtener más información sobre las columnas de salida, consulta ML.EXPLAIN_FORECAST.

Evaluar la precisión de las previsiones

Evalúa la precisión de las previsiones del modelo ejecutándolo con datos con los que no se ha entrenado. Para ello, puedes usar la función ML.EVALUATE. La función ML.EVALUATE evalúa cada serie temporal de forma independiente.

En la siguiente consulta de GoogleSQL, la segunda instrucción SELECT proporciona los datos con las funciones futuras, que se usan para predecir los valores futuros y compararlos con los datos reales.

Sigue estos pasos para evaluar la precisión del modelo:

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

    Ir a BigQuery

  2. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    SELECT
      *
    FROM
      ML.EVALUATE (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        (
          SELECT
            *
          FROM
           `bqml_tutorial.iowa_liquor_sales_with_weather`
          WHERE
            DATE >= DATE('2022-09-01')
        )
      );

    Los resultados deberían ser similares a los siguientes:

    Métricas de evaluación del modelo.

    Para obtener más información sobre las columnas de salida, consulta ML.EVALUATE.

Usar el modelo para detectar anomalías

Detecta anomalías en los datos de entrenamiento mediante la función ML.DETECT_ANOMALIES.

En la siguiente consulta, la cláusula STRUCT(0.95 AS anomaly_prob_threshold) hace que la función ML.DETECT_ANOMALIES identifique los puntos de datos anómalos con un nivel de confianza del 95 %.

Sigue estos pasos para detectar anomalías en los datos de entrenamiento:

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

    Ir a BigQuery

  2. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    SELECT
      *
    FROM
      ML.DETECT_ANOMALIES (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        STRUCT (0.95 AS anomaly_prob_threshold)
      );

    Los resultados deberían ser similares a los siguientes:

    Información de detección de anomalías de los datos de entrenamiento.

    La columna anomaly_probability de los resultados identifica la probabilidad de que un valor de la columna bottles_sold sea anómalo.

    Para obtener más información sobre las columnas de salida, consulta ML.DETECT_ANOMALIES.

Detectar anomalías en los datos nuevos

Detecta anomalías en los datos nuevos proporcionando datos de entrada a la función ML.DETECT_ANOMALIES. Los datos nuevos deben tener la misma firma de datos que los datos de entrenamiento.

Sigue estos pasos para detectar anomalías en los datos nuevos:

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

    Ir a BigQuery

  2. En el editor de consultas, pega la siguiente consulta y haz clic en Ejecutar:

    SELECT
      *
    FROM
      ML.DETECT_ANOMALIES (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        STRUCT (0.95 AS anomaly_prob_threshold),
        (
          SELECT
            *
          FROM
            `bqml_tutorial.iowa_liquor_sales_with_weather`
          WHERE
            DATE >= DATE('2022-09-01')
        )
      );

    Los resultados deberían ser similares a los siguientes:

    Información sobre la detección de anomalías en los datos nuevos.