Previsión escalable con millones de series temporales en BigQuery


En este instructivo aprenderás a acelerar de manera significativa el entrenamiento de un conjunto de modelos de series temporales para realizar varias previsiones de series temporales con una sola consulta. También aprenderás a evaluar la exactitud de la previsión.

Para todos los pasos, excepto el último, usarás los datos de new_york.citibike_trips. Estos datos contienen información sobre los viajes de Citi Bike en la ciudad de Nueva York. Este conjunto de datos solo contiene unos cientos de series temporales. Se usa para ilustrar varias estrategias a fin de acelerar el entrenamiento de modelos. En el último paso, usarás datos de iowa_liquor_sales.sales para prever más de 1 millón de series temporales.

Antes de leer este instructivo, debes leer Realiza una previsión de varias series temporales con una sola consulta a partir de los datos de viajes de Citi Bike en NYC. También debes leer Prácticas recomendadas para la previsión de series temporales a gran escala.

Objetivos

En este instructivo usarás lo siguiente:

Para que sea más simple, en este instructivo no se explica cómo usar ML.FORECAST ni ML.EXPLAIN_FORECAST a fin de generar previsiones (explicables). Para aprender a usar esas funciones, consulta Realiza una previsión de varias series temporales con una sola consulta a partir de los datos de viajes de Citi Bike en NYC.

Costos

En este instructivo se usan componentes facturables de Google Cloud, que incluyen los siguientes:

  • BigQuery
  • BigQuery ML

Para obtener más información sobre los costos, consulta la página de precios de BigQuery y la página de precios de BigQuery ML.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  5. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  6. BigQuery se habilita de forma automática en proyectos nuevos. Para activar BigQuery en un proyecto existente, ve a

    Habilita la API de BigQuery.

    Habilita la API

Paso uno: Crea un conjunto de datos

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

  1. En la consola de Google Cloud, ve a la página de 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.

    Crea un 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).

      Los conjuntos de datos públicos se almacenan en la multirregión US. Para que sea más simple, almacena tu conjunto de datos en la misma ubicación.

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

      Página Crear un conjunto de datos

Paso dos: Crea una serie temporal para prever

En la siguiente consulta, la cláusula FROM bigquery-public-data.new_york.citibike_trips indica que consultas la tabla citibike_trips en el conjunto de datos new_york.

CREATE OR REPLACE TABLE
  `bqml_tutorial.nyc_citibike_time_series` AS
WITH input_time_series AS
(
  SELECT
    start_station_name,
    EXTRACT(DATE FROM starttime) AS date,
    COUNT(*) AS num_trips
  FROM
    `bigquery-public-data.new_york.citibike_trips`
  GROUP BY
    start_station_name, date
)
SELECT table_1.*
FROM input_time_series AS table_1
INNER JOIN (
  SELECT start_station_name,  COUNT(*) AS num_points
  FROM input_time_series
  GROUP BY start_station_name) table_2
ON
  table_1.start_station_name = table_2.start_station_name
WHERE
  num_points > 400

Para ejecutar la consulta, sigue estos pasos:

  1. En la consola de Google Cloud, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la consulta de GoogleSQL anterior en el área de texto del Editor de consultas.

  3. Haz clic en Ejecutar.

La declaración SELECT en la consulta usa la función EXTRACT para extraer la información de la fecha de la columna starttime. La consulta usa la cláusula COUNT(*) para obtener la cantidad total diaria de viajes con Citi Bike.

table_1 tiene 679 series temporales. La consulta usa la lógica adicional INNER JOIN para seleccionar todas las series temporales que tienen más de 400 puntos temporales, lo que da como resultado un total de 383 series temporales.

Paso tres: Realiza una previsión simultánea de varias series temporales con parámetros predeterminados

En este paso, prevés la cantidad total diaria de viajes que comienzan en diferentes estaciones de Citi Bike. Para ello debes prever muchas series temporales. Podrías escribir varias consultas CREATE MODEL, pero puede ser un proceso tedioso y lento, en especial cuando tienes una gran cantidad de series temporales.

A fin de mejorar este proceso, BigQuery ML te permite crear un conjunto de modelos de series temporales para prever varias series temporales mediante una sola consulta. Además, todos los modelos de series temporales se ajustan de forma simultánea.

En la siguiente consulta de Google SQL, la cláusula CREATE MODEL crea y entrena un conjunto de modelos llamado bqml_tutorial.nyc_citibike_arima_model_default.

CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_default`
OPTIONS
  (model_type = 'ARIMA_PLUS',
   time_series_timestamp_col = 'date',
   time_series_data_col = 'num_trips',
   time_series_id_col = 'start_station_name'
  ) AS
SELECT *
FROM bqml_tutorial.nyc_citibike_time_series
WHERE date < '2016-06-01'

A fin de ejecutar la consulta CREATE MODEL para crear y entrenar el modelo, sigue estos pasos:

  1. En la consola de Google Cloud, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la consulta de GoogleSQL anterior en el área de texto del Editor de consultas.

  3. Haz clic en Ejecutar.

    La consulta toma unos 14 minutos y 25 segundos en completarse.

La cláusula OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) indica que creas un conjunto de modelos de serie temporal ARIMA_PLUS basados en ARIMA. Además de time_series_timestamp_col y time_series_data_col, debes especificar time_series_id_col, que se usa para anotar series temporales de entrada diferentes.

En este ejemplo, se omiten los puntos temporales de las series temporales posteriores al 01/06/2016 para que esos puntos temporales se puedan usar a fin de evaluar la exactitud de la previsión más adelante con la función ML.EVALUATE.

Paso cuatro: Evalúa la exactitud de la previsión para cada serie temporal

En este paso, evalúas la exactitud de la previsión de cada serie temporal mediante la siguiente consulta ML.EVALUATE.

SELECT *
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`,
              TABLE `bqml_tutorial.nyc_citibike_time_series`,
              STRUCT(7 AS horizon, TRUE AS perform_aggregation))

Para ejecutar la consulta anterior, sigue estos pasos:

  1. En la consola de Google Cloud, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la consulta de GoogleSQL anterior en el área de texto del Editor de consultas.

  3. Haz clic en Ejecutar. Esta consulta informa varias métricas de previsión, incluidas las siguientes:

    Los resultados deberían verse de la siguiente manera:ML.EVALUATE output1.

ML.EVALUATE toma el modelo ARIMA_PLUS que se entrenó en el paso anterior como su primer argumento.

El segundo argumento es una tabla de datos que contiene los datos de verdad fundamental. Estos resultados de previsión se comparan con los datos de verdad fundamental a fin de calcular las métricas de precisión. En este caso, nyc_citibike_time_series contiene los puntos de series temporales anteriores al 01/06/2016 y posteriores al 01/06/2016. Los puntos posteriores al 01/06/2016 son los datos de verdad fundamental. Los puntos anteriores al 01/06/2016 se usan para entrenar el modelo a fin de generar previsiones después de esa fecha. Para calcular las métricas, solo se necesitan los puntos posteriores al 01/06/2016. Los puntos anteriores al 01/06/2016 se ignoran en el cálculo de las métricas.

El tercer argumento es un STRUCT, que contiene dos parámetros. El horizonte es 7, lo que significa que la consulta calcula la exactitud de la previsión en función de la previsión de 7 puntos. Ten en cuenta que, si los datos de verdad fundamental tienen menos de 7 puntos para la comparación, las métricas de exactitud se calculan solo en función de los puntos disponibles. perform_aggregation tiene un valor de TRUE, lo que significa que las métricas de exactitud de la previsión son una agregación de las métricas de los puntos temporales. Si especificas perform_aggregation como FALSE, se muestra la exactitud de la previsión para cada punto temporal previsto.

Paso cinco: Evalúa la exactitud general de la previsión para todas las series temporales

En este paso, evalúas la exactitud de la previsión de las 383 series temporales mediante la siguiente consulta:

