將 ARIMA_PLUS 單變數時間序列模型擴展至數百萬個時間序列


在本教學課程中,您將瞭解如何大幅加快一組 ARIMA_PLUS 單變量時間序列模型的訓練作業,以便透過單一查詢執行多個時間序列預測。您也將瞭解如何評估預測準確度。

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

本教學課程使用公開的 bigquery-public-data.new_york.citibike_tripsiowa_liquor_sales.sales 資料表資料。自行車行程資料只包含幾百個時間序列,因此可用於說明各種加速模型訓練的策略。酒類銷售資料包含超過 100 萬個時間序列,因此可用於大規模顯示時間序列預測資料。

閱讀本教學課程前,請先參閱「使用單變數模型預測多個時間序列」和「大規模時間序列預測最佳做法」。

目標

在本教學課程中,您會使用下列項目:

為了簡化操作,本教學課程不會說明如何使用 ML.FORECASTML.EXPLAIN_FORECAST 函式產生預測資料。如要瞭解如何使用這些函式,請參閱「使用單變數模型預測多個時間序列」。

費用

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

  • BigQuery
  • BigQuery ML

如要進一步瞭解費用,請參閱 BigQuery 定價頁面和 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

  7. 所需權限

    • 如要建立資料集,您必須具備 bigquery.datasets.create IAM 權限。

    • 您必須具備下列權限,才能建立模型:

      • bigquery.jobs.create
      • bigquery.models.create
      • bigquery.models.getData
      • bigquery.models.updateData
    • 如要執行推論,您需要具備下列權限:

      • bigquery.models.getData
      • bigquery.jobs.create

    如要進一步瞭解 BigQuery 中的 IAM 角色和權限,請參閱「IAM 簡介」。

建立資料集

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

控制台

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

    前往「BigQuery」頁面

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

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

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

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

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

    • 在「位置類型」中選取「多區域」,然後選取「美國 (多個美國區域)」

    • 保留其餘預設設定,然後點選「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)

建立輸入資料表

下列查詢的 SELECT 陳述式使用 EXTRACT 函式,從 starttime 欄擷取日期資訊。這項查詢會使用 COUNT(*) 子句,取得 Citi Bike 每日的總行程數。

table_1 包含 679 個時間序列。這項查詢會使用額外的 INNER JOIN 邏輯,選取所有時間序列 (時間點超過 400 個),因此總共會產生 383 個時間序列。

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

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

    前往 BigQuery

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

    CREATE OR REPLACE TABLE
      `bqml_tutorial.nyc_citibike_time_series` AS
    WITH input_time_series AS
    (
      SELECT
        start_station_name,
        EXTRACT(DATE FROM starttime) AS date,
        COUNT(*) AS num_trips
      FROM
        `bigquery-public-data.new_york.citibike_trips`
      GROUP BY
        start_station_name, date
    )
    SELECT table_1.*
    FROM input_time_series AS table_1
    INNER JOIN (
      SELECT start_station_name,  COUNT(*) AS num_points
      FROM input_time_series
      GROUP BY start_station_name) table_2
    ON
      table_1.start_station_name = table_2.start_station_name
    WHERE
      num_points > 400;

使用預設參數為多個時間序列建立模型

您想預測每個 Citi Bike 站點的單車行程數量,這需要許多時間序列模型,每個輸入資料中的 Citi Bike 站點都需要一個模型。您可以編寫多個 CREATE MODEL 查詢來執行這項操作,但這可能會耗時且費時,尤其是當您有大量時序資料時。您可以改用單一查詢來建立及擬合一組時間序列模型,以便一次預測多個時間序列。

OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) 子句表示您要建立一組以 ARIMA 為基礎的時間序列 ARIMA_PLUS 模型。time_series_timestamp_col 選項會指定包含時間序列的資料欄,time_series_data_col 選項會指定要預測的資料欄,而 time_series_id_col 會指定要為其建立時間序列的一或多個維度。

