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

  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. Crear conjunto de datos

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

    Consola

    1. En la Google Cloud 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)

    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:

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

    2. 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
    3. Haz clic en Ejecutar. Los resultados de la consulta son similares a los siguientes.

      Resultado de la consulta.

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

      Result_visualization.

    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.

    import bigframes.pandas as bpd
    
    df = bpd.read_gbq("bigquery-public-data.new_york.citibike_trips")
    
    features = bpd.DataFrame(
        {
            "num_trips": df.starttime,
            "date": df["starttime"].dt.date,
        }
    )
    num_trips = features.groupby(["date"]).count()
    
    num_trips.plot.line()

    El resultado es similar al siguiente: Result_visualization

    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:

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

    2. 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;
    3. 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ón CREATE MODEL para crear un modelo, no hay resultados de consulta.

    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:

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

    2. 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
    3. Haz clic en Ejecutar. Los resultados de la consulta son similares a los siguientes:

      BQUI_chart.

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

      Result_visualization.

    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:

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

    2. 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;
    3. 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ón CREATE MODEL para crear un modelo, no hay resultados de consulta.

    Predecir la serie temporal con el modelo con límites

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

    2. 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
    3. Haz clic en Ejecutar.

      BQUI_chart.

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

      Result_visualization.

    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:

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

      Ir a la página de BigQuery

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

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

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

    Eliminar un proyecto

    Para ello, sigue las instrucciones que aparecen a continuación:

    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.

    Siguientes pasos