Limitare i valori previsti per un modello di serie temporali ARIMA_PLUS

Questo tutorial ti insegna a utilizzare i limiti per restringere i risultati previsti restituiti da un modello di serie temporali ARIMA_PLUS. In questo tutorial, creerai due modelli di serie temporali sugli stessi dati, un modello che utilizza i limiti e un modello che non li utilizza. In questo modo, puoi confrontare i risultati restituiti dai modelli e comprendere la differenza che comporta la specifica dei limiti.

Utilizzerai i dati new_york.citibike_trips per addestrare i modelli in questo tutorial. Questo set di dati contiene informazioni sui viaggi di Citi Bike a New York.

Prima di seguire questo tutorial, dovresti avere familiarità con la previsione di una singola serie temporale. Completa il tutorial Previsione di una singola serie temporale dai dati di Google Analytics per un'introduzione a questo argomento.

Autorizzazioni richieste

  • Per creare il set di dati, devi disporre dell'autorizzazione IAM bigquery.datasets.create.

  • Per creare il modello, devi disporre delle seguenti autorizzazioni:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • Per eseguire l'inferenza, devi disporre delle seguenti autorizzazioni:

    • bigquery.models.getData
    • bigquery.jobs.create

Per saperne di più sui ruoli e sulle autorizzazioni IAM in BigQuery, consulta Introduzione a IAM.

Obiettivi

In questo tutorial, utilizzerai quanto segue:

  • L'CREATE MODEL istruzione: per creare un modello di serie temporali.
  • La ML.FORECAST funzione: per prevedere il numero totale di visite giornaliere.

Costi

Questo tutorial utilizza componenti fatturabili di Google Cloud, tra cui:

  • BigQuery
  • BigQuery ML

Per saperne di più sui costi di BigQuery, consulta la pagina Prezzi di BigQuery.

Per saperne di più sui costi di BigQuery ML, consulta Prezzi di BigQuery ML.

