Limitar los valores previstos de un modelo de serie temporal ARIMA_PLUS
En este tutorial se explica cómo usar los límites para acotar los resultados previstos que devuelve un modelo de serie temporal ARIMA_PLUS
. En este tutorial, creará dos modelos de serie temporal con los mismos datos: uno que usa límites y otro que no. De esta forma, puedes comparar los resultados devueltos por los modelos y entender la diferencia que supone especificar límites.
Usarás los datos de new_york.citibike_trips
para entrenar los modelos de este tutorial. Este conjunto de datos contiene información sobre los viajes de Citi Bike en Nueva York.
Antes de seguir este tutorial, debes familiarizarte con la previsión de series temporales individuales. Para obtener una introducción a este tema, consulta el tutorial Prever una serie temporal a partir de datos de Google Analytics.
Permisos obligatorios
Para crear el conjunto de datos, necesitas el permiso
bigquery.datasets.create
de gestión de identidades y accesos.Para crear el modelo, necesitas los siguientes permisos:
bigquery.jobs.create
bigquery.models.create
bigquery.models.getData
bigquery.models.updateData
Para ejecutar la inferencia, necesitas los siguientes permisos:
bigquery.models.getData
bigquery.jobs.create
Para obtener más información sobre los roles y permisos de gestión de identidades y accesos en BigQuery, consulta la introducción a la gestión de identidades y accesos.
Objetivos
En este tutorial, se usan los siguientes elementos:
- La instrucción
CREATE MODEL
para crear un modelo de serie temporal. - La función
ML.FORECAST
para predecir el total de visitas diarias.
Costes
En este tutorial se usan componentes facturables de Google Cloud, incluidos los siguientes:
- BigQuery
- BigQuery ML
Para obtener más información sobre los costes de BigQuery, consulta la página de precios de BigQuery.
Para obtener más información sobre los costes de BigQuery ML, consulta los precios de BigQuery ML.
Antes de empezar
- 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.
-
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles. -
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles. En la Google Cloud consola, ve a la página BigQuery.
En el panel Explorador, haz clic en el nombre de tu proyecto.
Haga clic en
Ver acciones > Crear conjunto de datos.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.
Crea un conjunto de datos llamado
bqml_tutorial
con la ubicación de los datos definida comoUS
y la descripciónBigQuery 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.Confirma que se ha creado el conjunto de datos:
bq ls
En la Google Cloud consola, haz clic en el botón Redactar nueva consulta.
Introduce la siguiente consulta de GoogleSQL en el editor de consultas.
#standardSQL SELECT EXTRACT(DATE from starttime) AS date, COUNT(*) AS num_trips FROM `bigquery-public-data`.new_york.citibike_trips GROUP BY date
Haz clic en Ejecutar. Los resultados de la consulta son similares a los siguientes.
Usa la Google Cloud consola para representar los datos de serie temporal. En el panel Resultados de la consulta, haz clic en la pestaña Visualización. En el panel Configuración de la visualización, elija Barra en Tipo de visualización:
En la Google Cloud consola, haz clic en el botón Redactar nueva consulta.
Introduce la siguiente consulta de GoogleSQL en el editor de consultas.
#standardSQL CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model OPTIONS ( model_type = 'ARIMA_PLUS', time_series_timestamp_col = 'date', time_series_data_col = 'num_trips', time_series_id_col = 'start_station_id') AS SELECT EXTRACT(DATE FROM starttime) AS date, COUNT(*) AS num_trips, start_station_id FROM `bigquery-public-data`.new_york.citibike_trips WHERE starttime > '2014-07-11' AND starttime < '2015-02-11' GROUP BY date, start_station_id;
Haz clic en Ejecutar.
La consulta tarda unos 80 segundos en completarse. Después, tu modelo (
nyc_citibike_arima_model
) aparecerá en el panel Explorador. Como la consulta usa una instrucciónCREATE MODEL
para crear un modelo, no hay resultados de consulta.En la Google Cloud consola, haz clic en el botón Redactar nueva consulta.
Introduce la siguiente consulta de GoogleSQL en el editor de consultas.
#standardSQL SELECT forecast_timestamp AS forecast_timestamp, start_station_id AS start_station_id, history_value AS history_value, forecast_value AS forecast_value FROM ( ( SELECT DATE(forecast_timestamp) AS forecast_timestamp, NULL AS history_value, forecast_value AS forecast_value, start_station_id AS start_station_id, FROM ML.FORECAST( MODEL bqml_tutorial.`nyc_citibike_arima_model`, STRUCT( 365 AS horizon, 0.9 AS confidence_level)) ) UNION ALL ( SELECT DATE(date_name) AS forecast_timestamp, num_trips AS history_value, NULL AS forecast_value, start_station_id AS start_station_id, FROM ( SELECT EXTRACT(DATE FROM starttime) AS date_name, COUNT(*) AS num_trips, start_station_id AS start_station_id FROM `bigquery-public-data`.new_york.citibike_trips WHERE starttime > '2014-07-11' AND starttime < '2015-02-11' GROUP BY date_name, start_station_id ) ) ) WHERE start_station_id = 79 ORDER BY forecast_timestamp, start_station_id
Haz clic en Ejecutar. Los resultados de la consulta son similares a los siguientes:
Usa la Google Cloud consola para representar los datos de serie temporal. En el panel Resultados de la consulta, haz clic en la pestaña Visualización:
En la Google Cloud consola, haz clic en el botón Redactar nueva consulta.
Introduce la siguiente consulta de GoogleSQL en el editor de consultas.
#standardSQL CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model OPTIONS ( model_type = 'ARIMA_PLUS', time_series_timestamp_col = 'date', time_series_data_col = 'num_trips', time_series_id_col = 'start_station_id', forecast_limit_lower_bound = 0) AS SELECT EXTRACT(DATE FROM starttime) AS date, COUNT(*) AS num_trips, start_station_id FROM `bigquery-public-data`.new_york.citibike_trips WHERE starttime > '2014-07-11' AND starttime < '2015-02-11' GROUP BY date, start_station_id;
Haz clic en Ejecutar.
La consulta tarda unos 100 segundos en completarse. Después, el modelo (
nyc_citibike_arima_model_with_limits
) aparece en el panel Explorador. Como la consulta usa una instrucciónCREATE MODEL
para crear un modelo, no hay resultados de consulta.En la Google Cloud consola, haz clic en el botón Redactar nueva consulta.
Introduce la siguiente consulta de GoogleSQL en el editor de consultas.
#standardSQL SELECT forecast_timestamp AS forecast_timestamp, start_station_id AS start_station_id, history_value AS history_value, forecast_value AS forecast_value FROM ( ( SELECT DATE(forecast_timestamp) AS forecast_timestamp, NULL AS history_value, forecast_value AS forecast_value, start_station_id AS start_station_id, FROM ML.FORECAST( MODEL bqml_tutorial.`nyc_citibike_arima_model`, STRUCT( 365 AS horizon, 0.9 AS confidence_level)) ) UNION ALL ( SELECT DATE(date_name) AS forecast_timestamp, num_trips AS history_value, NULL AS forecast_value, start_station_id AS start_station_id, FROM ( SELECT EXTRACT(DATE FROM starttime) AS date_name, COUNT(*) AS num_trips, start_station_id AS start_station_id FROM `bigquery-public-data`.new_york.citibike_trips WHERE starttime > '2014-07-11' AND starttime < '2015-02-11' GROUP BY date_name, start_station_id ) ) ) WHERE start_station_id = 79 ORDER BY forecast_timestamp, start_station_id
Haz clic en Ejecutar.
Usa la Google Cloud consola para representar los datos de serie temporal. En el panel Resultados de la consulta, haz clic en la pestaña Visualización:
Si es necesario, abre la página de BigQuery en laGoogle Cloud consola.
En el panel de navegación, haz clic en el conjunto de datos bqml_tutorial que has creado.
Haz clic en Eliminar conjunto de datos, en la parte derecha de la ventana. Esta acción elimina el conjunto de datos, la tabla y todos los datos.
En el cuadro de diálogo Eliminar conjunto de datos, confirma el comando de eliminación escribiendo el nombre de tu conjunto de datos (
bqml_tutorial
) y, a continuación, haz clic en Eliminar.- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
- Consulta cómo prever varias series temporales con una sola consulta a partir de los datos de los trayectos de Citi Bike (Nueva York).
- Consulta cómo acelerar ARIMA_PLUS para predecir 1 millón de series temporales en cuestión de horas.
- Para obtener más información sobre el aprendizaje automático, consulta el curso intensivo de aprendizaje automático.
- Para obtener una descripción general de BigQuery ML, consulta Introducción a BigQuery ML.
- Para obtener más información sobre la consola Google Cloud , consulta Usar la consola Google Cloud .
Crear conjunto de datos
Crea un conjunto de datos de BigQuery para almacenar tu modelo de aprendizaje automático.
Consola
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
.
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.
Visualiza la serie temporal que quieras predecir
Antes de crear el modelo, es útil ver cómo es la serie temporal de entrada.
SQL
En la siguiente consulta, la cláusula FROM bigquery-public-data.new_york.citibike_trips
indica que está consultando la tabla citibike_trips
del conjunto de datos new_york
.
En la instrucción SELECT
, 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 el número total diario de viajes de Citi Bike.
#standardSQL SELECT EXTRACT(DATE from starttime) AS date, COUNT(*) AS num_trips FROM `bigquery-public-data`.new_york.citibike_trips GROUP BY date
Para ejecutar la consulta, sigue estos pasos:
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.
En el siguiente ejemplo, bigquery-public-data.new_york.citibike_trips
indica que estás consultando la tabla citibike_trips
del
conjunto de datos new_york
.
El resultado es similar al siguiente:
Crear un modelo de serie temporal
Crea un modelo de serie temporal con los datos de los trayectos de Citi Bike (Nueva York).
La siguiente consulta de GoogleSQL crea un modelo que predice el total diario de viajes en bicicleta. La instrucción CREATE MODEL
crea y entrena un modelo llamado bqml_tutorial.nyc_citibike_arima_model
.
#standardSQL CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model OPTIONS ( model_type = 'ARIMA_PLUS', time_series_timestamp_col = 'date', time_series_data_col = 'num_trips', time_series_id_col = 'start_station_id') AS SELECT EXTRACT(DATE FROM starttime) AS date, COUNT(*) AS num_trips, start_station_id FROM `bigquery-public-data`.new_york.citibike_trips WHERE starttime > '2014-07-11' AND starttime < '2015-02-11' GROUP BY date, start_station_id;
La cláusula OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...)
indica que estás creando un
modelo de serie temporal basado en ARIMA. De forma predeterminada, auto_arima=TRUE
, por lo que el algoritmo auto.ARIMA
ajusta automáticamente los hiperparámetros de los modelos ARIMA_PLUS
. El algoritmo ajusta decenas de modelos candidatos y elige el mejor, que es el que tiene el criterio de información de Akaike (AIC) más bajo.
Además, como el valor predeterminado es data_frequency='AUTO_FREQUENCY'
, el proceso de entrenamiento deduce automáticamente la frecuencia de los datos de la serie temporal de entrada. La instrucción CREATE MODEL
usa decompose_time_series=TRUE
de forma predeterminada, por lo que tanto el historial como la previsión de la serie temporal se guardan en el modelo. Si se define el parámetro time_series_id_col = 'start_station_id'
, el modelo se ajustará y hará previsiones de varias series temporales con una sola consulta basada en start_station_id
. Puedes usar esta información para comprender mejor cómo se prevé la serie temporal. Para ello, debes obtener los componentes de la serie temporal por separado, como los periodos estacionales.
Ejecuta la consulta CREATE MODEL
para crear y entrenar tu modelo:
Predecir la serie temporal y visualizar los resultados
Para explicar cómo se pronostica la serie temporal, visualiza todos los componentes de la subserie temporal, como la estacionalidad y la tendencia, con la función ML.FORECAST
.
Para ello, siga estos pasos:
El gráfico muestra que los valores previstos del número total diario de viajes de Citi Bike donde start_station_id=79
son números negativos, lo que no es útil. Si se usa un modelo con límites, los datos previstos mejoran.
Crear un modelo de serie temporal con límites
Crea un modelo de serie temporal con límites usando los datos de los trayectos de Citi Bike (Nueva York).
La siguiente consulta de GoogleSQL crea un modelo que predice el total diario de viajes en bicicleta. La instrucción CREATE MODEL
crea y entrena un modelo llamado bqml_tutorial.nyc_citibike_arima_model_with_limits
.
La principal diferencia entre este modelo y el modelo que creaste anteriormente es que se ha añadido la opción forecast_limit_lower_bound=0
. Esta opción hace que el modelo solo pronostique valores superiores a 0, basándose en los valores de la columna especificada por el argumento time_series_data_col
, en este caso num_trips
.
#standardSQL CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model OPTIONS ( model_type = 'ARIMA_PLUS', time_series_timestamp_col = 'date', time_series_data_col = 'num_trips', time_series_id_col = 'start_station_id', forecast_limit_lower_bound = 0) AS SELECT EXTRACT(DATE FROM starttime) AS date, COUNT(*) AS num_trips, start_station_id FROM `bigquery-public-data`.new_york.citibike_trips WHERE starttime > '2014-07-11' AND starttime < '2015-02-11' GROUP BY date, start_station_id;
Ejecuta la consulta CREATE MODEL
para crear y entrenar tu modelo:
Predecir la serie temporal con el modelo con límites
El modelo ARIMA PLUS detecta que el número total diario de viajes de Citi Bike en los que start_station_id=79
está disminuyendo. Los valores de las previsiones futuras seguirán esta tendencia y darán cifras relativamente más pequeñas cuanto más lejos en el futuro se hagan. El gráfico muestra que los valores previstos del número total diario de viajes de Citi
Bike donde start_station_id=79
son números positivos, lo que resulta más útil. El modelo con límites detecta que el número total diario de viajes de Citi Bike en los que start_station_id=79
está disminuyendo, pero sigue ofreciendo valores de previsión significativos.
Como se muestra en este tutorial, las opciones forecast_limit_lower_bound
y forecast_limit_upper_bound
pueden ayudarte a obtener valores de previsión más significativos en situaciones similares a la que se muestra aquí, como cuando se prevén precios de acciones o cifras de ventas futuras.
Eliminar un conjunto de datos
Si eliminas un proyecto, se eliminarán todos los conjuntos de datos y todas las tablas que contenga. Si prefieres reutilizar el proyecto, puedes eliminar el conjunto de datos que has creado en este tutorial:
Eliminar un proyecto
Para ello, sigue las instrucciones que aparecen a continuación: