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


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

本教學課程會預測多個時間序列。系統會針對一或多個指定資料欄中的每個值,計算每個時間點的預測值。舉例來說,如果您想預測天氣,並指定包含州別資料的資料欄,預測資料會包含州別 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. 在「建立資料集」頁面中,執行下列操作:

    • 在「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 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.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;

建立時間序列模型

建立時間序列模型,預測 2022 年 9 月 1 日前 bqml_tutorial.iowa_liquor_sales_with_weather 表格中每個日期的瓶裝飲料銷售量,並依商店 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 模型會顯示在「Explorer」(探索) 窗格中。 由於查詢是使用 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')
        )
      );

    結果應如下所示:

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

    輸出資料列會依 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. 按一下視窗右側的「刪除資料集」。 這個動作將會刪除資料集、資料表,以及所有資料。

  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.

後續步驟