這個範例會省略 2016 年 6 月 1 日後的時間序列時間點,以便日後使用 ML.EVALUATE 函式評估預測準確度時,可使用這些時間點。

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

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

    前往 BigQuery

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

    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_default`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_name'
      ) AS
    SELECT *
    FROM bqml_tutorial.nyc_citibike_time_series
    WHERE date < '2016-06-01';

    這項查詢大約需要 15 分鐘才能完成。

評估每個時間序列的預測準確度

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

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

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

    前往 BigQuery

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

    SELECT *
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`,
      TABLE `bqml_tutorial.nyc_citibike_time_series`,
      STRUCT(7 AS horizon, TRUE AS perform_aggregation));

    這項查詢會回報多項預測指標,包括:

    結果應類似下方: 時間序列模型的評估指標。

    ML.EVALUATE 函式中的 TABLE 子句會指出含有實際資料的資料表。系統會將預測結果與真值資料進行比較,藉此計算準確度指標。在本例中,nyc_citibike_time_series 包含 2016 年 6 月 1 日前後的時間序列點。2016 年 6 月 1 日之後的點為地理真實資料。2016 年 6 月 1 日前的資料點會用於訓練模型,以便產生該日期後的預測資料。計算指標時,只會使用 2016 年 6 月 1 日之後的點數。指標計算會忽略 2016 年 6 月 1 日前的點數。

    ML.EVALUATE 函式中的 STRUCT 子句會為函式指定參數。horizon 值為 7,表示查詢會根據七點預測資料計算預測準確度。請注意,如果真值資料的比較點少於七個,系統會只根據可用的點來計算準確度指標。perform_aggregation 值為 TRUE,表示預測準確度指標會根據時間點匯總指標。如果您指定的 perform_aggregation 值為 FALSE,系統會針對每個預測時間點傳回預測準確度。

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

評估整體預測準確度

評估所有 383 個時間序列的預測準確度。

ML.EVALUATE 傳回的預測指標中,只有平均絕對百分比誤差對稱平均絕對百分比誤差與時間序列值無關。因此,如要評估時間序列集合的整體預測準確度,就必須匯總這兩項指標的值。

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

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

    前往 BigQuery

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

    SELECT
      AVG(mean_absolute_percentage_error) AS MAPE,
      AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`,
        TABLE `bqml_tutorial.nyc_citibike_time_series`,
        STRUCT(7 AS horizon, TRUE AS perform_aggregation));

這項查詢會傳回 MAPE0.3471,以及 sMAPE0.2563

建立模型,以較小的超參數搜尋空間預測多個時間序列

在「使用預設參數為多個時序資料建立模型」一節中,您為所有訓練選項 (包括 auto_arima_max_order 選項) 使用預設值。這個選項可控制 auto.ARIMA 演算法中超參數調整的搜尋空間。

在以下查詢建立的模型中,您可以將 auto_arima_max_order 選項值從預設的 5 變更為 2,為超參數使用較小的搜尋空間。

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

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

    前往 BigQuery

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

    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_name',
      auto_arima_max_order = 2
      ) AS
    SELECT *
    FROM `bqml_tutorial.nyc_citibike_time_series`
    WHERE date < '2016-06-01';

    這項查詢大約需要 2 分鐘才能完成。請回想,當 auto_arima_max_order 值為 5 時,先前的模型需要約 15 分鐘才能完成,因此這項變更可將模型訓練速度提升約 7 倍。如果您想知道為什麼速度增幅不是 5/2=2.5x,這是因為當 auto_arima_max_order 值增加時,候選模型的數量和複雜度也會增加。這會導致模型的訓練時間增加。

評估模型的預測準確度,並縮小超參數搜尋空間

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

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

    前往 BigQuery

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

    SELECT
      AVG(mean_absolute_percentage_error) AS MAPE,
      AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2`,
        TABLE `bqml_tutorial.nyc_citibike_time_series`,
        STRUCT(7 AS horizon, TRUE AS perform_aggregation));

這項查詢會傳回 MAPE0.3337,以及 sMAPE0.2337

在「評估整體預測準確度」一節中,您評估的模型具有較大的超參數搜尋空間,auto_arima_max_order 選項值為 5。這會導致 MAPE 值為 0.3471sMAPE 值為 0.2563。在這種情況下,您可以看到較小的超參數搜尋空間實際上可提高預測準確度。其中一個原因是 auto.ARIMA 演算法只會針對整個模擬管道的趨勢模組進行超參數調整。auto.ARIMA 演算法選取的最佳 ARIMA 模型,可能無法為整個管道產生最佳預測結果。

