在 ARIMA_PLUS 時間序列預測模型中使用自訂假日
本教學課程將說明如何執行下列工作:
- 建立只使用內建假日的
ARIMA_PLUS
時間序列預測模型。 - 建立
ARIMA_PLUS
時間序列預測模型,除了使用內建假日,還可使用自訂假日。 - 以視覺化方式呈現這些模型的預測結果。
- 檢查模型,查看模型模擬哪些節日。
- 評估自訂節日對預測結果的影響。
- 比較只使用內建假日的模型與使用內建假日和自訂假日的模型,看看哪個模型的成效較佳。
本教學課程使用 bigquery-public-data.wikipedia.pageviews_*
公開資料表。
所需權限
如要建立資料集,您必須具備
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 簡介」。
費用
在本文件中,您會使用 Google Cloud的下列計費元件:
- BigQuery: You incur costs for the data you process in BigQuery.
您可以使用 Pricing Calculator 根據預測用量產生預估費用。
詳情請參閱 BigQuery 價格一文。
事前準備
- 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.
-
Enable the BigQuery API.
-
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.
-
Enable the BigQuery API.
前往 Google Cloud 控制台的「BigQuery」頁面。
在「Explorer」窗格中,按一下專案名稱。
依序點選
「View actions」(查看動作) >「Create dataset」(建立資料集)。在「Create dataset」頁面上執行下列操作:
在「Dataset ID」(資料集 ID) 中輸入
bqml_tutorial
。在「位置類型」中選取「多區域」,然後選取「美國 (多個美國區域)」。
保留其餘預設設定,然後點選「Create 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
前往「BigQuery」頁面
在 SQL 編輯器窗格中執行下列 SQL 陳述式:
CREATE OR REPLACE TABLE `bqml_tutorial.googleio_page_views` AS SELECT DATETIME_TRUNC(datehour, DAY) AS date, SUM(views) AS views FROM `bigquery-public-data.wikipedia.pageviews_*` WHERE datehour >= '2017-01-01' AND datehour < '2023-01-01' AND title = 'Google_I/O' GROUP BY DATETIME_TRUNC(datehour, DAY)
前往「BigQuery」頁面
在 SQL 編輯器窗格中執行下列 SQL 陳述式:
CREATE OR REPLACE MODEL `bqml_tutorial.forecast_googleio` OPTIONS ( model_type = 'ARIMA_PLUS', holiday_region = 'US', time_series_timestamp_col = 'date', time_series_data_col = 'views', data_frequency = 'DAILY', horizon = 365) AS SELECT * FROM `bqml_tutorial.googleio_page_views` WHERE date < '2022-01-01';
前往「BigQuery」頁面
在 SQL 編輯器窗格中執行下列 SQL 陳述式:
SELECT original.date, original.views AS original_views, explain_forecast.time_series_adjusted_data AS adjusted_views_without_custom_holiday, FROM `bqml_tutorial.googleio_page_views` original INNER JOIN ( SELECT * FROM ML.EXPLAIN_FORECAST( MODEL `bqml_tutorial.forecast_googleio`, STRUCT(365 AS horizon)) ) explain_forecast ON TIMESTAMP(original.date) = explain_forecast.time_series_timestamp ORDER BY original.date;
在「查詢結果」窗格中,依序點選「探索資料」和「透過 Looker Studio 探索」。Looker Studio 會在新分頁中開啟。
在 Looker Studio 分頁中,按一下「新增圖表」,然後點選時間序列圖表:
將圖表放到報表上。
在「圖表」窗格的「設定」分頁中,按一下「新增指標」,然後選取「adjusted_views_without_custom_holiday」:
圖表如下所示:
您可以看到預測模型相當準確地掌握整體趨勢。不過,這項指標並未擷取與先前 Google I/O 活動相關的流量增加情形,因此無法產生準確的預測數據。
- 接下來的章節將說明如何處理其中部分限制。
前往「BigQuery」頁面
在 SQL 編輯器窗格中執行下列 SQL 陳述式:
CREATE OR REPLACE MODEL `bqml_tutorial.forecast_googleio_with_custom_holiday` OPTIONS ( model_type = 'ARIMA_PLUS', holiday_region = 'US', time_series_timestamp_col = 'date', time_series_data_col = 'views', data_frequency = 'DAILY', horizon = 365) AS ( training_data AS ( SELECT * FROM `bqml_tutorial.googleio_page_views` WHERE date < '2022-01-01' ), custom_holiday AS ( SELECT 'US' AS region, 'GoogleIO' AS holiday_name, primary_date, 1 AS preholiday_days, 2 AS postholiday_days FROM UNNEST( [ DATE('2017-05-17'), DATE('2018-05-08'), DATE('2019-05-07'), -- cancelled in 2020 due to pandemic DATE('2021-05-18'), DATE('2022-05-11')]) AS primary_date ) );
前往「BigQuery」頁面
在 SQL 編輯器窗格中執行下列 SQL 陳述式:
SELECT original.date, original.views AS original_views, explain_forecast.time_series_adjusted_data AS adjusted_views_with_custom_holiday, FROM `bqml_tutorial.googleio_page_views` original INNER JOIN ( SELECT * FROM ML.EXPLAIN_FORECAST( MODEL `bqml_tutorial.forecast_googleio_with_custom_holiday`, STRUCT(365 AS horizon)) ) explain_forecast ON TIMESTAMP(original.date) = explain_forecast.time_series_timestamp ORDER BY original.date;
在「查詢結果」窗格中,依序點選「探索資料」和「透過 Looker Studio 探索」。Looker Studio 會在新分頁中開啟。
在 Looker Studio 分頁中,按一下「新增圖表」,然後點選時間序列圖表,並將圖表放置在報表上。
在「圖表」窗格的「設定」分頁中,點選「新增指標」,然後選取「adjusted_views_with_custom_holiday」。
圖表如下所示:
如您所見,自訂假日提升了預測模型的成效。這項指標現在可有效擷取 Google I/O 造成的網頁瀏覽次數增加情形。
前往「BigQuery」頁面
在 SQL 編輯器窗格中執行下列 SQL 陳述式:
SELECT * FROM ML.HOLIDAY_INFO( MODEL `bqml_tutorial.forecast_googleio_with_custom_holiday`);
結果會在節日清單中顯示 Google I/O 和內建節日:
前往「BigQuery」頁面
在 SQL 編輯器窗格中執行下列 SQL 陳述式:
SELECT time_series_timestamp, holiday_effect_GoogleIO, holiday_effect_US_Juneteenth, holiday_effect_Christmas, holiday_effect_NewYear FROM ML.EXPLAIN_FORECAST( model `bqml_tutorial.forecast_googleio_with_custom_holiday`, STRUCT(365 AS horizon)) WHERE holiday_effect != 0;
結果顯示,Google I/O 對預測結果的節慶效應貢獻很大:
前往「BigQuery」頁面
在 SQL 編輯器窗格中執行下列 SQL 陳述式:
SELECT "original" AS model_type, * FROM ml.evaluate( MODEL `bqml_tutorial.forecast_googleio`, ( SELECT * FROM `bqml_tutorial.googleio_page_views` WHERE date >= '2022-05-08' AND date < '2022-05-12' ), STRUCT( 365 AS horizon, TRUE AS perform_aggregation)) UNION ALL SELECT "with_custom_holiday" AS model_type, * FROM ml.evaluate( MODEL `bqml_tutorial.forecast_googleio_with_custom_holiday`, ( SELECT * FROM `bqml_tutorial.googleio_page_views` WHERE date >= '2022-05-08' AND date < '2022-05-12' ), STRUCT( 365 AS horizon, TRUE AS perform_aggregation));
結果顯示,第二個模型的成效大幅提升:
- 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 資料集來儲存機器學習模型。
控制台
bq
如要建立新的資料集,請使用 bq mk
指令搭配 --location
旗標。如需可能參數的完整清單,請參閱 bq mk --dataset
指令參考資料。
API
請呼叫 datasets.insert
方法,搭配已定義的資料集資源。
{ "datasetReference": { "datasetId": "bqml_tutorial" } }
BigQuery DataFrames
在嘗試這個範例之前,請先參閱 BigQuery 快速入門:使用 BigQuery DataFrames,按照 BigQuery DataFrames 設定說明進行操作。詳情請參閱 BigQuery DataFrames 參考資料說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定 ADC」。
準備時間序列資料
將 Google I/O 網頁的 Wikipedia 網頁瀏覽資料匯總到單一表格,並依日期分組:
建立使用內建假日的時間序列預測模型
建立模型,根據 2022 年前的網頁瀏覽資料,並考量內建假日,預測 Wikipedia「Google I/O」頁面的每日網頁瀏覽量:
以圖表呈現預測結果
使用內建假日建立模型後,請將 bqml_tutorial.googleio_page_views
資料表的原始資料與 ML.EXPLAIN_FORECAST
函式的預測值彙整,然後使用 Looker Studio以圖表呈現:
建立使用內建假日和自訂假日的時間序列預測模型
如您在 Google I/O 歷史記錄中看到的,Google I/O 活動在 2017 年至 2022 年間的不同日期舉行。為考量這項變化,請建立模型,根據 2022 年前的網頁瀏覽資料,預測 Wikipedia「Google_I/O」網頁在 2022 年前後的網頁瀏覽量,並使用自訂節日來代表每年的 Google I/O 活動。在這個模型中,您也調整了節慶效應視窗,涵蓋活動日期前後三天,以便更準確地擷取活動前後的部分潛在網頁流量。
以圖表呈現預測結果
使用自訂假日建立模型後,請將 bqml_tutorial.googleio_page_views
資料表的原始資料與 ML.EXPLAIN_FORECAST
函式的預測值彙整,然後使用 Looker Studio以視覺化方式呈現:
檢查假日資訊
使用 ML.HOLIDAY_INFO
函式檢查模擬期間考慮的節日清單:
評估自訂節慶的影響
使用 ML.EXPLAIN_FORECAST
函式,評估自訂節日對預測結果的影響:
比較模型效能
使用 ML.EVALUATE
函式比較在未使用自訂假日的情況下建立的第一個模型,以及在使用自訂假日的情況下建立的第二個模型的效能。如要查看第二個模型在預測未來自訂節慶時的表現,請將時間範圍設為 2022 年 Google I/O 大會的當週: