Eseguire la scalabilità di un modello di serie temporali ARIMA_PLUS univariato a milioni di serie temporali

In questo tutorial imparerai ad accelerare in modo significativo l'addestramento di un insieme di modelli di serie temporali univariate ARIMA_PLUS, al fine di eseguire più previsioni di serie temporali con una singola query. Imparerai anche a valutare l'accuratezza delle previsioni.

Questo tutorial prevede più serie temporali. I valori previsti vengono calcolati per ogni momento nel tempo, per ogni valore in una o più colonne specificate. Ad esempio, se vuoi prevedere il meteo e specifichi una colonna contenente i dati della città, i dati previsti conterranno le previsioni per tutti i punti temporali della città A, poi i valori previsti per tutti i punti temporali della città B e così via.

Questo tutorial utilizza i dati delle tabelle pubbliche bigquery-public-data.new_york.citibike_trips e iowa_liquor_sales.sales. I dati sui percorsi in bicicletta contengono solo poche centinaia di serie temporali, quindi vengono utilizzati per illustrare varie strategie per accelerare l'addestramento del modello. I dati sulle vendite di liquori contengono più di 1 milione di serie temporali, quindi vengono utilizzati per mostrare la previsione delle serie temporali su larga scala.

Prima di leggere questo tutorial, devi leggere Prevedi più serie temporali con un modello univariato e Best practice per la previsione di serie temporali su larga scala.

Obiettivi

In questo tutorial utilizzerai quanto segue:

Per semplicità, questo tutorial non spiega come utilizzare le funzioni ML.FORECAST o ML.EXPLAIN_FORECAST per generare previsioni. Per scoprire come utilizzare queste funzioni, consulta Prevedi più serie temporali con un modello univariato.

Costi

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

  • BigQuery
  • BigQuery ML

Per saperne di più sui costi, consulta la pagina dei prezzi di BigQuery e la pagina dei prezzi di BigQuery ML.

Prima di iniziare

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

  2. Verify that billing is enabled for your Google Cloud project.

  3. BigQuery viene abilitato automaticamente nei nuovi progetti. Per attivare BigQuery in un progetto preesistente, vai a

    Abilita l'API BigQuery, se non è già abilitata.

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre dell'autorizzazione serviceusage.services.enable. Se hai creato il progetto, probabilmente hai già questa autorizzazione tramite il ruolo Proprietario (roles/owner). In caso contrario, puoi ottenere questa autorizzazione tramite il ruolo Amministratore Service Usage (roles/serviceusage.serviceUsageAdmin). Scopri come concedere i ruoli.

    Abilitare l'API

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.

Crea un set di dati

Per creare un set di dati BigQuery, seleziona una delle seguenti opzioni:

Console

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

    Vai a BigQuery

  2. Nel riquadro a sinistra, fai clic su Explorer:

    Pulsante evidenziato per il riquadro Spazio di esplorazione.

    Se non vedi il riquadro a sinistra, fai clic su Espandi riquadro sinistro per aprirlo.

  3. In Explorer, espandi il progetto, quindi fai clic su Set di dati.

  4. Nella pagina Set di dati, fai clic su Crea set di dati.

  5. Nel riquadro Crea set di dati, segui questi passaggi:

    • In ID set di dati, inserisci bqml_tutorial.

    • Per Località dei dati, seleziona USA.

    Lascia invariate le altre impostazioni predefinite.

  6. Fai clic su Crea set di dati.

bq

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

  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 metodo datasets.insert con una risorsa del set di dati definita:

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

Crea una tabella di dati di input

L'istruzione SELECT della seguente query utilizza la funzione EXTRACT per estrarre le informazioni sulla data dalla colonna starttime. La query utilizza la clausola COUNT(*) per ottenere il numero totale giornaliero di corse Citi Bike.

table_1 ha 679 serie temporali. La query utilizza una logica INNER JOIN aggiuntiva per selezionare tutte le serie temporali che hanno più di 400 punti temporali, per un totale di 383 serie temporali.

Per creare la tabella dei dati di input:

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

    Vai a BigQuery

  2. Nell'editor di query, incolla la query seguente e fai clic su Esegui:

    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 modello per più serie temporali con parametri predefiniti

Vuoi prevedere il numero di corse in bicicletta per ogni stazione Citi Bike, il che richiede molti modelli di serie temporali, uno per ogni stazione Citi Bike inclusa nei dati di input. Per farlo, puoi scrivere più query CREATE MODEL, ma può essere un processo noioso e dispendioso in termini di tempo, soprattutto se hai un numero elevato di serie temporali. Puoi invece utilizzare una singola query per creare e adattare un insieme di modelli di serie temporali per prevedere più serie temporali contemporaneamente.

La clausola OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) indica che stai creando un insieme di modelli di serie temporali ARIMA_PLUS basati su ARIMA. L'opzione time_series_timestamp_col specifica la colonna che contiene la serie temporale, l'opzione time_series_data_col specifica la colonna per cui eseguire la previsione e time_series_id_col specifica una o più dimensioni per cui vuoi creare serie temporali.

