限制 `ARIMA_PLUS` 時間序列模型的預測值
本教學課程說明如何使用限制,縮小ARIMA_PLUS
時間序列模型傳回的預測結果範圍。在本教學課程中,您會針對相同資料建立兩個時間序列模型,其中一個模型會使用限制,另一個則不會。您可以比較模型傳回的結果,瞭解指定限制帶來的差異。
您會使用 new_york.citibike_trips
資料訓練本教學課程中的模型。這個資料集包含紐約市 Citi Bike 行程的相關資訊。
在按照本教學課程操作之前,您應熟悉單一時間序列預測。如要瞭解這個主題,請完成「Google Analytics 資料的單一時間序列預測」教學課程。
所需權限
如要建立資料集,您需要
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 簡介」。
目標
在本教學課程中,您會使用下列項目:
CREATE MODEL
陳述式:用於建立時間序列模型。ML.FORECAST
函式:預測每日總造訪次數。
費用
本教學課程使用 Google Cloud的計費元件,包括:
- BigQuery
- BigQuery ML
如要進一步瞭解 BigQuery 費用,請參閱 BigQuery 定價頁面。
如要進一步瞭解 BigQuery ML 費用,請參閱 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.
-
Verify 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.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the BigQuery API.
前往 Google Cloud 控制台的「BigQuery」頁面。
在「Explorer」窗格中,按一下專案名稱。
依序點按
「View actions」(查看動作) >「Create dataset」(建立資料集)。在「建立資料集」頁面中,執行下列操作:
在「Dataset ID」(資料集 ID) 中輸入
bqml_tutorial
。針對「Location type」(位置類型) 選取「Multi-region」(多區域),然後選取「US (multiple regions in United States)」(us (多個美國區域))。
其餘設定請保留預設狀態,然後按一下「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
在 Google Cloud 控制台中,按一下「撰寫新查詢」按鈕。
在查詢編輯器中輸入下列 GoogleSQL 查詢。
#standardSQL SELECT EXTRACT(DATE from starttime) AS date, COUNT(*) AS num_trips FROM `bigquery-public-data`.new_york.citibike_trips GROUP BY date
按一下「執行」。查詢結果類似下方。
使用 Google Cloud 控制台繪製時間序列資料圖表。在「查詢結果」窗格中,按一下「圖表」分頁標籤。在「圖表設定」窗格中,為「圖表類型」選擇「長條圖」:
在 Google Cloud 控制台中,按一下「撰寫新查詢」按鈕。
在查詢編輯器中輸入下列 GoogleSQL 查詢。
#standardSQL CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model OPTIONS ( model_type = 'ARIMA_PLUS', time_series_timestamp_col = 'date', time_series_data_col = 'num_trips', time_series_id_col = 'start_station_id') AS SELECT EXTRACT(DATE FROM starttime) AS date, COUNT(*) AS num_trips, start_station_id FROM `bigquery-public-data`.new_york.citibike_trips WHERE starttime > '2014-07-11' AND starttime < '2015-02-11' GROUP BY date, start_station_id;
按一下「執行」。
查詢作業完成約需 80 秒,完成後,您的模型 (
nyc_citibike_arima_model
) 會顯示在「Explorer」窗格中。由於查詢使用CREATE MODEL
陳述式建立模型,因此沒有查詢結果。在 Google Cloud 控制台中,按一下「撰寫新查詢」按鈕。
在查詢編輯器中輸入下列 GoogleSQL 查詢。
#standardSQL SELECT forecast_timestamp AS forecast_timestamp, start_station_id AS start_station_id, history_value AS history_value, forecast_value AS forecast_value FROM ( ( SELECT DATE(forecast_timestamp) AS forecast_timestamp, NULL AS history_value, forecast_value AS forecast_value, start_station_id AS start_station_id, FROM ML.FORECAST( MODEL bqml_tutorial.`nyc_citibike_arima_model`, STRUCT( 365 AS horizon, 0.9 AS confidence_level)) ) UNION ALL ( SELECT DATE(date_name) AS forecast_timestamp, num_trips AS history_value, NULL AS forecast_value, start_station_id AS start_station_id, FROM ( SELECT EXTRACT(DATE FROM starttime) AS date_name, COUNT(*) AS num_trips, start_station_id AS start_station_id FROM `bigquery-public-data`.new_york.citibike_trips WHERE starttime > '2014-07-11' AND starttime < '2015-02-11' GROUP BY date_name, start_station_id ) ) ) WHERE start_station_id = 79 ORDER BY forecast_timestamp, start_station_id
按一下「執行」。查詢結果大致如下:
使用 Google Cloud 控制台繪製時間序列資料圖表。在「查詢結果」窗格中,按一下「圖表」分頁標籤:
在 Google Cloud 控制台中,按一下「撰寫新查詢」按鈕。
在查詢編輯器中輸入下列 GoogleSQL 查詢。
#standardSQL CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model OPTIONS ( model_type = 'ARIMA_PLUS', time_series_timestamp_col = 'date', time_series_data_col = 'num_trips', time_series_id_col = 'start_station_id', forecast_limit_lower_bound = 0) AS SELECT EXTRACT(DATE FROM starttime) AS date, COUNT(*) AS num_trips, start_station_id FROM `bigquery-public-data`.new_york.citibike_trips WHERE starttime > '2014-07-11' AND starttime < '2015-02-11' GROUP BY date, start_station_id;
按一下「執行」。
查詢作業完成約需 100 秒,完成後,模型 (
nyc_citibike_arima_model_with_limits
) 會顯示在「Explorer」窗格中。由於查詢使用CREATE MODEL
陳述式建立模型,因此沒有查詢結果。在 Google Cloud 控制台中,按一下「撰寫新查詢」按鈕。
在查詢編輯器中輸入下列 GoogleSQL 查詢。
#standardSQL SELECT forecast_timestamp AS forecast_timestamp, start_station_id AS start_station_id, history_value AS history_value, forecast_value AS forecast_value FROM ( ( SELECT DATE(forecast_timestamp) AS forecast_timestamp, NULL AS history_value, forecast_value AS forecast_value, start_station_id AS start_station_id, FROM ML.FORECAST( MODEL bqml_tutorial.`nyc_citibike_arima_model`, STRUCT( 365 AS horizon, 0.9 AS confidence_level)) ) UNION ALL ( SELECT DATE(date_name) AS forecast_timestamp, num_trips AS history_value, NULL AS forecast_value, start_station_id AS start_station_id, FROM ( SELECT EXTRACT(DATE FROM starttime) AS date_name, COUNT(*) AS num_trips, start_station_id AS start_station_id FROM `bigquery-public-data`.new_york.citibike_trips WHERE starttime > '2014-07-11' AND starttime < '2015-02-11' GROUP BY date_name, start_station_id ) ) ) WHERE start_station_id = 79 ORDER BY forecast_timestamp, start_station_id
按一下「執行」。
使用 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.
- 瞭解如何使用紐約市 Citi Bike 行程資料,以單一查詢進行多重時間序列預測。
- 瞭解如何加速 ARIMA_PLUS,在數小時內預測 100 萬個時間序列。
- 如要進一步瞭解機器學習,請參閱機器學習速成課程。
- 如需 BigQuery ML 的總覽,請參閱 BigQuery ML 簡介。
- 如要進一步瞭解 Google Cloud 控制台,請參閱「使用 Google Cloud 控制台」。
建立資料集
建立 BigQuery 資料集來儲存機器學習模型。
控制台
bq
如要建立新的資料集,請使用 bq mk
指令搭配 --location
旗標。如需可能的完整參數清單,請參閱 bq mk --dataset
指令參考資料。
API
請呼叫 datasets.insert
方法,搭配已定義的資料集資源。
{ "datasetReference": { "datasetId": "bqml_tutorial" } }
BigQuery DataFrames
在嘗試這個範例之前,請按照使用 BigQuery DataFrames 的 BigQuery 快速入門導覽課程中的 BigQuery DataFrames 設定說明操作。 詳情請參閱 BigQuery DataFrames 參考說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定 ADC」。
將要預測的時間序列視覺化
建立模型前,建議先查看輸入時間序列的樣貌。
SQL
在下列查詢中,FROM bigquery-public-data.new_york.citibike_trips
子句表示您正在查詢 new_york
資料集中的 citibike_trips
資料表。
在 SELECT
陳述式中,查詢會使用 EXTRACT
函式從 starttime
資料欄擷取日期資訊。這項查詢會使用 COUNT(*)
子句,取得每日的 Citi Bike 行程總數。
#standardSQL SELECT EXTRACT(DATE from starttime) AS date, COUNT(*) AS num_trips FROM `bigquery-public-data`.new_york.citibike_trips GROUP BY date
如要執行查詢,請按照下列步驟操作:
BigQuery DataFrames
在嘗試這個範例之前,請按照使用 BigQuery DataFrames 的 BigQuery 快速入門導覽課程中的 BigQuery DataFrames 設定說明操作。 詳情請參閱 BigQuery DataFrames 參考說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定 ADC」。
在下列範例中,bigquery-public-data.new_york.citibike_trips
表示您要查詢 new_york
資料集中的 citibike_trips
資料表。
結果大致如下:
建立時間序列模型
使用紐約市 Citi Bike 行程資料建立時間序列模型。
以下 GoogleSQL 查詢會建立模型,預測每日單車行程總數。CREATE MODEL
陳述式會建立並訓練名為 bqml_tutorial.nyc_citibike_arima_model
的模型。
#standardSQL CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model OPTIONS ( model_type = 'ARIMA_PLUS', time_series_timestamp_col = 'date', time_series_data_col = 'num_trips', time_series_id_col = 'start_station_id') AS SELECT EXTRACT(DATE FROM starttime) AS date, COUNT(*) AS num_trips, start_station_id FROM `bigquery-public-data`.new_york.citibike_trips WHERE starttime > '2014-07-11' AND starttime < '2015-02-11' GROUP BY date, start_station_id;
OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...)
子句代表您要建立以 ARIMA 為基礎的時間序列模型。根據預設,auto_arima=TRUE
,因此 auto.ARIMA
演算法會自動調整 ARIMA_PLUS
模型中的超參數。演算法會套用數十個候選模型,並選擇赤池訊息量準則 (AIC) 最低的最佳模型。此外,由於預設值為 data_frequency='AUTO_FREQUENCY'
,訓練程序會自動推論輸入時間序列的資料頻率。CREATE MODEL
陳述式預設會使用 decompose_time_series=TRUE
,因此時間序列的歷史記錄和預測部分都會儲存在模型中。設定 time_series_id_col = 'start_station_id'
參數後,模型會根據 start_station_id
,使用單一查詢來調整及預測多個時間序列。您可以擷取季節性週期等個別時間序列元件,進一步瞭解時間序列的預測方式。
執行 CREATE MODEL
查詢來建立及訓練模型:
預測時間序列並以視覺化方式呈現結果
如要說明時間序列的預測方式,請使用 ML.FORECAST
函式,將所有子時間序列元件 (例如季節性和趨勢) 視覺化。
詳細步驟如下:
圖表顯示,Citi Bike 每日總行程數的預測值為負數,這並無參考價值。start_station_id=79
改用設有上限的模型,可提升預測資料的準確度。
建立設有上限的時間序列模型
使用紐約市 Citi Bike 行程資料,建立設有上限的時間序列模型。
以下 GoogleSQL 查詢會建立模型,預測每日單車行程總數。CREATE MODEL
陳述式會建立並訓練名為 bqml_tutorial.nyc_citibike_arima_model_with_limits
的模型。這個模型與先前建立的模型的主要差異在於新增了 forecast_limit_lower_bound=0
選項。這個選項會讓模型只根據 time_series_data_col
引數 (在本例中為 num_trips
) 指定的資料欄值,預測大於 0 的值。
#standardSQL CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model OPTIONS ( model_type = 'ARIMA_PLUS', time_series_timestamp_col = 'date', time_series_data_col = 'num_trips', time_series_id_col = 'start_station_id', forecast_limit_lower_bound = 0) AS SELECT EXTRACT(DATE FROM starttime) AS date, COUNT(*) AS num_trips, start_station_id FROM `bigquery-public-data`.new_york.citibike_trips WHERE starttime > '2014-07-11' AND starttime < '2015-02-11' GROUP BY date, start_station_id;
執行 CREATE MODEL
查詢來建立及訓練模型:
使用設有上限的模型預測時間序列
ARIMA PLUS 模型偵測到 Citi Bike 的每日總趟次數正在減少 (start_station_id=79
)。未來的預測值會遵循這項趨勢,預測值會隨著時間推移而逐漸減少。圖表顯示,CitiBike 每日總行程數的預測值為正數,這更有參考價值。start_station_id=79
設有限制的模型會偵測到 start_station_id=79
的 Citi Bike 每日總趟次數正在減少,但仍會提供有意義的預測值。
如本教學課程所示,forecast_limit_lower_bound
和 forecast_limit_upper_bound
選項可協助您在類似情境中取得更有意義的預測值,例如預測股價或未來銷售量時。
刪除資料集
刪除專案將移除專案中所有的資料集與資料表。若您希望重新使用專案,您可以刪除本教學課程中所建立的資料集。
刪除專案
如要刪除專案,請進行以下操作: