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

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

本教學課程會預測多個時間序列。系統會針對一或多個指定資料欄中的每個值,計算每個時間點的預測值。舉例來說,如果您想預測天氣,並指定包含州別資料的資料欄,預測資料會包含州別 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表格包含全球各地的歷史天氣資料,例如溫度和濕度。

建議您先閱讀「使用多變數模型預測單一時間序列」,再開始閱讀本教學課程。

建立資料集

建立 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 (多個美國區域))

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

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
          country = 'US' AND
          SAFE_CAST(postal_code AS INT64) IS NOT NULL
      )
    SELECT
      aggregated_sales.date,
      aggregated_sales.store_number,
      aggregated_sales.item_number,
      aggregated_sales.bottles_sold,
      weather.temperature AS temperature,
      weather.humidity AS humidity
    FROM
      aggregated_sales
      LEFT JOIN weather ON aggregated_sales.zip_code=weather.zip_code
      AND aggregated_sales.DATE=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 模型。由於查詢是使用 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')
        )
      );

    結果應如下所示:

    新資料的異常偵測資訊。