在本教學課程中,您將瞭解如何大幅加快一組 ARIMA_PLUS
單變量時間序列模型的訓練作業,以便透過單一查詢執行多個時間序列預測。您也將瞭解如何評估預測準確度。
本教學課程將針對多個時間序列進行預測。系統會針對一或多個指定欄中的每個值,為每個時間點計算預測值。舉例來說,如果您想預測天氣並指定包含城市資料的資料欄,預測資料就會包含城市 A 的所有時間點預測資料,然後是城市 B 的所有時間點預測值,依此類推。
本教學課程使用公開的 bigquery-public-data.new_york.citibike_trips
和 iowa_liquor_sales.sales
資料表資料。自行車行程資料只包含幾百個時間序列,因此可用於說明各種加速模型訓練的策略。酒類銷售資料包含超過 100 萬個時間序列,因此可用於大規模顯示時間序列預測資料。
閱讀本教學課程前,請先參閱「使用單變數模型預測多個時間序列」和「大規模時間序列預測最佳做法」。
目標
在本教學課程中,您會使用下列項目:
- 使用
CREATE MODEL
陳述式建立時間序列模型。 - 使用
ML.EVALUATE
函式評估模型準確率。 - 使用
CREATE MODEL
陳述式的AUTO_ARIMA_MAX_ORDER
、TIME_SERIES_LENGTH_FRACTION
、MIN_TIME_SERIES_LENGTH
和MAX_TIME_SERIES_LENGTH
選項,大幅縮短模型訓練時間。
為了簡化操作,本教學課程不會說明如何使用 ML.FORECAST
或 ML.EXPLAIN_FORECAST
函式產生預測資料。如要瞭解如何使用這些函式,請參閱「使用單變數模型預測多個時間序列」。
費用
本教學課程使用 Google Cloud的計費元件,包括:
- BigQuery
- BigQuery ML
如要進一步瞭解費用,請參閱 BigQuery 定價頁面和 BigQuery ML 定價頁面。
事前準備
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- 新專案會自動啟用 BigQuery。如要在現有的專案中啟用 BigQuery,請前往
Enable the BigQuery API.
如要建立資料集,您必須具備
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 資料集來儲存機器學習模型。
控制台
前往 Google Cloud 控制台的「BigQuery」頁面。
在「Explorer」窗格中,按一下專案名稱。
依序點選
「View actions」(查看動作) >「Create dataset」(建立資料集)。在「Create dataset」頁面上執行下列操作:
在「Dataset ID」(資料集 ID) 中輸入
bqml_tutorial
。在「位置類型」中選取「多區域」,然後選取「美國 (多個美國區域)」。
保留其餘預設設定,然後點選「Create dataset」(建立資料集)。
bq
如要建立新的資料集,請使用 bq mk
指令搭配 --location
旗標。如需可能參數的完整清單,請參閱 bq mk --dataset
指令參考資料。
建立名為
bqml_tutorial
的資料集,並將資料位置設為US
,說明為BigQuery ML tutorial dataset
:bq --location=US mk -d \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
這個指令採用
-d
捷徑,而不是使用--dataset
旗標。如果您省略-d
和--dataset
,該指令預設會建立資料集。確認資料集已建立:
bq ls
API
請呼叫 datasets.insert
方法,搭配已定義的資料集資源。
{ "datasetReference": { "datasetId": "bqml_tutorial" } }
BigQuery DataFrames
在嘗試這個範例之前,請先參閱 BigQuery 快速入門:使用 BigQuery DataFrames,按照 BigQuery DataFrames 設定說明進行操作。詳情請參閱 BigQuery DataFrames 參考資料說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定 ADC」。
建立輸入資料表
下列查詢的 SELECT
陳述式使用 EXTRACT
函式,從 starttime
欄擷取日期資訊。這項查詢會使用 COUNT(*)
子句,取得 Citi Bike 每日的總行程數。
table_1
包含 679 個時間序列。這項查詢會使用額外的 INNER JOIN
邏輯,選取所有時間序列 (時間點超過 400 個),因此總共會產生 383 個時間序列。
請按照下列步驟建立輸入資料表:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中貼上以下查詢,然後點選「執行」:
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
函式評估預測準確度時,可使用這些時間點。
請按照下列步驟建立模型:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中貼上以下查詢,然後點選「執行」:
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
函式評估模型的預測準確度。
如要評估模型,請按照下列步驟操作:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中貼上以下查詢,然後點選「執行」:
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
傳回的預測指標中,只有平均絕對百分比誤差和對稱平均絕對百分比誤差與時間序列值無關。因此,如要評估時間序列集合的整體預測準確度,就必須匯總這兩項指標的值。
如要評估模型,請按照下列步驟操作:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中貼上以下查詢,然後點選「執行」:
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));
這項查詢會傳回 MAPE
值 0.3471
,以及 sMAPE
值 0.2563
。
建立模型,以較小的超參數搜尋空間預測多個時間序列
在「使用預設參數為多個時序資料建立模型」一節中,您為所有訓練選項 (包括 auto_arima_max_order
選項) 使用預設值。這個選項可控制 auto.ARIMA
演算法中超參數調整的搜尋空間。
在以下查詢建立的模型中,您可以將 auto_arima_max_order
選項值從預設的 5
變更為 2
,為超參數使用較小的搜尋空間。
如要評估模型,請按照下列步驟操作:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中貼上以下查詢,然後點選「執行」:
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
值增加時,候選模型的數量和複雜度也會增加。這會導致模型的訓練時間增加。
評估模型的預測準確度,並縮小超參數搜尋空間
如要評估模型,請按照下列步驟操作:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中貼上以下查詢,然後點選「執行」:
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));
這項查詢會傳回 MAPE
值 0.3337
,以及 sMAPE
值 0.2337
。
在「評估整體預測準確度」一節中,您評估的模型具有較大的超參數搜尋空間,auto_arima_max_order
選項值為 5
。這會導致 MAPE
值為 0.3471
,sMAPE
值為 0.2563
。在這種情況下,您可以看到較小的超參數搜尋空間實際上可提高預測準確度。其中一個原因是 auto.ARIMA
演算法只會針對整個模擬管道的趨勢模組進行超參數調整。auto.ARIMA
演算法選取的最佳 ARIMA 模型,可能無法為整個管道產生最佳預測結果。
建立模型,以較小的超參數搜尋空間和快速訓練策略預測多個時間序列
在這個步驟中,您可以使用一或多個 max_time_series_length
、max_time_series_length
或 time_series_length_fraction
訓練選項,同時使用較小的超參數搜尋空間和智慧快速訓練策略。
雖然季節性等週期性模型需要一定數量的時間點,但趨勢模型所需的時間點較少。同時,趨勢模擬的運算成本遠高於其他時間序列元件 (例如季節性)。透過上述快速訓練選項,您可以使用時間序列的子集有效模擬趨勢元件,而其他時間序列元件則會使用整個時間序列。
以下範例使用 max_time_series_length
選項快速訓練模型。將 max_time_series_length
選項值設為 30
後,系統只會使用最近 30 個時間點來模擬趨勢元件。所有 383 個時間序列仍可用於模擬非趨勢元件。
請按照下列步驟建立模型:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中貼上以下查詢,然後點選「執行」:
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 倍。
評估模型的預測準確度,使用較小的超參數搜尋空間和智慧快速訓練策略
如要評估模型,請按照下列步驟操作:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中貼上以下查詢,然後點選「執行」:
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));
這項查詢會傳回 MAPE
值 0.3515
,以及 sMAPE
值 0.2473
。
請注意,如果不使用快速訓練策略,預測準確度會導致 MAPE
值為 0.3337
,而 sMAPE
值為 0.2337
。兩組指標值的差異在 3% 以內,在統計上不具意義。
簡而言之,您使用較小的超參數搜尋空間和智慧快速訓練策略,讓模型訓練速度提高 20 倍以上,且不犧牲預測準確度。如先前所述,如果時間序列更多,智慧快速訓練策略的速度提升幅度就會大幅提高。此外,ARIMA_PLUS
模型使用的基礎 ARIMA 程式庫已經過最佳化,執行速度比先前快上 5 倍。這些進展讓我們能夠在數小時內預測數百萬個時間序列。
建立模型來預測百萬個時間序列
在這個步驟中,您將使用愛荷華州公開的酒類銷售資料,預測不同商店中超過 100 萬種酒類產品的銷售量。模型訓練會使用較小的超參數搜尋空間,並採用智慧快速訓練策略。
如要評估模型,請按照下列步驟操作:
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中貼上以下查詢,然後點選「執行」:
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 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。
- 您可以刪除建立的專案。
- 或者您可以保留專案並刪除資料集。
刪除資料集
刪除專案將移除專案中所有的資料集與資料表。若您希望重新使用專案,您可以刪除本教學課程中所建立的資料集。
如有必要,請在Google Cloud 控制台中開啟 BigQuery 頁面。
在導覽窗格中,按一下您建立的 bqml_tutorial 資料集。
按一下「刪除資料集」,即可刪除資料集、資料表和所有資料。
在「Delete dataset」對話方塊中,輸入資料集的名稱 (
bqml_tutorial
),然後按一下「Delete」來確認刪除指令。
刪除專案
如要刪除專案,請進行以下操作:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
後續步驟
- 瞭解如何使用單變數模型預測單一時間序列
- 瞭解如何使用多變數模型預測單一時間序列
- 瞭解如何使用單變數模型預測多個時間序列
- 瞭解如何使用單變數模型以分層方式預測多個時間序列
- 如需 BigQuery ML 的總覽,請參閱「BigQuery 中的 AI 和 ML 簡介」。