Previsione di serie temporali multivariate dai dati sulla qualità dell'aria di Seattle


In questo tutorial imparerai a creare un modello di serie temporali multivariato (ARIMA_PLUS_XREG) per eseguire previsioni di serie temporali utilizzando le seguenti tabelle di esempio dal set di dati epa_historical_air_quality:

Il set di dati epa_historical_air_quality contiene informazioni giornaliere relative al PM 2, 5, alla temperatura e alla velocità del vento raccolte da diverse città degli Stati Uniti.

Obiettivi

In questo tutorial utilizzerai:

  • L'istruzione CREATE MODEL per creare un modello di serie temporale.
  • Funzione ML.ARIMA_EVALUATE: consente di ispezionare le informazioni di valutazione relative all'ARIMA nel modello.
  • La funzione ML.ARIMA_COEFFICIENTS per esaminare i coefficienti del modello.
  • La funzione ML.FORECAST per prevedere gli orari PM 2.5.
  • La funzione ML.EVALUATE per valutare il modello con dati effettivi.
  • La funzione ML.EXPLAIN_FORECAST consente di recuperare i vari componenti delle serie temporali (come stagionalità, tendenze e attribuzioni delle funzionalità) che puoi utilizzare per spiegare i risultati della previsione.

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 2: crea una tabella delle serie temporali con funzionalità extra

I dati relativi a PM 2, 5, temperatura e velocità del vento sono riportati in tabelle separate. Per semplificare le query seguenti, puoi creare una nuova tabella bqml_tutorial.seattle_air_quality_daily unendo queste tabelle con le seguenti colonne:

  • date: la data dell'osservazione
  • PM 2.5: il valore medio di PM 2.5 per ogni giorno
  • vento_velocità: la velocità media del vento per ogni giorno
  • temperatura: la temperatura più alta di ogni giorno

La nuova tabella contiene i dati giornalieri dall'11/08/2009 al 31/01/2022.

Nella seguente query GoogleSQL, la clausola FROM bigquery-public-data.epa_historical_air_quality.*_daily_summary indica che stai eseguendo una query sulle tabelle *_daily_summary nel set di dati epa_historical_air_quality. Queste sono tabelle partizionate.

#standardSQL
CREATE TABLE `bqml_tutorial.seattle_air_quality_daily`
AS
WITH
  pm25_daily AS (
    SELECT
      avg(arithmetic_mean) AS pm25, date_local AS date
    FROM
      `bigquery-public-data.epa_historical_air_quality.pm25_nonfrm_daily_summary`
    WHERE
      city_name = 'Seattle'
      AND parameter_name = 'Acceptable PM2.5 AQI & Speciation Mass'
    GROUP BY date_local
  ),
  wind_speed_daily AS (
    SELECT
      avg(arithmetic_mean) AS wind_speed, date_local AS date
    FROM
      `bigquery-public-data.epa_historical_air_quality.wind_daily_summary`
    WHERE
      city_name = 'Seattle' AND parameter_name = 'Wind Speed - Resultant'
    GROUP BY date_local
  ),
  temperature_daily AS (
    SELECT
      avg(first_max_value) AS temperature, date_local AS date
    FROM
      `bigquery-public-data.epa_historical_air_quality.temperature_daily_summary`
    WHERE
      city_name = 'Seattle' AND parameter_name = 'Outdoor Temperature'
    GROUP BY date_local
  )
SELECT
  pm25_daily.date AS date, pm25, wind_speed, temperature
FROM pm25_daily
JOIN wind_speed_daily USING (date)
JOIN temperature_daily USING (date)

Per eseguire la query, segui questi passaggi:

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

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

  3. Fai clic su Esegui.

(Facoltativo) Passaggio tre: 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. Puoi farlo utilizzando Looker Studio.

Nella seguente query GoogleSQL, la clausola FROM bqml_tutorial.seattle_air_quality_daily indica che stai eseguendo una query sulla tabella seattle_air_quality_daily nel set di dati bqml_tutorial appena creato.

#standardSQL
SELECT
  *
FROM
  `bqml_tutorial.seattle_air_quality_daily`

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
     *
    FROM
     `bqml_tutorial.seattle_air_quality_daily`
    
  3. Fai clic su Esegui.

    Dopo l'esecuzione di questa query, l'output è simile allo screenshot seguente. Nello screenshot puoi vedere che questa serie temporale ha 3960 punti dati. 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 query

    Nel riquadro Grafico, scegli Grafico delle serie temporali:

    Time_series_chart

    Nel riquadro CONFIGURAZIONE, sotto il riquadro Grafico, vai alla sezione Metrica. Aggiungi i campi pm25, temperature e wind_speed, quindi rimuovi la metrica predefinita Record Count (Conteggio record). Puoi anche impostare un intervallo di date personalizzato, ad esempio dal 1° gennaio 2019 al 31 dicembre 2021, per abbreviare le serie temporali. come illustrato nella figura che segue.

    Time_series_data_fields

    Una volta completati questi passaggi, viene visualizzato il seguente grafico. Il grafico mostra che la serie temporale di input ha un modello stagionale settimanale.

    Result_visualization

Passaggio 4: crea il modello delle serie temporali

Quindi, crea un modello di serie temporale utilizzando i dati sulla qualità dell'aria riportati sopra. La seguente query GoogleSQL crea un modello utilizzato per prevedere pm25.

La clausola CREATE MODEL crea e addestra un modello denominato bqml_tutorial.seattle_pm25_xreg_model.

#standardSQL
CREATE OR REPLACE
  MODEL
    `bqml_tutorial.seattle_pm25_xreg_model`
  OPTIONS (
    MODEL_TYPE = 'ARIMA_PLUS_XREG',
    time_series_timestamp_col = 'date',
    time_series_data_col = 'pm25')
AS
SELECT
  date,
  pm25,
  temperature,
  wind_speed
FROM
  `bqml_tutorial.seattle_air_quality_daily`
WHERE
  date
  BETWEEN DATE('2012-01-01')
  AND DATE('2020-12-31')

La clausola OPTIONS(model_type='ARIMA_PLUS_XREG', time_series_timestamp_col='date', ...) indica che stai creando un'ARIMA con un modello con regressori esterni. Per impostazione predefinita, auto_arima=TRUE, l'algoritmo auto.ARIMA ottimizza automaticamente gli iperparametri nei modelli ARIMA_PLUS_XREG. 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.

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 query GoogleSQL riportata sopra nell'area di testo Editor query.

  3. Fai clic su Esegui.

    Il completamento della query richiede circa 20 secondi, dopodiché il modello (seattle_pm25_xreg_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 5: esamina le metriche di valutazione di tutti i modelli valutati

Dopo aver creato il modello, puoi utilizzare la funzione ML.ARIMA_EVALUATE per visualizzare le metriche di valutazione di tutti i modelli candidati valutati durante il processo di ottimizzazione automatica degli iperparametri.

Nella seguente query GoogleSQL, la clausola FROM utilizza la funzione ML.ARIMA_EVALUATE sul tuo modello, bqml_tutorial.seattle_pm25_xreg_model. Per impostazione predefinita, questa query restituisce le metriche di valutazione di tutti i modelli candidati.

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.seattle_pm25_xreg_model`)
    
  3. Fai clic su Esegui.

  4. Al termine della query, fai clic sulla scheda Risultati sotto l'area di testo della query. I risultati dovrebbero essere simili al seguente screenshot:

    Output ML.ARIMA_EVALUATE.

    I risultati includono le seguenti colonne:

    • 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

    Le quattro colonne seguenti (non_seasonal_{p,d,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.

    L'algoritmo auto.ARIMA utilizza innanzitutto il test KPSS per stabilire che il valore migliore di non_seasonal_d è 1. Quando il valore di non_seasonal_d è 1, auto.ARIMA addestra in parallelo 42 diversi modelli ARIMA candidati. Tieni presente che quando non_seasonal_d non è 1, auto.ARIMA addestra 21 diversi modelli candidati. In questo esempio, sono validi tutti i 42 modelli candidati. Di conseguenza, l'output contiene 42 righe, in cui ogni riga è associata a un modello ARIMA candidato. Tieni presente che per alcune serie temporali, alcuni modelli candidati non sono validi in quanto non invertibili o non stazionari. Questi modelli non validi vengono esclusi dall'output, il che renderà l'output meno di 42 righe. Questi modelli candidati sono ordinati in base ad AIC in ordine crescente. Il modello nella prima riga ha l'AIC più basso ed è considerato il modello migliore. Questo modello migliore viene salvato come modello finale e viene utilizzato quando chiami ML.FORECAST, ML.EVALUATE e ML.ARIMA_COEFFICIENTS come mostrato nei passaggi seguenti.

    La colonna seasonal_periods riguarda il pattern stagionale all'interno della serie temporale di input. Poiché non ha nulla a che fare con la modellazione ARIMA, pertanto ha lo stesso valore in tutte le righe di output. Registra un brevetto settimanale, che rientra nelle nostre aspettative, come descritto nel passaggio 2.

    Le colonne has_holiday_effect, has_spikes_and_dips e has_step_changes vengono compilate solo quando decompose_time_series=TRUE. Riguardano l'effetto festività, i picchi e i cali e le variazioni dei passi all'interno delle serie temporali di input, che non sono correlate alla definizione del modello ARIMA. Di conseguenza, sono tutte uguali per tutte le righe di output, ad eccezione dei modelli che hanno avuto esito negativo.

    La colonna error_message mostra il possibile errore riscontrato durante il processo di adattamento di auto.ARIMA. Un possibile motivo potrebbe essere che le colonne non_seasonal_p, non_seasonal_d, non_seasonal_q e has_drift selezionate non sono in grado di stabilizzare le serie temporali. Per recuperare il possibile messaggio di errore di tutti i modelli candidati, imposta show_all_candidate_models=true.

Passaggio 6: esamina i coefficienti del modello

La funzione ML.ARIMA_COEFFICIENTS recupera i coefficienti del modello del tuo modello ARIMA_PLUS, bqml_tutorial.seattle_pm25_xreg_model. ML.ARIMA_COEFFICIENTS prende il modello come unico input.

Esegui la query ML.ARIMA_COEFFICIENTS:

  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.seattle_pm25_xreg_model`)
    
  3. Fai clic su Esegui.

    I risultati dovrebbero avere il seguente aspetto:

    Output ML.ARIMA_COEFFICIENTS.

    I risultati includono le seguenti colonne:

    • ar_coefficients
    • ma_coefficients
    • intercept_or_drift
    • processed_input
    • weight
    • category_weights.category
    • category_weights.weight

    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. Dall'output di ML.ARIMA_EVALUATE, il modello migliore nella riga superiore ha non_seasonal_p pari a 0 e non_seasonal_q pari a 5. Pertanto, ar_coefficients è un array vuoto e ma_coefficients è un array length-5. intercept_or_drift è il termine costante nel modello ARIMA.

    processed_input e le colonne weight e category_weights corrispondenti mostrano le ponderazioni di ogni caratteristica e l'intercetta nel modello di regressione lineare. Se la caratteristica è una caratteristica numerica, la ponderazione è indicata nella colonna weight. Se l'elemento è un elemento di categoria, category_weights è un ARRAY di STRUCT, dove STRUCT contiene i nomi e le ponderazioni delle categorie.