建立模型,以較小的超參數搜尋空間和快速訓練策略預測多個時間序列

在這個步驟中,您可以使用一或多個 max_time_series_lengthmax_time_series_lengthtime_series_length_fraction 訓練選項,同時使用較小的超參數搜尋空間和智慧快速訓練策略。

雖然季節性等週期性模型需要一定數量的時間點,但趨勢模型所需的時間點較少。同時,趨勢模擬的運算成本遠高於其他時間序列元件 (例如季節性)。透過上述快速訓練選項,您可以使用時間序列的子集有效模擬趨勢元件,而其他時間序列元件則會使用整個時間序列。

以下範例使用 max_time_series_length 選項快速訓練模型。將 max_time_series_length 選項值設為 30 後,系統只會使用最近 30 個時間點來模擬趨勢元件。所有 383 個時間序列仍可用於模擬非趨勢元件。

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

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

    前往 BigQuery

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

    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_name',
      auto_arima_max_order = 2,
      max_time_series_length = 30
      ) AS
    SELECT *
    FROM `bqml_tutorial.nyc_citibike_time_series`
    WHERE date < '2016-06-01';

    查詢大約需要 35 秒才能完成。這比您在「建立模型,以較小的超參數搜尋空間預測多個時間序列」一節中使用的查詢快上 3 倍。由於查詢的非訓練部分 (例如資料預先處理) 會產生固定的時間開銷,因此當時間序列數量遠大於本範例時,速度提升幅度會更高。對於百萬個時間序列,速度提升會接近時間序列長度與 max_time_series_length 選項值的值的比率。在這種情況下,速度提升幅度會超過 10 倍。

評估模型的預測準確度,使用較小的超參數搜尋空間和智慧快速訓練策略

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

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

    前往 BigQuery

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

    SELECT
      AVG(mean_absolute_percentage_error) AS MAPE,
      AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training`,
        TABLE `bqml_tutorial.nyc_citibike_time_series`,
        STRUCT(7 AS horizon, TRUE AS perform_aggregation));

這項查詢會傳回 MAPE0.3515,以及 sMAPE0.2473

請注意,如果不使用快速訓練策略,預測準確度會導致 MAPE 值為 0.3337,而 sMAPE 值為 0.2337。兩組指標值的差異在 3% 以內,在統計上不具意義。

簡而言之,您使用較小的超參數搜尋空間和智慧快速訓練策略,讓模型訓練速度提高 20 倍以上,且不犧牲預測準確度。如先前所述,如果時間序列更多,智慧快速訓練策略的速度提升幅度就會大幅提高。此外,ARIMA_PLUS 模型使用的基礎 ARIMA 程式庫已經過最佳化,執行速度比先前快上 5 倍。這些進展讓我們能夠在數小時內預測數百萬個時間序列。

建立模型來預測百萬個時間序列

在這個步驟中,您將使用愛荷華州公開的酒類銷售資料,預測不同商店中超過 100 萬種酒類產品的銷售量。模型訓練會使用較小的超參數搜尋空間,並採用智慧快速訓練策略。

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

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

    前往 BigQuery

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

    CREATE OR REPLACE MODEL
      `bqml_tutorial.liquor_forecast_by_product`
    OPTIONS(
      MODEL_TYPE = 'ARIMA_PLUS',
      TIME_SERIES_TIMESTAMP_COL = 'date',
      TIME_SERIES_DATA_COL = 'total_bottles_sold',
      TIME_SERIES_ID_COL = ['store_number', 'item_description'],
      HOLIDAY_REGION = 'US',
      AUTO_ARIMA_MAX_ORDER = 2,
      MAX_TIME_SERIES_LENGTH = 30
    ) AS
    SELECT
      store_number,
      item_description,
      date,
      SUM(bottles_sold) as total_bottles_sold
    FROM
      `bigquery-public-data.iowa_liquor_sales.sales`
    WHERE date BETWEEN DATE("2015-01-01") AND DATE("2021-12-31")
    GROUP BY store_number, item_description, date;

    這項查詢大約需要 1 小時 16 分鐘才能完成。

清除所用資源

如要避免系統向您的 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.

後續步驟