Prima di iniziare

  1. Accedi al tuo Google Cloud account. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
  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 role (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 role (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

Crea un set di dati

Crea un set di dati BigQuery per archiviare il tuo modello ML.

Console

  1. Nella Google Cloud console, vai alla pagina BigQuery.

    Vai alla pagina BigQuery

  2. Nel riquadro Spazio di esplorazione, fai clic sul nome del progetto.

  3. Fai clic su Visualizza azioni > Crea set di dati

  4. Nella pagina Crea set di dati, segui questi passaggi:

    • In ID set di dati, inserisci bqml_tutorial.

    • Per Tipo di località, seleziona Multi-regione e poi seleziona Stati Uniti.

    • Lascia invariate le restanti impostazioni predefinite e fai clic su Crea set di dati.

bq

Per creare un nuovo set di dati, utilizza il bq mk --dataset comando.

  1. Crea un set di dati denominato bqml_tutorial con la località dei dati impostata su US.

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  2. Verifica che il set di dati sia stato creato:

    bq ls

API

Chiama il datasets.insert metodo con una risorsa del set di dati definita.

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

BigQuery DataFrames

Prima di provare questo esempio, segui le istruzioni di configurazione di BigQuery DataFrames nella guida rapida di BigQuery utilizzando BigQuery DataFrames. Per saperne di più, consulta la documentazione di riferimento di BigQuery DataFrames.

Per eseguire l'autenticazione in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configura ADC per un ambiente di sviluppo locale.

import google.cloud.bigquery

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

Visualizzare la serie temporale di cui vuoi eseguire la previsione

Prima di creare il modello, è utile vedere l'aspetto della serie temporale di input.

SQL

Nella query seguente, la FROM bigquery-public-data.new_york.citibike_trips clausola indica che stai eseguendo una query sulla tabella citibike_trips nel new_york set di dati.

Nell'istruzione SELECT, la query utilizza la EXTRACT funzione per estrarre le informazioni sulla data dalla colonna starttime. La query utilizza la clausola COUNT(*) per ottenere il numero totale giornaliero di viaggi di 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

Per eseguire la query, segui questi passaggi:

  1. Nella Google Cloud console, fai clic sul pulsante Crea nuova query.

  2. Inserisci la seguente query GoogleSQL nell'editor di query.

    #standardSQL
    SELECT
     EXTRACT(DATE from starttime) AS date,
     COUNT(*) AS num_trips
    FROM
     `bigquery-public-data`.new_york.citibike_trips
    GROUP BY date
  3. Fai clic su Esegui. I risultati della query sono simili ai seguenti.

    Output della query.

  4. Utilizza la Google Cloud console per creare un grafico dei dati delle serie temporali. Nel riquadro Risultati query, fai clic sulla scheda Visualizzazione. Nel riquadro Configurazione visualizzazione, scegli Barra per Tipo di visualizzazione:

    Result_visualization.

BigQuery DataFrames

Prima di provare questo esempio, segui le istruzioni di configurazione di BigQuery DataFrames nella guida rapida di BigQuery utilizzando BigQuery DataFrames. Per saperne di più, consulta la documentazione di riferimento di BigQuery DataFrames.

Per eseguire l'autenticazione in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configura ADC per un ambiente di sviluppo locale.

Nell'esempio seguente, bigquery-public-data.new_york.citibike_trips indica che stai eseguendo una query sulla tabella citibike_trips nel new_york set di dati.

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

Il risultato è simile al seguente: Result_visualization

Creare un modello di serie temporali

Crea un modello di serie temporali utilizzando i dati dei viaggi di NYC Citi Bike.

La seguente query GoogleSQL crea un modello che prevede il numero totale giornaliero di viaggi in bicicletta. L'CREATE MODEL istruzione crea e addestra un modello denominato 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 OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) clausola indica che stai creando un modello di serie temporali basato su ARIMA. Per impostazione predefinita, auto_arima=TRUE, quindi l'algoritmo auto.ARIMA ottimizza automaticamente gli iperparametri nei ARIMA_PLUS modelli. L'algoritmo adatta decine di modelli candidati e sceglie il migliore con il criterio di informazione di Akaike (AIC) più basso . Inoltre, poiché il valore predefinito è data_frequency='AUTO_FREQUENCY', il processo di addestramento deduce automaticamente la frequenza dei dati della serie temporale di input. L'istruzione CREATE MODEL utilizza decompose_time_series=TRUE per impostazione predefinita, quindi sia la cronologia sia le parti di previsione della serie temporale vengono salvate nel modello. L'impostazione del parametro time_series_id_col = 'start_station_id' fa sì che il modello adatti e preveda più serie temporali utilizzando una singola query basata sul start_station_id. Puoi utilizzare queste informazioni per comprendere meglio come viene prevista la serie temporale recuperando i componenti separati della serie temporale, come i periodi stagionali.

Esegui la query CREATE MODEL per creare e addestrare il modello:

  1. Nella Google Cloud console, fai clic sul pulsante Crea nuova query.

  2. Inserisci la seguente query GoogleSQL nell'editor di query.

    #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. Fai clic su Esegui.

    Il completamento della query richiede circa 80 secondi, dopodiché puoi accedere al modello (nyc_citibike_arima_model). Poiché la query utilizza un'istruzione CREATE MODEL per creare un modello, non vengono visualizzati i risultati della query.

Prevedere la serie temporale e visualizzare i risultati

Per spiegare come viene prevista la serie temporale, visualizza tutti i componenti della serie temporale secondaria, come la stagionalità e la tendenza, utilizzando la ML.FORECAST funzione.

A questo scopo, procedi nel seguente modo:

  1. Nella Google Cloud console, fai clic sul pulsante Crea nuova query.

  2. Inserisci la seguente query GoogleSQL nell'editor di query.

    #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. Fai clic su Esegui. I risultati della query sono simili ai seguenti:

    BQUI_chart.

  4. Utilizza la Google Cloud console per creare un grafico dei dati delle serie temporali. Nel riquadro Risultati query, fai clic sulla scheda Visualizzazione:

    Result_visualization.

Il grafico mostra che i valori previsti per il numero totale giornaliero di viaggi di Citi Bike in cui start_station_id=79 sono numeri negativi, il che non è utile. L'utilizzo di un modello con limiti migliora i dati previsti.

Creare un modello di serie temporali con limiti

Crea un modello di serie temporali con limiti utilizzando i dati dei viaggi di NYC Citi Bike.

La seguente query GoogleSQL crea un modello che prevede il numero totale giornaliero di viaggi in bicicletta. L'CREATE MODEL istruzione crea e addestra un modello denominato bqml_tutorial.nyc_citibike_arima_model_with_limits. La differenza principale tra questo modello e il modello creato in precedenza è l'aggiunta dell'opzione forecast_limit_lower_bound=0. Questa opzione fa sì che il modello preveda solo i valori maggiori di 0, in base ai valori della colonna specificata dall'argomento time_series_data_col, in questo 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;

Esegui la query CREATE MODEL per creare e addestrare il modello:

  1. Nella Google Cloud console, fai clic sul pulsante Crea nuova query.

  2. Inserisci la seguente query GoogleSQL nell'editor di query.

    #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. Fai clic su Esegui.

    Il completamento della query richiede circa 100 secondi, dopodiché puoi accedere al modello (nyc_citibike_arima_model_with_limits). Poiché la query utilizza un'istruzione CREATE MODEL per creare un modello, non vengono visualizzati i risultati della query.

Prevedere la serie temporale utilizzando il modello con limiti

  1. Nella Google Cloud console, fai clic sul pulsante Crea nuova query.

  2. Inserisci la seguente query GoogleSQL nell'editor di query.

    #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. Fai clic su Esegui.

    BQUI_chart.

  4. Utilizza la Google Cloud console per creare un grafico dei dati delle serie temporali. Nel riquadro Risultati query, fai clic sulla scheda Visualizzazione:

    Result_visualization.

Il modello ARIMA PLUS rileva che il numero totale giornaliero di viaggi di Citi Bike in cui start_station_id=79 è in diminuzione. I valori di previsione futuri seguiranno questa tendenza e forniranno numeri di previsione relativamente più piccoli man mano che si va avanti nel futuro. Il grafico mostra che i valori previsti per il numero totale giornaliero di viaggi di Citi Bike in cui start_station_id=79 sono numeri positivi, il che è più utile. Il modello con limiti rileva che il numero totale giornaliero di viaggi di Citi Bike in cui start_station_id=79 è in diminuzione, ma fornisce comunque valori di previsione significativi.

Come mostrato in questo tutorial, le opzioni forecast_limit_lower_bound e forecast_limit_upper_bound possono aiutarti a ottenere valori di previsione più significativi in scenari simili a quello mostrato qui, ad esempio quando prevedi i prezzi delle azioni o i numeri di vendita futuri.

Elimina il set di dati

L'eliminazione del progetto rimuove tutti i set di dati e tutte le tabelle nel progetto. Se preferisci riutilizzare il progetto, puoi eliminare il set di dati creato in questo tutorial:

  1. Se necessario, apri la pagina BigQuery nella Google Cloud console.

    Vai alla pagina BigQuery

  2. Nella navigazione, fai clic sul set di dati bqml_tutorial che hai creato.

  3. Fai clic su Elimina set di dati sul lato destro della finestra. Questa azione elimina il set di dati, la tabella e tutti i dati.

  4. Nella finestra di dialogo Elimina set di dati , digita il nome del set di dati (bqml_tutorial) per confermare il comando di eliminazione, quindi fai clic su Elimina.

Elimina il progetto

Per eliminare il progetto:

  1. Nella Google Cloud console, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID progetto e fai clic su Chiudi per eliminare il progetto.

Passaggi successivi