Ajusta un modelo de serie temporal univariante a millones de series temporales


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.

En este instructivo, aprenderás a acelerar de manera significativa el entrenamiento de un modelo de serie temporal univariante para realizar previsiones.

En este instructivo, se realizan previsiones para varias series temporales. Los valores previstos se calculan para cada período y para cada valor en una o más columnas especificadas. Por ejemplo, si deseas pronosticar el clima y especificas una columna que contiene datos de la ciudad, los datos pronosticados contendrán pronósticos para todos los momentos de la ciudad A, luego los valores pronosticados para todos los momentos de la ciudad B, y así sucesivamente.

En este instructivo, se usan datos de las tablas públicas bigquery-public-data.new_york.citibike_trips y iowa_liquor_sales.sales. Los datos de los viajes en bicicleta solo contienen unos cientos de series temporales, por lo que se usan para ilustrar varias estrategias que aceleran el entrenamiento de modelos. Los datos de ventas de licores tienen más de 1 millón de series temporales, por lo que se usan para mostrar la previsión de series temporales a gran escala.

Antes de leer este instructivo, debes leer Cómo realizar una previsión de varias series temporales con un modelo univariante y 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 las funciones ML.FORECAST ni ML.EXPLAIN_FORECAST para generar previsiones. Para aprender a usar esas funciones, consulta Cómo realizar previsiones de varias series temporales con un modelo univariado.

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. 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. Make sure that billing is enabled for your Google Cloud project.

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

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

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

    Enable the BigQuery API.

    Enable the API

Permisos necesarios

  • Para crear el conjunto de datos, necesitas el permiso bigquery.datasets.create de IAM.
  • Para crear el recurso de conexión, necesitas los siguientes permisos:

    • bigquery.connections.create
    • bigquery.connections.get
  • Para crear el modelo, necesitas los siguientes permisos:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.connections.delegate
  • 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.

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

Crea una tabla de datos de entrada

La sentencia SELECT de la siguiente 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.

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

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

Crea un modelo para varias series temporales con parámetros predeterminados

Quieres pronosticar la cantidad de viajes en bicicleta para cada estación de Citi Bike, lo que requiere muchos modelos de series temporales, uno para cada estación de Citi Bike que se incluye en los datos de entrada. Puedes escribir varias consultas de CREATE MODEL para hacerlo, pero puede ser un proceso tedioso y lento, en especial cuando tienes una gran cantidad de series temporales. En su lugar, puedes usar una sola consulta para crear y ajustar un conjunto de modelos de series temporales para predecir varias series temporales a la vez.

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. La opción time_series_timestamp_col especifica la columna que contiene las series temporales, la opción time_series_data_col especifica la columna para la que se debe realizar el pronóstico y time_series_id_col especifica una o más dimensiones para las que deseas crear series temporales.

En este ejemplo , se omiten los puntos temporales de las series temporales posteriores al 1 de junio de 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.

Sigue estos pasos para crear el modelo:

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

    La consulta tarda unos 15 minutos en completarse.

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

Evalúa la exactitud de la previsión del modelo con la función ML.EVALUATE.

Sigue estos pasos para evaluar el modelo:

  1. En la consola de Google Cloud, ve a la página de 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.nyc_citibike_arima_model_default`,
      TABLE `bqml_tutorial.nyc_citibike_time_series`,
      STRUCT(7 AS horizon, TRUE AS perform_aggregation));

    Esta consulta informa varias métricas de previsión, incluidas las siguientes:

    Los resultados deberían ser similares a los siguientes: Métricas de evaluación para el modelo de series temporales.

    La cláusula TABLE en la función ML.EVALUATE identifica una tabla que contiene los datos de verdad fundamental. Los resultados de la previsión se comparan con los datos de verdad fundamental para calcular las métricas de precisión. En este caso, nyc_citibike_time_series contiene los puntos de series temporales anteriores y posteriores al 1 de junio de 2016. Los puntos posteriores al 1 de junio de 2016 son los datos de verdad fundamental. Los puntos anteriores al 1 de junio de 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 1 de junio de 2016. Los puntos anteriores al 1 de junio de 2016 se ignoran en el cálculo de las métricas.

    La cláusula STRUCT en la función ML.EVALUATE especifica los parámetros para la función. El valor de horizon es 7, lo que significa que la consulta calcula la exactitud de la previsión en función de una previsión de siete puntos. Ten en cuenta que, si los datos de verdad fundamental tienen menos de siete puntos para la comparación, las métricas de exactitud se calculan solo en función de los puntos disponibles. El valor de perform_aggregation es 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 un valor perform_aggregation de FALSE, se muestra la exactitud de la previsión para cada punto temporal previsto.

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

Evalúa la exactitud general de las previsiones

Evalúa la exactitud de la previsión de las 383 series temporales.

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.

Sigue estos pasos para evaluar el modelo:

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

    Ir a BigQuery

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

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

Esta consulta muestra un valor MAPE de 0.3471 y un valor sMAPE de 0.2563.

Crea un modelo para realizar una previsión de varias series temporales con un espacio de búsqueda de hiperparámetros más pequeño

En la sección Crea un modelo para varias series temporales con parámetros predeterminados, usaste los valores predeterminados para todas las opciones de entrenamiento, incluida la opción 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 el modelo creado por la siguiente consulta, usas un espacio de búsqueda más pequeño para los hiperparámetros cambiando el valor de la opción auto_arima_max_order del valor predeterminado 5 a 2.

Sigue estos pasos para evaluar el modelo:

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

    La consulta tarda unos 2 minutos en completarse. Recuerda que el modelo anterior tardaba alrededor de 15 minutos en completarse cuando el valor de auto_arima_max_order era 5, por lo que este cambio mejora la velocidad de entrenamiento de modelos en alrededor de 7 veces. Si te preguntas por qué el aumento de velocidad no es 5/2=2.5x, esto se debe a que, cuando aumenta el valor de auto_arima_max_order, no solo aumenta la cantidad de modelos candidatos, sino también la complejidad. Esto hace que aumente el tiempo de entrenamiento del modelo.

Evalúa la exactitud de la previsión de un modelo con un espacio de búsqueda de hiperparámetros más pequeño

Sigue estos pasos para evaluar el modelo:

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

    Ir a BigQuery

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

    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 un valor MAPE de 0.3337 y un valor sMAPE de 0.2337.

En la sección Evalúa la exactitud general de la previsión, evaluaste un modelo con un espacio de búsqueda de hiperparámetros más grande, en el que el valor de la opción auto_arima_max_order es 5. Esto generó un valor MAPE de 0.3471 y un valor sMAPE de 0.2563. En este caso, puedes ver que 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.

Crea un modelo para predecir varias series temporales 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 inteligente 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 el siguiente ejemplo, se usa la opción max_time_series_length para lograr un entrenamiento rápido. Si estableces el valor de la opción max_time_series_length en 30, solo se usan los 30 puntos temporales más recientes para modelar el componente de tendencia. Aún se usan las 383 series temporales para modelar los componentes distintos de la tendencia.

Sigue estos pasos para crear el modelo:

  1. En la consola de Google Cloud, ve a la página de 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.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 consulta tarda unos 35 segundos en completarse. Esto es 3 veces más rápido en comparación con la consulta que usaste en la sección Crea un modelo para pronosticar varias series temporales con un espacio de búsqueda de hiperparámetros más pequeño. 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, el aumento de velocidad es mucho mayor cuando la cantidad de series temporales es mucho mayor que en este ejemplo. Para un millón de series temporales, el aumento de velocidad se aproxima a la proporción de la longitud de la serie temporal y el valor de la opción max_time_series_length. En ese caso, la velocidad es mayor que 10 veces.

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

Sigue estos pasos para evaluar el modelo:

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

    Ir a BigQuery

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

    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 un valor MAPE de 0.3515 y un valor sMAPE de 0.2473.

Recuerda que, sin el uso de estrategias de entrenamiento rápido, la exactitud de la previsión genera un valor de MAPE de 0.3337 y un valor de 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 usan los modelos 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.

Crea un modelo para pronosticar 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. El entrenamiento de modelos usa un espacio de búsqueda de hiperparámetros pequeño y la estrategia de entrenamiento rápido inteligente.

Sigue estos pasos para evaluar el modelo:

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

    La consulta tarda alrededor de 1 hora y 16 minutos en completarse.

Realiza una limpieza

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

¿Qué sigue?