使用多變數模型預測單一時間序列

本教學課程說明如何使用多元時間序列模型,根據多個輸入特徵的歷史值,預測特定資料欄的未來值。

本教學課程會預測單一時間序列。系統會針對輸入資料中的每個時間點計算一次預測值。

本教學課程使用bigquery-public-data.epa_historical_air_quality公開資料集中的資料。這個資料集包含從美國多個城市收集的每日懸浮微粒 (PM2.5)、溫度和風速資訊。

建立資料集

建立 BigQuery 資料集來儲存機器學習模型。

控制台

  1. 前往 Cloud de Confiance 控制台的「BigQuery」頁面。

    前往 BigQuery 頁面

  2. 在「Explorer」窗格中,按一下專案名稱。

  3. 依序點按 「View actions」(查看動作) >「Create dataset」(建立資料集)

  4. 在「建立資料集」頁面中,執行下列操作:

    • 在「Dataset ID」(資料集 ID) 中輸入 bqml_tutorial

    • 針對「Location type」(位置類型) 選取「Multi-region」(多區域),然後選取「US (multiple regions in United States)」(us (多個美國區域))

    • 其餘設定請保留預設狀態,然後按一下「建立資料集」

bq

如要建立新的資料集,請使用 bq mk 指令搭配 --location 旗標。如需可能的完整參數清單,請參閱 bq mk --dataset 指令參考資料。

  1. 建立名為「bqml_tutorial」的資料集,並將資料位置設為「US」,說明則設為「BigQuery ML tutorial dataset」:

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

    這個指令採用 -d 捷徑,而不是使用 --dataset 旗標。如果您省略 -d--dataset,該指令預設會建立資料集。

  2. 確認資料集已建立完成:

    bq ls

API

請呼叫 datasets.insert 方法,搭配已定義的資料集資源

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

BigQuery DataFrames

在嘗試這個範例之前,請按照使用 BigQuery DataFrames 的 BigQuery 快速入門導覽課程中的 BigQuery DataFrames 設定說明操作。 詳情請參閱 BigQuery DataFrames 參考說明文件

如要驗證 BigQuery,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定 ADC」。

import google.cloud.bigquery

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

建立輸入資料表

建立資料表,用來訓練及評估模型。這個資料表會合併 bigquery-public-data.epa_historical_air_quality 資料集中的多個資料欄,以提供每日天氣資料。您也會建立下列資料欄,做為模型的輸入變數:

  • date:觀察日期
  • pm25 每日平均 PM2.5 值
  • wind_speed:每天的平均風速
  • temperature:每天的最高溫

在下列 GoogleSQL 查詢中,FROM bigquery-public-data.epa_historical_air_quality.*_daily_summary 子句表示您正在查詢 epa_historical_air_quality 資料集中的 *_daily_summary 資料表。這些資料表是分區資料表

請按照下列步驟建立輸入資料表:

  1. 前往 Cloud de Confiance 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

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

以視覺化方式呈現輸入資料

建立模型前,您可以選擇將輸入的時間序列資料視覺化,瞭解資料分布情形。您可以使用 Looker Studio 執行這項操作。

請按照下列步驟,以視覺化方式呈現時間序列資料:

  1. 前往 Cloud de Confiance 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

    SELECT
      *
    FROM
      `bqml_tutorial.seattle_air_quality_daily`;
  3. 查詢完成後,依序點按「探索資料」>「透過 Looker Studio 探索」。Looker Studio 會在新分頁中開啟,在新分頁中完成下列步驟。

  4. 在 Looker Studio 中,依序點選「插入」>「時間序列圖表」

  5. 在「圖表」窗格中,選擇「設定」分頁。

  6. 在「指標」專區中,新增「pm25」、「temperature」和「wind_speed」欄位,並移除預設的「記錄數」指標。產生的圖表看起來類似下列內容:

    顯示一段時間內的天氣狀況。

    從圖表可以看出,輸入時間序列具有每週季節性模式。

建立時間序列模型

使用 pm25wind_speedtemperature 資料欄值做為輸入變數,建立時間序列模型來預測以 pm25 資料欄表示的懸浮微粒值。在bqml_tutorial.seattle_air_quality_daily表格的空氣品質資料上訓練模型,並選取 2012 年 1 月 1 日至 2020 年 12 月 31 日之間收集的資料。

在下列查詢中,OPTIONS(model_type='ARIMA_PLUS_XREG', time_series_timestamp_col='date', ...) 子句表示您要建立具有外部迴歸因子的 ARIMA 模型。CREATE MODEL 陳述式的 auto_arima 選項預設為 TRUE,因此 auto.ARIMA 演算法會自動調整模型中的超參數。演算法會套用數十個候選模型,並選擇最佳模型,也就是赤池訊息量準則 (AIC) 最低的模型。CREATE MODEL 陳述式的data_frequency 選項預設為 AUTO_FREQUENCY,因此訓練程序會自動推斷輸入時間序列的資料頻率。

請按照下列步驟建立模型:

  1. 前往 Cloud de Confiance 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

    CREATE OR REPLACE
      MODEL
        `bqml_tutorial.seattle_pm25_xreg_model`
      OPTIONS (
        MODEL_TYPE = 'ARIMA_PLUS_XREG',
        time_series_timestamp_col = 'date',  # Identifies the column that contains time points
        time_series_data_col = 'pm25')       # Identifies the column to forecast
    AS
    SELECT
      date,                                  # The column that contains time points
      pm25,                                  # The column to forecast
      temperature,                           # Temperature input to use in forecasting
      wind_speed                             # Wind speed input to use in forecasting
    FROM
      `bqml_tutorial.seattle_air_quality_daily`
    WHERE
      date
      BETWEEN DATE('2012-01-01')
      AND DATE('2020-12-31');

    查詢作業約需 20 秒才能完成,完成後您就能存取 seattle_pm25_xreg_model 模型。由於查詢是使用 CREATE MODEL 陳述式建立模型,因此您看不到查詢結果。

評估候選模型

使用 ML.ARIMA_EVALUATE 函式評估時間序列模型。ML.ARIMA_EVALUATE 函式會顯示自動超參數調整程序中評估的所有候選模型評估指標。

請按照下列步驟評估模型:

  1. 前往 Cloud de Confiance 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

    SELECT
     *
    FROM
     ML.ARIMA_EVALUATE(MODEL `bqml_tutorial.seattle_pm25_xreg_model`);

    結果應如下所示:

    時間序列模型的評估指標。

    non_seasonal_pnon_seasonal_dnon_seasonal_qhas_drift 輸出資料欄會在訓練管道中定義 ARIMA 模型。log_likelihoodAICvariance 輸出資料欄與 ARIMA 模型擬合程序相關。

    auto.ARIMA 演算法會使用 KPSS 測試判斷 non_seasonal_d 的最佳值,在本例中為 1。當 non_seasonal_d1 時,auto.ARIMA 演算法會平行訓練 42 個不同的候選 ARIMA 模型。在本例中,所有 42 個候選模型都有效,因此輸出內容包含 42 個資料列,每個資料列對應一個候選 ARIMA 模型;如果部分模型無效,則會從輸出內容中排除。系統會按照 AIC 遞增順序傳回這些候選模型。第一列中的模型 AIC 最低,因此視為最佳模型。最佳模型會儲存為最終模型,並在您對模型呼叫 ML.FORECAST 等函式時使用。

    seasonal_periods 欄包含時間序列資料中識別出的季節性模式相關資訊。這與 ARIMA 建模無關,因此所有輸出資料列的值都相同。這份報表顯示每週模式,與您選擇將輸入資料視覺化時看到的結果一致。

    has_holiday_effecthas_spikes_and_dipshas_step_changes 欄提供輸入時間序列資料的相關資訊,與 ARIMA 模型建立功能無關。系統傳回這些資料欄,是因為 CREATE MODEL 陳述式中的 decompose_time_series 選項值為 TRUE。所有輸出資料列的這些資料欄值也相同。

    error_message」欄會顯示在auto.ARIMA調整過程中發生的任何錯誤。如果所選的 non_seasonal_pnon_seasonal_dnon_seasonal_qhas_drift 欄無法穩定時間序列,就可能發生錯誤。如要擷取所有候選模型的錯誤訊息,請在建立模型時,將 show_all_candidate_models 選項設為 TRUE

    如要進一步瞭解輸出資料欄,請參閱 ML.ARIMA_EVALUATE 函式