Passaggio 7: utilizza il modello per prevedere le serie temporali

La funzione ML.FORECAST prevede i valori delle serie temporali future con un intervallo di previsione utilizzando i valori del modello bqml_tutorial.seattle_pm25_xreg_model e delle caratteristiche future.

Nella seguente query GoogleSQL, la clausola STRUCT(30 AS horizon, 0.8 AS confidence_level) indica che la query prevede 30 punti temporali futuri e genera un intervallo di previsione con un livello di confidenza dell'80%. ML.FORECAST prende il modello, i valori delle caratteristiche futuri e 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.seattle_pm25_xreg_model`,
    STRUCT(30 AS horizon, 0.8 AS confidence_level),
    (
      SELECT
        date,
        temperature,
        wind_speed
      FROM
        `bqml_tutorial.seattle_air_quality_daily`
      WHERE
        date > DATE('2020-12-31')
    ))
    
  3. Fai clic su Esegui.

    I risultati dovrebbero avere il seguente aspetto:

    Output ML.FORECAST.

    I risultati includono le seguenti colonne:

    • forecast_timestamp
    • forecast_value
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_upper_bound

    Le righe di output sono ordinate in ordine cronologico di forecast_timestamp. Nella previsione di serie temporali, l'intervallo di previsione, che viene 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.

Passaggio 8: valuta l'accuratezza delle previsioni con i dati effettivi

Per valutare l'accuratezza della previsione con i dati effettivi, puoi utilizzare la funzione ML.EVALUATE con il tuo modello, bqml_tutorial.seattle_pm25_xreg_model e la tabella di dati effettiva.

Per eseguire la query ML.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.EVALUATE(
    MODEL `bqml_tutorial.seattle_pm25_xreg_model`,
    (
      SELECT
        date,
        pm25,
        temperature,
        wind_speed
      FROM
        `bqml_tutorial.seattle_air_quality_daily`
      WHERE
        date > DATE('2020-12-31')
    ),
    STRUCT(
      TRUE AS perform_aggregation,
      30 AS horizon))
    

    Il secondo parametro riguarda i dati effettivi con le caratteristiche future, che vengono utilizzati per prevedere i valori futuri da confrontare con i dati effettivi. Il terzo parametro è uno struct di parametri per questa funzione.

  3. Fai clic su Esegui.

    I risultati dovrebbero avere il seguente aspetto:

    l'output ML.EVALUATE.

Passaggio 9. Spiega i risultati della previsione

Per comprendere come viene prevista la serie temporale, la funzione ML.EXPLAIN_FORECAST prevede i valori delle serie temporali future con un intervallo di previsione utilizzando il modello bqml_tutorial.seattle_pm25_xreg_model e allo stesso tempo restituisce tutti i componenti separati della serie temporale.

Come la funzione ML.FORECAST, la clausola STRUCT(30 AS horizon, 0.8 AS confidence_level) indica che la query prevede 30 punti temporali futuri e genera un intervallo di previsione con una confidenza dell'80%. La funzione ML.EXPLAIN_FORECAST prende come input il modello, i valori futuri delle funzionalità 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.seattle_pm25_xreg_model`,
        STRUCT(30 AS horizon, 0.8 AS confidence_level),
        (
          SELECT
            date,
            temperature,
            wind_speed
          FROM
            `bqml_tutorial.seattle_air_quality_daily`
          WHERE
            date > DATE('2020-12-31')
        ))
    
  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:

    • 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
    • attribution_temperature
    • attribution_wind_speed
    • attribution___INTERCEPT__

    Le righe di output sono ordinate in ordine cronologico di time_series_timestamp. I diversi componenti sono elencati come colonne dell'output. Per maggiori informazioni, consulta ML.EXPLAIN_FORECAST.

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