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


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

本教學課程將針對多個時間序列進行預測。系統會針對一或多個指定欄中的每個值,為每個時間點計算預測值。舉例來說,如果您想預測天氣並指定包含狀態資料的資料欄,預測資料就會包含狀態 A 的所有時間點預測資料,然後是狀態 B 的所有時間點預測值,依此類推。如果您想預測天氣,並指定包含州和城市資料的資料欄,預測資料就會包含州 A 和城市 A 的所有時間點預測資料,然後是州 A 和城市 B 的所有時間點預測值,依此類推。

本教學課程使用公開的 bigquery-public-data.iowa_liquor_sales.salesbigquery-public-data.covid19_weathersource_com.postal_code_day_history 資料表資料。bigquery-public-data.iowa_liquor_sales.sales 資料表包含從愛荷華州多個城市收集到的酒類銷售資料。bigquery-public-data.covid19_weathersource_com.postal_code_day_history 資料表包含全球各地的歷史天氣資料,例如溫度和濕度。

在閱讀本教學課程之前,強烈建議您先參閱「使用多變數模型預測單一時間序列」。

目標

本教學課程會逐步引導您完成下列工作:

費用

本教學課程使用 Google Cloud的計費元件,包括:

  • BigQuery
  • BigQuery ML

如要進一步瞭解 BigQuery 費用,請參閱 BigQuery 定價頁面。

如要進一步瞭解 BigQuery ML 費用,請參閱 BigQuery ML 定價

事前準備

  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。如要在現有的專案中啟用 BigQuery,請前往

    Enable the BigQuery API.

    Enable the API

建立資料集

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

控制台

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

    前往「BigQuery」頁面

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

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

    「建立資料集」選單選項。

  4. 在「Create dataset」頁面上執行下列操作:

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

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

    • 保留其餘預設設定,然後點選「Create dataset」(建立資料集)

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 快速入門:使用 BigQuery DataFrames,按照 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.iowa_liquor_sales.salesbigquery-public-data.covid19_weathersource_com.postal_code_day_history 資料表的資料欄,分析天氣對酒類商店訂購商品類型和數量的影響。您也需要建立下列額外資料欄,以便做為模型的輸入變數:

  • date:訂單日期
  • store_number:下單的商店專屬編號
  • item_number:訂購商品的專屬編號
  • bottles_sold:關聯商品的訂購瓶數
  • temperature:訂購當天商店位置的平均溫度
  • humidity:訂購當天商店位置的平均濕度

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

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

    前往 BigQuery

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

    CREATE OR REPLACE TABLE
      `bqml_tutorial.iowa_liquor_sales_with_weather` AS
    WITH
      sales AS (
        SELECT
          DATE,
          store_number,
          item_number,
          bottles_sold,
          SAFE_CAST(SAFE_CAST(zip_code AS FLOAT64) AS INT64) AS zip_code
        FROM
          `bigquery-public-data.iowa_liquor_sales.sales` AS sales
        WHERE
          SAFE_CAST(zip_code AS FLOAT64) IS NOT NULL
      ),
      aggregated_sales AS (
        SELECT
          DATE,
          store_number,
          item_number,
          ANY_VALUE(zip_code) AS zip_code,
          SUM(bottles_sold) AS bottles_sold,
        FROM
          sales
        GROUP BY
          DATE,
          store_number,
          item_number
      ),
      weather AS (
        SELECT
          DATE,
          SAFE_CAST(postal_code AS INT64) AS zip_code,
          avg_temperature_air_2m_f AS temperature,
          avg_humidity_specific_2m_gpkg AS humidity,
        FROM
          `bigquery-public-data.covid19_weathersource_com.postal_code_day_history`
        WHERE
          SAFE_CAST(postal_code AS INT64) IS NOT NULL
      ),
      avg_weather AS (
        SELECT
          DATE,
          zip_code,
          AVG(temperature) AS temperature,
          AVG(humidity) AS humidity,
        FROM
          weather
        GROUP BY
          DATE,
          zip_code
      )
    SELECT
      aggregated_sales.date,
      aggregated_sales.store_number,
      aggregated_sales.item_number,
      aggregated_sales.bottles_sold,
      avg_weather.temperature AS temperature,
      avg_weather.humidity AS humidity
    FROM
      aggregated_sales
      LEFT JOIN avg_weather ON aggregated_sales.zip_code=avg_weather.zip_code
      AND aggregated_sales.DATE=avg_weather.DATE;

建立時間序列模型

建立時序模型,針對 bqml_tutorial.iowa_liquor_sales_with_weather 資料表中 2022 年 9 月 1 日前的每個日期,預測每個商店 ID 和商品 ID 組合所售出的瓶裝水數量。使用商店位置在每個日期的平均溫度和濕度做為特徵,在預測期間進行評估。bqml_tutorial.iowa_liquor_sales_with_weather 表格中約有 100 萬個商品編號和商店編號組合,也就是說,有 100 萬個時間序列可供預測。

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

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

    前往 BigQuery

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

    CREATE
    OR REPLACE MODEL `bqml_tutorial.multi_time_series_arimax_model`
    OPTIONS(
      model_type = 'ARIMA_PLUS_XREG',
      time_series_id_col = ['store_number', 'item_number'],
      time_series_data_col = 'bottles_sold',
      time_series_timestamp_col = 'date'
    )
    AS SELECT
      *
    FROM
      `bqml_tutorial.iowa_liquor_sales_with_weather`
    WHERE
      DATE < DATE('2022-09-01');

    查詢作業大約需要 38 分鐘才能完成,之後「探索器」窗格就會顯示 multi_time_series_arimax_model 模型。由於查詢是使用 CREATE MODEL 陳述式建立模型,因此您看不到查詢結果。