檢查模型的係數

使用 ML.ARIMA_COEFFICIENTS 函式檢查時間序列模型的係數。

請按照下列步驟擷取模型的係數:

  1. 前往 Cloud de Confiance 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

    SELECT
     *
    FROM
     ML.ARIMA_COEFFICIENTS(MODEL `bqml_tutorial.seattle_pm25_xreg_model`);

    結果應如下所示:

    時間序列模型的係數。

    ar_coefficients 輸出資料欄會顯示 ARIMA 模型自迴歸 (AR) 部分的模型係數。同樣地,ma_coefficients 輸出資料欄會顯示 ARIMA 模型移動平均 (MA) 部分的模型係數。這兩個資料欄都包含陣列值,長度分別等於 non_seasonal_pnon_seasonal_q。您在 ML.ARIMA_EVALUATE 函式的輸出內容中看到,最佳模型的 non_seasonal_p 值為 0non_seasonal_q 值為 5。因此,在 ML.ARIMA_COEFFICIENTS 輸出中,ar_coefficients 值為空陣列,而 ma_coefficients 值為 5 個元素的陣列。intercept_or_drift 值是 ARIMA 模型中的常數項。

    processed_inputweightcategory_weights 輸出資料欄會顯示線性迴歸模型中每個特徵的權重和截距。如果特徵是數值特徵,權重會顯示在 weight 欄中。如果特徵是類別特徵,則 category_weights 值為結構值陣列,其中每個結構值都包含特定類別的名稱和權重。

    如要進一步瞭解輸出資料欄,請參閱 ML.ARIMA_COEFFICIENTS 函式

使用模型預測資料

使用 ML.FORECAST 函式預測未來時間序列值。

在下列 GoogleSQL 查詢中,STRUCT(30 AS horizon, 0.8 AS confidence_level) 子句表示查詢會預測未來 30 個時間點,並產生信賴水準為 80% 的預測間隔。

如要使用模型預測資料,請按照下列步驟操作:

  1. 前往 Cloud de Confiance 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

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

    結果應如下所示:

    時間序列模型預測結果。

    輸出資料列會依 forecast_timestamp 欄值依時間順序排列。在時間序列預測中,預測間隔 (以 prediction_interval_lower_boundprediction_interval_upper_bound 欄值表示) 與 forecast_value 欄值同樣重要。forecast_value 值是預測間隔的中間點。預測區間取決於 standard_errorconfidence_level 欄的值。

    如要進一步瞭解輸出資料欄,請參閱 ML.FORECAST 函式

評估預測準確率

使用 ML.EVALUATE 函式評估模型的預測準確率。

在下列 GoogleSQL 查詢中,第二個 SELECT 陳述式提供含有未來特徵的資料,用於預測未來值,以便與實際資料比較。

請按照下列步驟評估模型準確率:

  1. 前往 Cloud de Confiance 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

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

    結果應如下所示:

    模型的評估指標。

    如要進一步瞭解輸出資料欄,請參閱 ML.EVALUATE 函式

說明預測結果

您可以使用 ML.EXPLAIN_FORECAST 函式,除了取得預測資料,還能取得可解釋性指標。ML.EXPLAIN_FORECAST 函式會預測未來時間序列值,並傳回時間序列的所有個別元件。

ML.FORECAST 函式類似,ML.EXPLAIN_FORECAST 函式中使用的 STRUCT(30 AS horizon, 0.8 AS confidence_level) 子句表示查詢會預測未來 30 個時間點,並產生信賴度為 80% 的預測間隔。

請按照下列步驟說明模型的結果:

  1. 前往 Cloud de Confiance 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

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

    結果應如下所示:

    預測資料和預測說明的前九個輸出資料欄。 預測資料和預測說明的第 10 到第 17 個輸出資料欄。 預測資料和預測說明的最後六個輸出資料欄。

    輸出資料列會依 time_series_timestamp 資料欄值的時間順序排序。

    如要進一步瞭解輸出資料欄,請參閱 ML.EXPLAIN_FORECAST 函式