Previsione di più serie temporali con una singola query per i viaggi di NYC Citi Bike


In questo tutorial imparerai a creare un insieme di modelli di serie temporali per eseguire più previsioni di serie temporali con una singola query. Imparerai inoltre ad applicare diverse strategie di addestramento rapido per accelerare in modo significativo la query e a valutare l'accuratezza delle previsioni. Utilizzerai i dati di new_york.citibike_trips. Questi dati contengono informazioni sulle corse Citi bike a New York City.

Prima di leggere questo tutorial, ti consigliamo vivamente di leggere Previsione di singole serie temporali a partire dai dati di Google Analytics.

Obiettivi

In questo tutorial utilizzerai:

  • L'istruzione CREATE MODEL: per creare un modello di serie temporale o un insieme di modelli di serie temporali.
  • La funzione ML.ARIMA_EVALUATE per valutare il modello.
  • La funzione ML.ARIMA_COEFFICIENTS per esaminare i coefficienti del modello.
  • Funzione ML.EXPLAIN_FORECAST: consente di recuperare i vari componenti delle serie temporali (come stagionalità e tendenza) che possono essere utilizzati per spiegare i risultati della previsione.
  • Looker Studio: per visualizzare i risultati della previsione.
  • (Facoltativo) La funzione ML.FORECAST per prevedere le visite totali giornaliere.

Costi

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

  • BigQuery
  • BigQuery ML

Per ulteriori informazioni sui costi di BigQuery, consulta la pagina Prezzi di BigQuery.

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

Prima di iniziare

  1. Accedi al tuo account Google Cloud. 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 gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  5. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

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

    Attiva l'API BigQuery.

    Abilita l'API

Passaggio 1: crea il set di dati

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

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

    Vai alla pagina di BigQuery

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

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

    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 Più regioni e poi Stati Uniti (più regioni negli Stati Uniti).

      I set di dati pubblici vengono archiviati in US più regioni. Per semplicità, memorizza il set di dati nella stessa posizione.

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

      Pagina Crea set di dati.

Passaggio due (facoltativo): visualizza le serie temporali per le quali vuoi eseguire la previsione

Prima di creare il modello, è utile vedere l'aspetto delle serie temporali di input. A questo scopo, puoi utilizzare Looker Studio.

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

Nell'istruzione SELECT, la 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 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 console Google Cloud, fai clic sul pulsante Crea nuova query.

  2. Inserisci la seguente query GoogleSQL nell'area di testo Editor 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.

    Dopo l'esecuzione della query, l'output è simile allo screenshot seguente. Nello screenshot puoi vedere che questa serie temporale ha 1184 punti dati giornalieri, che coprono più di 4 anni. Fai clic sul pulsante Esplora i dati e poi su Esplora con Looker Studio. Looker Studio si apre in una nuova scheda. Completa i seguenti passaggi nella nuova scheda.

    Output della query.

  4. Nel riquadro Grafico, scegli Grafico delle serie temporali:

    Grafico_delle_serie_temporali.

  5. Nel riquadro Dati, sotto il riquadro Grafico, vai alla sezione Metrica. Aggiungi il campo num_trips e rimuovi la metrica predefinita Conteggio record:

    Time_series_data_fields.

    Dopo aver completato il passaggio precedente, viene visualizzato il seguente grafico. Il grafico mostra che la serie temporale di input ha pattern sia settimanali che annuali. Anche le serie temporali sono in aumento.

    Visualizzazione_risultati.

Passaggio tre: crea un modello di serie temporali per eseguire previsioni su singole serie temporali

Quindi, crea un modello di serie temporale utilizzando i dati dei viaggi Citi bike di New York.

La seguente query GoogleSQL crea un modello utilizzato per prevedere le corse giornaliere totali in bicicletta. La clausola CREATE MODEL 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'
  ) AS
SELECT
   EXTRACT(DATE from starttime) AS date,
   COUNT(*) AS num_trips
FROM
  `bigquery-public-data.new_york.citibike_trips`
GROUP BY date

La clausola OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) indica che stai creando un modello di serie temporale basato su ARIMA. Per impostazione predefinita, auto_arima=TRUE, l'algoritmo auto.ARIMA ottimizza automaticamente gli iperparametri nei modelli ARIMA_PLUS. L'algoritmo si adatta a decine di modelli candidati e sceglie il migliore con il criterio informativo di Akaike (AIC) più basso. Inoltre, poiché il valore predefinito è data_frequency='AUTO_FREQUENCY', il processo di addestramento deduce automaticamente la frequenza dei dati delle serie temporali di input. Infine, l'istruzione CREATE MODEL utilizza decompose_time_series=TRUE per impostazione predefinita e gli utenti possono comprendere ulteriormente come viene prevista la serie temporale recuperando i componenti separati delle serie temporali, come i periodi stagionali e l'effetto festività.

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

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

  2. Inserisci la seguente query GoogleSQL nell'area di testo Editor 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'
      ) AS
    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.

    Il completamento della query richiede circa 17 secondi, dopodiché il modello (nyc_citibike_arima_model) viene visualizzato nel pannello di navigazione. Poiché la query utilizza un'istruzione CREATE MODEL per creare un modello, non vedi i risultati della query.

Passaggio 4: prevedi le serie temporali e visualizza i risultati

Per spiegare come viene prevista la serie temporale, utilizza la funzione ML.EXPLAIN_FORECAST per visualizzare tutti i componenti delle serie secondarie, come stagionalità e tendenza.

Per farlo, segui questi passaggi:

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

  2. Inserisci la seguente query GoogleSQL nell'area di testo Editor query.

    #standardSQL
    SELECT
      *
    FROM
      ML.EXPLAIN_FORECAST(MODEL `bqml_tutorial.nyc_citibike_arima_model`,
                          STRUCT(365 AS horizon, 0.9 AS confidence_level))
    
  3. Fai clic su Esegui.

  4. Al termine della query, fai clic sul pulsante Esplora i dati e poi su Esplora con Looker Studio. Si apre una nuova scheda nel browser. Nel riquadro Grafico, individua l'icona del Grafico delle serie temporali e fai clic su questa icona, come mostrato nello screenshot seguente.

    Grafico_delle_serie_temporali.

  5. Nel riquadro Dati, procedi nel seguente modo:

    1. Nella sezione Dimensione intervallo di date, seleziona time_series_timestamp (Date).
    2. Nella sezione Dimensione, seleziona time_series_timestamp (Date).
    3. Nella sezione Metrica, rimuovi la metrica predefinita Record Count e aggiungi quanto segue:
      • time_series_data
      • prediction_interval_lower_bound
      • prediction_interval_upper_bound
      • trend
      • seasonal_period_yearly
      • seasonal_period_weekly
      • spikes_and_dips
      • step_changes

    Grafico_delle_serie_temporali.

  6. Nel riquadro Stile, scorri verso il basso fino all'opzione Dati mancanti e utilizza Interruzioni di riga anziché Riga a zero.

    Sezione_Stile.

    Dopo aver completato questi passaggi, nel riquadro di sinistra viene visualizzato il seguente grafico.

    Visualizzazione_risultati.

Passaggio 5: prevedi più serie temporali contemporaneamente

Successivamente, potresti voler prevedere il numero totale giornaliero di corse a partire da diverse stazioni di Citi bike. Per farlo, devi prevedere molte serie temporali. Puoi scrivere più query CREATE MODEL, ma questo può essere un processo noioso e dispendioso in termini di tempo, soprattutto quando devi gestire un numero elevato di serie temporali.

Per migliorare questo processo, BigQuery ML consente di creare un insieme di modelli di serie temporali per prevedere più serie temporali utilizzando una singola query. Inoltre, tutti i modelli delle serie temporali vengono montati contemporaneamente.

Nella seguente query GoogleSQL, la clausola CREATE MODEL crea e addestra un insieme di modelli denominato bqml_tutorial.nyc_citibike_arima_model_group.

 #standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_group`
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 = 5
  ) AS
SELECT
   start_station_name,
   EXTRACT(DATE from starttime) AS date,
   COUNT(*) AS num_trips
FROM
  `bigquery-public-data.new_york.citibike_trips`
WHERE start_station_name LIKE '%Central Park%'
GROUP BY start_station_name, date

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. Oltre a time_series_timestamp_col e time_series_data_col, devi specificare time_series_id_col, che viene utilizzato per annotare diverse serie temporali di input. L'opzione auto_arima_max_order controlla lo spazio di ricerca per l'ottimizzazione degli iperparametri nell'algoritmo auto.ARIMA. Infine, l'istruzione CREATE MODEL utilizza decompose_time_series=TRUE per impostazione predefinita e gli utenti possono comprendere ulteriormente in che modo le serie temporali vengono analizzate nella pipeline di addestramento recuperando i risultati della decomposizione.

La clausola SELECT ... FROM ... GROUP BY ... indica che crei più serie temporali, ciascuna associata a un start_station_name diverso. Per semplicità, utilizza la clausola WHERE ... LIKE ... per limitare le stazioni di partenza a quelle contenenti Central Park nel nome.

Per eseguire la query CREATE MODEL al fine di creare e addestrare il modello, segui questi passaggi:

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

  2. Inserisci la seguente query GoogleSQL nell'area di testo Editor query.

    #standardSQL
    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_group`
    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 = 5
      ) AS
    SELECT
       start_station_name,
       EXTRACT(DATE from starttime) AS date,
       COUNT(*) AS num_trips
    FROM
      `bigquery-public-data.new_york.citibike_trips`
    WHERE start_station_name LIKE '%Central Park%'
    GROUP BY start_station_name, date
    
  3. Fai clic su Esegui.

    Il completamento della query richiede circa 24 secondi, dopodiché il modello (nyc_citibike_arima_model_group) viene visualizzato nel pannello di navigazione. Poiché la query utilizza un'istruzione CREATE MODEL, non vedi i risultati della query.

Passaggio 6: esamina le metriche di valutazione dell'insieme di modelli di serie temporali

Dopo aver creato i modelli, puoi utilizzare la funzione ML.ARIMA_EVALUATE per vedere le metriche di valutazione di tutti i modelli creati.

Nella seguente query GoogleSQL, la clausola FROM utilizza la funzione ML.ARIMA_EVALUATE sul tuo modello, bqml_tutorial.nyc_citibike_arima_model_group. Le metriche di valutazione dipendono solo dall'input di addestramento, quindi il tuo modello è l'unico input.

Per eseguire la query ML.ARIMA_EVALUATE, segui questi passaggi:

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

  2. Inserisci la seguente query GoogleSQL nell'area di testo Editor query.

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_group`)
    
  3. Fai clic su Esegui.

  4. Il completamento della query richiede meno di un secondo. Quando la query è completa, fai clic sulla scheda Risultati sotto l'area di testo della query. I risultati dovrebbero essere simili ai seguenti:

    l'output ML.EVALUATE.

    I risultati includono le seguenti colonne:

    • start_station_name
    • non_seasonal_p
    • non_seasonal_d
    • non_seasonal_q
    • has_drift
    • log_likelihood
    • AIC
    • variance
    • seasonal_periods
    • has_holiday_effect
    • has_spikes_and_dips
    • has_step_changes
    • error_message

    start_station_name, la prima colonna, annota le serie temporali a cui si riferisce ogni modello di serie temporale. È uguale a quello specificato da time_series_id_col.

    Le seguenti quattro colonne (non_seasonal_p, non_seasonal_d, non_seasonal_q e has_drift) definiscono un modello ARIMA nella pipeline di addestramento. Le tre metriche successive (log_likelihood, AIC e variance) sono pertinenti al processo di adattamento del modello ARIMA. Il processo di adattamento determina il modello ARIMA migliore utilizzando l'algoritmo auto.ARIMA, uno per ogni serie temporale.

    Le colonne has_holiday_effect, has_spikes_and_dips e has_step_changes vengono compilate solo quando decompose_time_series=TRUE.

    La colonna seasonal_periods indica il pattern stagionale all'interno della serie temporale di input. Ogni serie temporale può avere schemi stagionali diversi. Ad esempio, dalla figura, puoi vedere che una serie temporale ha uno schema annuale, mentre le altre no.

Passaggio 7: esamina i coefficienti dei tuoi modelli

La funzione ML.ARIMA_COEFFICIENTS viene utilizzata per recuperare i coefficienti del modello del tuo modello ARIMA_PLUS, bqml_tutorial.nyc_citibike_arima_model_group. ML.ARIMA_COEFFICIENTS prende il modello come unico input.

Per eseguire la query ML.ARIMA_COEFFICIENTS, segui questi passaggi:

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

  2. Inserisci la seguente query GoogleSQL nell'area di testo Editor query.

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_COEFFICIENTS(MODEL `bqml_tutorial.nyc_citibike_arima_model_group`)
    
  3. Fai clic su Esegui.

    Il completamento della query richiede meno di un secondo. I risultati dovrebbero essere simili al seguente screenshot:

    Output ML.ARIMA_COEFFICIENTS.

    I risultati includono le seguenti colonne:

    • start_station_name
    • ar_coefficients
    • ma_coefficients
    • intercept_or_drift

    start_station_name, la prima colonna, annota le serie temporali in base a cui si applica ogni modello di serie temporale.

    ar_coefficients mostra i coefficienti della parte autoregressiva (AR) del modello ARIMA. Allo stesso modo, ma_coefficients mostra i coefficienti del modello della parte con media mobile (MA). Sono entrambi array, le cui lunghezze sono rispettivamente pari a non_seasonal_p e non_seasonal_q. intercept_or_drift è il termine costante nel modello ARIMA.