Questo esempio omette i punti temporali della serie temporale successivi al 1° giugno 2016, in modo che possano essere utilizzati per valutare l'accuratezza della previsione in un secondo momento utilizzando la funzione ML.EVALUATE.

Per creare il modello, segui questi passaggi:

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

    Vai a BigQuery

  2. Nell'editor di query, incolla la query seguente e fai clic su Esegui:

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

    Il completamento della query richiede circa 15 minuti.

Valuta l'accuratezza della previsione per ogni serie temporale

Valuta l'accuratezza della previsione del modello utilizzando la funzione ML.EVALUATE.

Per valutare il modello:

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

    Vai a BigQuery

  2. Nell'editor di query, incolla la query seguente e fai clic su Esegui:

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

    Questa query genera un report su diverse metriche di previsione, tra cui:

    I risultati dovrebbero essere simili ai seguenti: Metriche di valutazione per il modello di serie temporali.

    La clausola TABLE nella funzione ML.EVALUATE identifica una tabella contenente i dati di fatto. I risultati della previsione vengono confrontati con i dati di fatto per calcolare le metriche di accuratezza. In questo caso, nyc_citibike_time_series contiene sia i punti delle serie temporali precedenti al 1° giugno 2016 sia quelli successivi. I punti dopo il 1° giugno 2016 sono i dati di fatto. I punti prima del 1° giugno 2016 vengono utilizzati per addestrare il modello a generare previsioni dopo questa data. Per calcolare le metriche sono necessari solo i punti successivi al 1° giugno 2016. I punti precedenti al 1° giugno 2016 vengono ignorati nel calcolo delle metriche.

    La clausola STRUCT nella funzione ML.EVALUATE ha specificato i parametri per la funzione. Il valore horizon è 7, il che significa che la query calcola l'accuratezza della previsione in base a una previsione di sette punti. Tieni presente che se i dati di fatto hanno meno di sette punti per il confronto, le metriche di accuratezza vengono calcolate solo in base ai punti disponibili. Il valore perform_aggregation è TRUE, il che significa che le metriche di accuratezza della previsione vengono aggregate in base alle metriche nel momento specifico. Se specifichi un valore perform_aggregation di FALSE, l'accuratezza della previsione viene restituita per ogni momento previsto.

    Per saperne di più sulle colonne di output, consulta la sezione sulla funzione ML.EVALUATE.

Valuta l'accuratezza complessiva delle previsioni

Valuta l'accuratezza della previsione per tutte le 383 serie temporali.

Tra le metriche di previsione restituite da ML.EVALUATE, solo l'errore percentuale medio assoluto e l'errore percentuale medio assoluto simmetrico sono indipendenti dal valore della serie temporale. Pertanto, per valutare l'accuratezza complessiva della previsione dell'insieme di serie temporali, è significativo solo l'aggregato di queste due metriche.

Per valutare il modello:

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

    Vai a BigQuery

  2. Nell'editor di query, incolla la query seguente e fai clic su Esegui:

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

Questa query restituisce un valore MAPE di 0.3471 e un valore sMAPE di 0.2563.

Crea un modello per prevedere più serie temporali con uno spazio di ricerca degli iperparametri più piccolo

Nella sezione Crea un modello per più serie temporali con parametri predefiniti, hai utilizzato i valori predefiniti per tutte le opzioni di addestramento, inclusa l'opzione auto_arima_max_order. Questa opzione controlla lo spazio di ricerca per l'ottimizzazione degli iperparametri nell'algoritmo auto.ARIMA.

Nel modello creato dalla seguente query, utilizzi uno spazio di ricerca più piccolo per gli iperparametri modificando il valore dell'opzione auto_arima_max_order dal valore predefinito 5 a 2.

Per valutare il modello:

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

    Vai a BigQuery

  2. Nell'editor di query, incolla la query seguente e fai clic su Esegui:

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

    Il completamento della query richiede circa 2 minuti. Ricorda che il modello precedente ha impiegato circa 15 minuti per essere completato quando il valore auto_arima_max_order era 5, quindi questa modifica migliora la velocità di addestramento del modello di circa 7 volte. Se ti chiedi perché l'aumento della velocità non è di 5/2=2.5x, è perché quando il valore auto_arima_max_order aumenta, non solo aumenta il numero di modelli candidati, ma anche la complessità. Ciò comporta un aumento del tempo di addestramento del modello.

Valuta l'accuratezza della previsione per un modello con uno spazio di ricerca degli iperparametri più piccolo

Per valutare il modello:

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

    Vai a BigQuery

  2. Nell'editor di query, incolla la query seguente e fai clic su Esegui:

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

Questa query restituisce un valore MAPE di 0.3337 e un valore sMAPE di 0.2337.