SELECT
  AVG(mean_absolute_percentage_error) AS MAPE,
  AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`,
              TABLE `bqml_tutorial.nyc_citibike_time_series`,
              STRUCT(7 AS horizon, TRUE AS perform_aggregation))

De las métricas de previsión que muestra ML.EVALUATE, solo el error porcentual absoluto medio y el error porcentual absoluto medio simétrico son independientes del valor de la serie temporal. Por lo tanto, para evaluar la exactitud total de la previsión del conjunto de series temporales, solo la agregación de estas dos métricas es relevante.

Esta consulta muestra los siguientes resultados: MAPE es 0.3471 y sMAPE es 0.2563.

Paso seis: Realiza una previsión de muchas series temporales al mismo tiempo mediante un espacio de búsqueda de hiperparámetros más pequeño

En el paso tres, usamos los valores predeterminados para todas las opciones de entrenamiento, incluida auto_arima_max_order. Esta opción controla el espacio de búsqueda para el ajuste de hiperparámetros en el algoritmo auto.ARIMA.

En este paso, usarás un espacio de búsqueda más pequeño para los hiperparámetros.

CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model_max_order_2
OPTIONS
  (model_type = 'ARIMA_PLUS',
   time_series_timestamp_col = 'date',
   time_series_data_col = 'num_trips',
   time_series_id_col = 'start_station_name',
   auto_arima_max_order = 2
  ) AS
SELECT *
FROM bqml_tutorial.nyc_citibike_time_series
WHERE date < '2016-06-01'

Esta consulta reduce auto_arima_max_order de 5 (el valor predeterminado) a 2.

Para ejecutar la consulta, sigue estos pasos:

  1. En la consola de Google Cloud, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la consulta de GoogleSQL anterior en el área de texto del Editor de consultas.

  3. Haz clic en Ejecutar.

    La consulta tarda alrededor de 1 minuto y 45 segundos en completarse. Recuerda que la consulta tarda 14 min y 25 s en completarse si auto_arima_max_order es 5. Por lo tanto, la velocidad aumenta alrededor de 7 veces si configuras auto_arima_max_order como 2. Si te preguntas por qué el aumento de velocidad no es 5/2=2.5x, esto se debe a que, cuando se aumenta el orden de auto_arima_max_order, no solo aumenta la cantidad de modelos candidatos, sino también la complejidad, por lo que aumenta el tiempo de entrenamiento de los modelos.

Paso siete: Evalúa la exactitud de la previsión en función de un espacio de búsqueda de hiperparámetros más pequeño

SELECT
  AVG(mean_absolute_percentage_error) AS MAPE,
  AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2`,
              TABLE `bqml_tutorial.nyc_citibike_time_series`,
              STRUCT(7 AS horizon, TRUE AS perform_aggregation))

Esta consulta muestra los siguientes resultados: MAPE es 0.3337 y sMAPE es 0.2337.

En el paso cinco, mediante un espacio de búsqueda de hiperparámetros más grande, auto_arima_max_order = 5, los resultados fueron un MAPE de 0.3471 y un sMAPE de 0.2563. Por lo tanto, en este caso, un espacio de búsqueda de hiperparámetros más pequeño proporciona una exactitud de previsión más alta. Un motivo es que el algoritmo auto.ARIMA solo realiza el ajuste de hiperparámetros para el módulo de tendencia de toda la canalización de modelado. Es posible que el mejor modelo ARIMA que selecciona el algoritmo auto.ARIMA no genere los mejores resultados de previsión para toda la canalización.

Paso ocho: Realiza una previsión de muchas series temporales al mismo tiempo con un espacio de búsqueda de hiperparámetros más pequeño y estrategias de entrenamiento rápido inteligentes

En este paso, usarás un espacio de búsqueda de hiperparámetros más pequeño y la estrategia de entrenamiento rápido inteligentes mediante una o más de las opciones de entrenamiento max_time_series_length, max_time_series_length o time_series_length_fraction.

Si bien el modelado periódico, como la estacionalidad, requiere una cierta cantidad de puntos temporales, el modelado de tendencias requiere menos puntos temporales. Por otra parte, el modelado de tendencias es mucho más costoso desde el punto de vista del procesamiento que otros componentes de las series temporales, como la estacionalidad. Si usas las opciones de entrenamiento rápido anteriores, puedes modelar de manera eficiente el componente de tendencia con un subconjunto de las series temporales, mientras que los otros componentes de series temporales usan todas las series temporales.

En este ejemplo, se usa max_time_series_length para lograr un entrenamiento rápido.

CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training`
OPTIONS
  (model_type = 'ARIMA_PLUS',
   time_series_timestamp_col = 'date',
   time_series_data_col = 'num_trips',
   time_series_id_col = 'start_station_name',
   auto_arima_max_order = 2,
   max_time_series_length = 30
  ) AS
SELECT *
FROM `bqml_tutorial.nyc_citibike_time_series`
WHERE date < '2016-06-01'

La opción max_time_series_length tiene un valor de 30, por lo que, para cada una de las 383 series temporales, solo se usan los 30 puntos temporales más recientes a fin de modelar el componente de tendencia. Aún se usan todas las series temporales para modelar los componentes distintos de la tendencia.

Para ejecutar la consulta, sigue estos pasos:

  1. En la consola de Google Cloud, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la consulta de GoogleSQL anterior en el área de texto del Editor de consultas.

  3. Haz clic en Ejecutar.

    La consulta tarda unos 35 segundos en completarse. Esto es 3 veces más rápido en comparación con la consulta de entrenamiento que no usa la estrategia de entrenamiento rápido (es decir, tarda 1 minuto y 45 segundos). Ten en cuenta que, debido a la sobrecarga de tiempo constante para la parte de la consulta que no es de entrenamiento, como el procesamiento previo de los datos, entre otros, el aumento de velocidad será mucho mayor cuando la cantidad de series temporales sea muy superior a la de este caso. Para un millón de series temporales, el aumento de velocidad se aproximará a la proporción de la longitud de la serie temporal y el valor de max_time_series_length. En este caso, la velocidad será mayor que 10 veces.

Paso nueve: Evalúa la exactitud de la previsión de un modelo con un espacio de búsqueda de hiperparámetros más pequeño y estrategias de entrenamiento rápido inteligentes

SELECT
  AVG(mean_absolute_percentage_error) AS MAPE,
  AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training`,
              TABLE `bqml_tutorial.nyc_citibike_time_series`,
              STRUCT(7 AS horizon, TRUE AS perform_aggregation))

Esta consulta muestra los siguientes resultados: MAPE es 0.3515 y sMAPE es 0.2473.

Recuerda que sin el uso de estrategias de entrenamiento rápido, los resultados de la exactitud de la previsión son un MAPE de 0.3337 y un sMAPE de 0.2337. La diferencia entre los dos conjuntos de valores de métricas se encuentra dentro del 3%, lo que es insignificante en términos estadísticos.

En resumen, usaste un espacio de búsqueda de hiperparámetros más pequeño y estrategias de entrenamiento rápido inteligentes para que tu entrenamiento de modelos sea 20 veces más rápido sin sacrificar la exactitud de la previsión. Como se mencionó antes, con más series temporales, el aumento de velocidad que logran las estrategias de entrenamiento rápido inteligentes puede ser mucho mayor. Además, la biblioteca ARIMA subyacente que usa ARIMA_PLUS se optimizó para ejecutarse 5 veces más rápido que antes. En conjunto, estos beneficios permiten la previsión de millones de series temporales en cuestión de horas.

Paso diez: Prevé más de un millón de series temporales

En este paso, prevés las ventas de licores de más de 1 millón de productos de licores en diferentes tiendas mediante los datos públicos de ventas de licores de Iowa.

CREATE OR REPLACE MODEL
  `bqml_tutorial.liquor_forecast_by_product`
OPTIONS(
  MODEL_TYPE = 'ARIMA_PLUS',
  TIME_SERIES_TIMESTAMP_COL = 'date',
  TIME_SERIES_DATA_COL = 'total_bottles_sold',
  TIME_SERIES_ID_COL = ['store_number', 'item_description'],
  HOLIDAY_REGION = 'US',
  AUTO_ARIMA_MAX_ORDER = 2,
  MAX_TIME_SERIES_LENGTH = 30
) AS
SELECT
  store_number,
  item_description,
  date,
  SUM(bottles_sold) as total_bottles_sold
FROM
  `bigquery-public-data.iowa_liquor_sales.sales`
WHERE date BETWEEN DATE("2015-01-01") AND DATE("2021-12-31")
GROUP BY store_number, item_description, date

El entrenamiento de modelos aún usa un espacio de búsqueda de hiperparámetros pequeño y la estrategia de entrenamiento rápido inteligente. La consulta tarda alrededor de 1 hora y 16 minutos en completarse.

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

  • Puedes borrar el proyecto que creaste.
  • De lo contrario, puedes mantener el proyecto y borrar el conjunto de datos.

Borra tu conjunto de datos

Borrar tu proyecto quita todos sus conjuntos de datos y tablas. Si prefieres volver a usar el proyecto, puedes borrar el conjunto de datos que creaste en este instructivo:

  1. Si es necesario, abre la página de BigQuery en la consola de Google Cloud.

    Ir a la página de BigQuery

  2. En el panel de navegación, haz clic en el conjunto de datos bqml_tutorial que creaste.

  3. Haz clic en Borrar conjunto de datos para borrar el conjunto de datos, la tabla y todos los datos.

  4. En el cuadro de diálogo Borrar conjunto de datos, escribe el nombre del conjunto de datos (bqml_tutorial) para confirmar el comando de borrado y, luego, haz clic en Borrar.

Borra tu proyecto

Para borrar el proyecto, haz lo siguiente:

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

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

¿Qué sigue?