Passaggio 8: utilizza il modello per prevedere più serie temporali in contemporanea con le spiegazioni

La funzione ML.EXPLAIN_FORECAST prevede i valori delle serie temporali future con un intervallo di previsione utilizzando il modello bqml_tutorial.nyc_citibike_arima_model_group e allo stesso tempo restituisce tutti i componenti separati della serie temporale.

La clausola STRUCT(3 AS horizon, 0.9 AS confidence_level) indica che la query prevede tre punti temporali futuri e genera un intervallo di previsione con una confidenza del 90%. La funzione ML.EXPLAIN_FORECAST accetta il modello e un paio di argomenti facoltativi.

Per eseguire la query ML.EXPLAIN_FORECAST, segui questi passaggi:

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

  2. Inserisci la seguente query GoogleSQL nell'area di testo Editor query.

    #standardSQL
    SELECT
     *
    FROM
     ML.EXPLAIN_FORECAST(MODEL `bqml_tutorial.nyc_citibike_arima_model_group`,
                         STRUCT(3 AS horizon, 0.9 AS confidence_level))
    
  3. Fai clic su Esegui.

    Il completamento della query richiede meno di un secondo. I risultati dovrebbero avere il seguente aspetto:

    Output1 di ML.EXPLAIN_FORECAST. Output ML.EXPLAIN_FORECAST 2.

    I risultati includono le seguenti colonne:

    • start_station_name
    • time_series_timestamp
    • time_series_type
    • time_series_data
    • time_series_adjusted_data
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_lower_bound
    • trend
    • seasonal_period_yearly
    • seasonal_period_quarterly
    • seasonal_period_monthly
    • seasonal_period_weekly
    • seasonal_period_daily
    • holiday_effect
    • spikes_and_dips
    • step_changes
    • residual

    Le righe di output sono ordinate in base a start_station_name e per ogni start_station_name, le righe di output sono in ordine cronologico time_series_timestamp. I diversi componenti sono elencati come colonne dell'output. Per maggiori informazioni, consulta la definizione di ML.EXPLAIN_FORECAST.

(Facoltativo) Passaggio 9: utilizza il modello per prevedere più serie temporali contemporaneamente

La funzione ML.FORECAST può essere utilizzata anche per prevedere i valori delle serie temporali future con un intervallo di previsione utilizzando il modello, bqml_tutorial.nyc_citibike_arima_model_group.

Come ML.EXPLAIN_FORECAST, la clausola STRUCT(3 AS horizon, 0.9 AS confidence_level) indica che, per ogni serie temporale, la query prevede tre punti temporali futuri e genera un intervallo di previsione con una confidenza del 90%.

La funzione ML.FORECAST prende il modello, oltre a un paio di argomenti facoltativi.

Per eseguire la query ML.FORECAST, segui questi passaggi:

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

  2. Inserisci la seguente query GoogleSQL nell'area di testo Editor query.

    #standardSQL
    SELECT
     *
    FROM
     ML.FORECAST(MODEL `bqml_tutorial.nyc_citibike_arima_model_group`,
                 STRUCT(3 AS horizon, 0.9 AS confidence_level))
    
  3. Fai clic su Esegui.

    Il completamento della query richiede meno di un secondo. I risultati dovrebbero avere il seguente aspetto:

    Output ML.FORECAST.

    I risultati includono le seguenti colonne:

    • start_station_name
    • forecast_timestamp
    • forecast_value
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_upper_bound
    • confidence_interval_lower_bound (a breve)
    • confidence_interval_upper_bound (a breve)

    La prima colonna, start_station_name, annota le serie temporali in cui si applica ogni modello di serie temporale. Ogni start_station_name ha un numero di righe horizon per i risultati di previsione.

    Per ogni start_station_name, le righe di output sono ordinate in ordine cronologico di forecast_timestamp. Nelle previsioni di serie temporali, l'intervallo di previsione, acquisito dai limiti inferiore e superiore, è importante quanto forecast_value. forecast_value è il punto centrale dell'intervallo di previsione. L'intervallo di previsione dipende da standard_error e confidence_level.

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 mantenere 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 che hai creato in questo tutorial:

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

    Vai alla pagina di BigQuery

  2. Nella barra 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), quindi 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 del progetto e fai clic su Chiudi per eliminare il progetto.

Passaggi successivi