Nella sezione Valuta l'accuratezza complessiva della previsione, hai valutato un modello con uno spazio di ricerca degli iperparametri più ampio, in cui il valore dell'opzione auto_arima_max_order è 5. Ciò ha generato un valore MAPE di 0.3471 e un valore sMAPE di 0.2563. In questo caso, puoi vedere che uno spazio di ricerca degli iperparametri più piccolo offre in realtà una maggiore accuratezza della previsione. Uno dei motivi è che l'algoritmo auto.ARIMA esegue l'ottimizzazione degli iperparametri solo per il modulo di tendenza dell'intera pipeline di modellazione. Il miglior modello ARIMA selezionato dall'algoritmo auto.ARIMA potrebbe non generare i migliori risultati di previsione per l'intera pipeline.

Crea un modello per prevedere più serie temporali con uno spazio di ricerca degli iperparametri più piccolo e strategie di addestramento rapido intelligenti

In questo passaggio, utilizzi sia uno spazio di ricerca degli iperparametri più piccolo sia la strategia di addestramento rapido intelligente utilizzando una o più opzioni di addestramento max_time_series_length, max_time_series_length o time_series_length_fraction.

Mentre la modellazione periodica, come la stagionalità, richiede un certo numero di punti temporali, la modellazione delle tendenze richiede meno punti temporali. Nel frattempo, la modellazione delle tendenze è molto più costosa dal punto di vista computazionale rispetto ad altri componenti delle serie temporali, come la stagionalità. Utilizzando le opzioni di addestramento rapido riportate sopra, puoi modellare in modo efficiente la componente di tendenza con un sottoinsieme della serie temporale, mentre le altre componenti della serie temporale utilizzano l'intera serie temporale.

L'esempio seguente utilizza l'opzione max_time_series_length per ottenere un addestramento rapido. Impostando il valore dell'opzione max_time_series_length su 30, vengono utilizzati solo i 30 punti temporali più recenti per modellare la componente di tendenza. Tutte le 383 serie temporali vengono comunque utilizzate per modellare i componenti non di tendenza.

Per creare il modello, segui questi passaggi:

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

    Vai a BigQuery

  2. Nell'editor di query, incolla la query seguente e fai clic su Esegui:

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

    Il completamento della query richiede circa 35 secondi. Questo è 3 volte più veloce rispetto alla query utilizzata nella sezione Crea un modello per prevedere più serie temporali con uno spazio di ricerca degli iperparametri più piccolo. A causa dell'overhead di tempo costante per la parte della query non di addestramento, come la pre-elaborazione dei dati, l'aumento della velocità è molto più elevato quando il numero di serie temporali è molto più grande rispetto a questo esempio. Per un milione di serie temporali, l'aumento della velocità si avvicina al rapporto tra la lunghezza della serie temporale e il valore dell'opzione max_time_series_length. In questo caso, l'aumento della velocità è superiore a 10 volte.

Valuta l'accuratezza della previsione per un modello con uno spazio di ricerca degli iperparametri più piccolo e strategie di addestramento rapido intelligenti

Per valutare il modello:

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

    Vai a BigQuery

  2. Nell'editor di query, incolla la query seguente e fai clic su Esegui:

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

Questa query restituisce un valore MAPE di 0.3515 e un valore sMAPE di 0.2473.

Ricorda che, senza l'utilizzo di strategie di addestramento rapido, l'accuratezza della previsione restituisce un valore MAPE di 0.3337 e un valore sMAPE di 0.2337. La differenza tra i due insiemi di valori delle metriche è inferiore al 3%, il che è statisticamente insignificante.

In breve, hai utilizzato uno spazio di ricerca degli iperparametri più piccolo e strategie di addestramento rapido intelligenti per velocizzare l'addestramento del modello di oltre 20 volte senza sacrificare l'accuratezza della previsione. Come accennato in precedenza, con più serie temporali, l'aumento della velocità grazie alle strategie di addestramento rapido intelligente può essere significativamente maggiore. Inoltre, la libreria ARIMA sottostante utilizzata dai modelli ARIMA_PLUS è stata ottimizzata per l'esecuzione 5 volte più veloce rispetto a prima. Insieme, questi vantaggi consentono di prevedere milioni di serie temporali in poche ore.

Crea un modello per prevedere un milione di serie temporali

In questo passaggio, prevederai le vendite di oltre 1 milione di prodotti alcolici in diversi negozi utilizzando i dati pubblici sulle vendite di alcolici in Iowa. L'addestramento del modello utilizza un piccolo spazio di ricerca degli iperparametri e la strategia di addestramento rapido intelligente.

Per valutare il modello:

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

    Vai a BigQuery

  2. Nell'editor di query, incolla la query seguente e fai clic su Esegui:

    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;

    Il completamento della query richiede circa 1 ora e 16 minuti.

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

  • Puoi eliminare il progetto che hai creato.
  • In alternativa, puoi conservare il progetto ed eliminare il set di dati.

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

    Vai alla pagina BigQuery

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

  3. Fai clic su Elimina set di dati per eliminare il set di dati, la tabella e tutti i dati.

  4. Nella finestra di dialogo Elimina set di dati, conferma il comando di eliminazione digitando il nome del set di dati (bqml_tutorial) e fai clic su Elimina.

Elimina il progetto

Per eliminare il progetto:

  1. Nella console Google Cloud , 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, quindi fai clic su Chiudi per eliminare il progetto.

Passaggi successivi