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 ARIMA_PLUS modelli di serie temporali univariate, per eseguire più previsioni di serie temporali con una singola query. Imparerai anche a valutare l'accuratezza delle previsioni.

Questo tutorial esegue previsioni per più serie temporali. I valori previsti vengono calcolati per ogni punto temporale, per ogni valore in una o più colonne specificate. Ad esempio, se vuoi prevedere il meteo e hai specificato una colonna contenente i dati delle città, i dati previsti conterranno le previsioni per tutti i punti temporali per la città A, poi i valori previsti per tutti i punti temporali per la 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 viaggi 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 hanno più di un 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 utilizzi:

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 Previsione di più serie temporali con un modello univariato.

Costi

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

  • BigQuery
  • BigQuery ML

Per ulteriori informazioni sui costi, consulta le pagine Prezzi di BigQuery e Prezzi di BigQuery ML.

Prima di iniziare

  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 viene attivato automaticamente nei nuovi progetti. Per attivare BigQuery in un progetto preesistente, vai a

    Enable the BigQuery API.

    Enable the API

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

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

Console

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

    Vai alla pagina BigQuery

  2. Nel riquadro Explorer, fai clic sul nome del progetto.

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

    L'opzione di menu Crea set di dati.

  4. Nella pagina Crea set di dati:

    • In ID set di dati, inserisci bqml_tutorial.

    • Per Tipo di località, seleziona Più regioni e poi Stati Uniti (più regioni negli 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 comando bq mk con il flag --location. Per un elenco completo dei possibili parametri, consulta la documentazione di riferimento del comando bq mk --dataset.

  1. Crea un set di dati denominato bqml_tutorial con la località dei dati impostata su US e una descrizione di BigQuery ML tutorial dataset:

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    Anziché utilizzare il flag --dataset, il comando utilizza la scorciatoia -d. Se ometti -d e --dataset, il comando crea un set di dati per impostazione predefinita.

  2. Verifica che il set di dati sia stato creato:

    bq ls

API

Chiama il metodo datasets.insert con una risorsa dataset 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 che utilizza BigQuery DataFrames. Per ulteriori informazioni, consulta la documentazione di riferimento di BigQuery DataFrames.

Per eseguire l'autenticazione in BigQuery, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, vedi Configurare ADC per un ambiente di sviluppo locale.

import google.cloud.bigquery

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

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 viaggi in Citi Bike.

table_1 ha 679 serie temporali. La query utilizza una logica INNER JOIN aggiuntiva per selezionare tutte le serie temporali con più di 400 punti temporali, ottenendo 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 seguente query 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. Puoi scrivere più query CREATE MODEL per farlo, ma può essere un processo noioso e dispendioso in termini di tempo, soprattutto se hai un numero elevato di serie temporali. In alternativa, puoi 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 ARIMA_PLUS. L'opzione time_series_timestamp_col specifica la colonna che contiene le serie temporali, l'opzione time_series_data_col specifica la colonna per cui eseguire la previsione e l'opzione 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:

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

    Vai a BigQuery

  2. Nell'editor di query, incolla la seguente query 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';

    La compilazione della richiesta richiede circa 15 minuti.

Valuta l'accuratezza delle previsioni 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 seguente query 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 diversi report sulle 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 riferimento. I risultati della previsione vengono confrontati con i dati basati su dati empirici reali per calcolare le metriche di accuratezza. In questo caso, il nyc_citibike_time_series contiene i punti della serie temporale prima e dopo il 1° giugno 2016. I punti successivi al 1° giugno 2016 sono i dati di riferimento. I punti precedenti al 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 di 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 basati su dati empirici reali hanno meno di sette punti per il confronto, le metriche di accuratezza vengono calcolate in base ai soli punti disponibili. Il valore di perform_aggregation è TRUE, il che significa che le metriche di accuratezza della previsione vengono aggregate in base alle metriche nel punto temporale. Se specifichi un valore perform_aggregation pari a FALSE, l'accuratezza della previsione viene restituita per ogni punto temporale previsto.

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

Valutare l'accuratezza complessiva delle previsioni

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

Delle metriche di previsione restituite da ML.EVALUATE, solo l'errore percentuale assoluto medio e l'errore percentuale assoluto medio 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 seguente query 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 pari a 0.3471 e un valore sMAPE pari a 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 di 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 seguente query 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 impiegava circa 15 minuti per essere completato quando il valore di 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 di velocità non è 5/2=2.5x, è perché quando il valore di 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 delle previsioni 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 seguente query 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 pari a 0.3337 e un valore sMAPE pari a 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 comportato un valore MAPE di 0.3471 e un valore sMAPE di 0.2563. In questo caso, puoi notare che uno spazio di ricerca degli iperparametri più piccolo offre una maggiore precisione 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 rapide e 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ù delle 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 ne richiede meno. Nel frattempo, la modellazione delle tendenze è molto più costosa a livello di calcolo rispetto ad altri componenti delle serie temporali, come la stagionalità. Utilizzando le opzioni di addestramento rapido riportate sopra, puoi modellare in modo efficiente il componente di tendenza con un sottoinsieme della serie temporale, mentre gli altri componenti della serie temporale utilizzano l'intera serie temporale.

L'esempio seguente utilizza l'opzione max_time_series_length per ottenere un addestramento rapido. Se imposti 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 ancora utilizzate per modellare i componenti non di tendenza.

Per creare il modello:

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

    Vai a BigQuery

  2. Nell'editor di query, incolla la seguente query 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';

    La query richiede circa 35 secondi. È tre 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 non di addestramento della query, ad esempio la preelaborazione dei dati, l'aumento di velocità è molto più elevato quando il numero di serie temporali è molto maggiore rispetto a questo esempio. Per un milione di serie temporali, l'aumento di 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 di 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 seguente query 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 pari a 0.3515 e un valore sMAPE pari a 0.2473.

Ricorda che senza l'utilizzo di strategie di addestramento rapido, l'accuratezza della previsione comporta un valore MAPE pari a 0.3337 e un valore sMAPE pari a 0.2337. La differenza tra i due set di valori delle metriche rientra nel 3%, che è statisticamente insignificante.

In breve, hai utilizzato uno spazio di ricerca degli iperparametri più piccolo e strategie di addestramento rapide e intelligenti per rendere l'addestramento del modello più di 20 volte più veloce senza sacrificare l'accuratezza delle previsioni. Come accennato in precedenza, con più serie temporali, l'aumento di velocità delle strategie di addestramento rapido intelligente può essere significativamente maggiore. Inoltre, la libreria ARIMA sottostante utilizzata dai modelli ARIMA_PLUS è stata ottimizzata per essere eseguita 5 volte più velocemente rispetto a prima. Questi miglioramenti consentono la previsione di milioni di serie temporali in poche ore.

Crea un modello per prevedere un milione di serie temporali

In questo passaggio, prevedi le vendite di liquori per oltre 1 milione di prodotti alcolici in diversi negozi utilizzando i dati pubblici sulle vendite di liquori in Iowa. L'addestramento del modello utilizza uno spazio di ricerca degli iperparametri ridotto, nonché 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 seguente query 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.

Eliminare 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. Nella 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 poi fai clic su Elimina.

Elimina il progetto

Per eliminare il progetto:

  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.

Passaggi successivi