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:
- Creare un modello di serie temporali utilizzando l'istruzione
CREATE MODEL. - Valutare l'accuratezza del modello utilizzando la funzione
ML.EVALUATE. - Utilizza le opzioni
AUTO_ARIMA_MAX_ORDER,TIME_SERIES_LENGTH_FRACTION,MIN_TIME_SERIES_LENGTHeMAX_TIME_SERIES_LENGTHdell'istruzioneCREATE MODELper ridurre in modo significativo il tempo di addestramento del modello.
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
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
- 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.
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.createbigquery.models.createbigquery.models.getDatabigquery.models.updateData
Per eseguire l'inferenza, devi disporre delle seguenti autorizzazioni:
bigquery.models.getDatabigquery.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
Nella console Google Cloud , vai alla pagina BigQuery.
Nel riquadro a sinistra, fai clic su Explorer:

Se non vedi il riquadro a sinistra, fai clic su Espandi riquadro sinistro per aprirlo.
In Explorer, espandi il progetto, quindi fai clic su Set di dati.
Nella pagina Set di dati, fai clic su Crea set di dati.
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.
Fai clic su Crea set di dati.
bq
Per creare un nuovo set di dati, utilizza il
comando bq mk --dataset.
Crea un set di dati denominato
bqml_tutorialcon la località dei dati impostata suUS:bq mk --dataset \ --location=US \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
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:
Nella console Google Cloud , vai alla pagina BigQuery.
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:
Nella console Google Cloud , vai alla pagina BigQuery.
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:
Nella console Google Cloud , vai alla pagina BigQuery.
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:
La clausola
TABLEnella funzioneML.EVALUATEidentifica 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_seriescontiene 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
STRUCTnella funzioneML.EVALUATEha specificato i parametri per la funzione. Il valorehorizonè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 valoreperform_aggregationèTRUE, il che significa che le metriche di accuratezza della previsione vengono aggregate in base alle metriche nel momento specifico. Se specifichi un valoreperform_aggregationdiFALSE, 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:
Nella console Google Cloud , vai alla pagina BigQuery.
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:
Nella console Google Cloud , vai alla pagina BigQuery.
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_orderera5, quindi questa modifica migliora la velocità di addestramento del modello di circa 7 volte. Se ti chiedi perché l'aumento della velocità non è di5/2=2.5x, è perché quando il valoreauto_arima_max_orderaumenta, 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:
Nella console Google Cloud , vai alla pagina BigQuery.
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:
Nella console Google Cloud , vai alla pagina BigQuery.
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:
Nella console Google Cloud , vai alla pagina BigQuery.
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:
Nella console Google Cloud , vai alla pagina BigQuery.
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:
Se necessario, apri la pagina BigQuery nella consoleGoogle Cloud .
Nel riquadro di navigazione, fai clic sul set di dati bqml_tutorial che hai creato.
Fai clic su Elimina set di dati per eliminare il set di dati, la tabella e tutti i dati.
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:
- Nella console Google Cloud , vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID progetto, quindi fai clic su Chiudi per eliminare il progetto.
Passaggi successivi
- Scopri come prevedere una singola serie temporale con un modello univariato
- Scopri come prevedere una singola serie temporale con un modello multivariato
- Scopri come prevedere più serie temporali con un modello univariato
- Scopri come prevedere gerarchicamente più serie temporali con un modello univariato
- Per una panoramica di BigQuery ML, consulta Introduzione all'AI e al ML in BigQuery.