使用模型預測資料

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

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

ML.FORECAST 函式的輸入資料資料簽章,與用於建立模型的訓練資料資料簽章相同。bottles_sold 欄並未納入輸入內容,因為這是模型嘗試預測的資料。

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

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

    前往 BigQuery

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

    SELECT
      *
    FROM
      ML.FORECAST (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        STRUCT (5 AS horizon, 0.8 AS confidence_level),
        (
          SELECT
            * EXCEPT (bottles_sold)
          FROM
            `bqml_tutorial.iowa_liquor_sales_with_weather`
          WHERE
            DATE>=DATE('2022-09-01')
        )
      );

    結果應如下所示:

    預測的銷售瓶數資料。

    輸出資料列會依 store_number 值、item_ID 值,然後依 forecast_timestamp 資料欄值的時間順序排序。在時間序列預測中,prediction_interval_lower_boundprediction_interval_upper_bound 欄值所代表的預測間隔,與 forecast_value 欄值同樣重要。forecast_value 值是預測區間的中間點。預測間隔取決於 standard_errorconfidence_level 欄值。

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

解釋預測結果

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

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

ML.EXPLAIN_FORECAST 函式會提供歷來資料和預測資料。如要只查看預測資料,請在查詢中新增 time_series_type 選項,並指定 forecast 做為選項值。

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

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

    前往 BigQuery

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

    SELECT
      *
    FROM
      ML.EXPLAIN_FORECAST (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        STRUCT (5 AS horizon, 0.8 AS confidence_level),
        (
          SELECT
            * EXCEPT (bottles_sold)
          FROM
            `bqml_tutorial.iowa_liquor_sales_with_weather`
          WHERE
            DATE >= DATE('2022-09-01')
        )
      );

    結果應如下所示:

    預測資料和預測說明的前九個輸出資料欄。 第十到第十七列的輸出資料欄,包含預測資料和預測說明。 預測資料和預測說明的最後六個輸出欄。

    輸出資料列會依照 time_series_timestamp 欄值按時間排序。

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

評估預測準確度

在未經訓練的資料上執行模型,評估模型的預測準確度。您可以使用 ML.EVALUATE 函式來執行這項操作。ML.EVALUATE 函式會分別評估每個時間序列。

在下列 GoogleSQL 查詢中,第二個 SELECT 陳述式會為資料提供未來特徵,用於預測未來值,並與實際資料進行比較。

如要評估模型的準確度,請按照下列步驟操作:

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

    前往 BigQuery

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

    SELECT
      *
    FROM
      ML.EVALUATE (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        (
          SELECT
            *
          FROM
           `bqml_tutorial.iowa_liquor_sales_with_weather`
          WHERE
            DATE >= DATE('2022-09-01')
        )
      );

    結果應如下所示:

    模型的評估指標。

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

使用模型偵測異常狀況

使用 ML.DETECT_ANOMALIES 函式偵測訓練資料中的異常狀況。

在以下查詢中,STRUCT(0.95 AS anomaly_prob_threshold) 子句會導致 ML.DETECT_ANOMALIES 函式以 95% 的信心水準識別異常資料點。

如要偵測訓練資料中的異常狀況,請按照下列步驟操作:

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

    前往 BigQuery

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

    SELECT
      *
    FROM
      ML.DETECT_ANOMALIES (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        STRUCT (0.95 AS anomaly_prob_threshold)
      );

    結果應如下所示:

    訓練資料的異常偵測資訊。

    結果中的 anomaly_probability 欄會指出特定 bottles_sold 欄值異常的可能性。

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

偵測新資料中的異常狀況

ML.DETECT_ANOMALIES 函式提供輸入資料,以便偵測新資料中的異常狀況。新資料必須與訓練資料具有相同的資料簽章。

如要偵測新資料中的異常狀況,請按照下列步驟操作:

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

    前往 BigQuery

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

    SELECT
      *
    FROM
      ML.DETECT_ANOMALIES (
        model `bqml_tutorial.multi_time_series_arimax_model`,
        STRUCT (0.95 AS anomaly_prob_threshold),
        (
          SELECT
            *
          FROM
            `bqml_tutorial.iowa_liquor_sales_with_weather`
          WHERE
            DATE >= DATE('2022-09-01')
        )
      );

    結果應如下所示:

    新資料的異常偵測資訊。

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。

  • 您可以刪除建立的專案。
  • 或者您可以保留專案並刪除資料集。

刪除資料集

刪除專案將移除專案中所有的資料集與資料表。若您希望重新使用專案,您可以刪除本教學課程中所建立的資料集。

  1. 如有必要,請在Google Cloud 控制台中開啟 BigQuery 頁面。

    前往「BigQuery」頁面

  2. 在導覽窗格中,按一下您建立的 bqml_tutorial 資料集。

  3. 按一下視窗右側的「Delete dataset」。這個動作將會刪除資料集、資料表,以及所有資料。

  4. 在「Delete dataset」對話方塊中,輸入資料集的名稱 (bqml_tutorial),然後按一下「Delete」來確認刪除指令。

刪除專案

如要刪除專案,請進行以下操作:

  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.

後續步驟