限制 `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.
-
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
在 Google Cloud 控制台中,按一下「Compose new query」(撰寫新查詢) 按鈕。
在查詢編輯器中輸入下列 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 控制台中,按一下「Compose new query」(撰寫新查詢) 按鈕。
在查詢編輯器中輸入下列 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 控制台中,按一下「Compose new query」(撰寫新查詢) 按鈕。
在查詢編輯器中輸入下列 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 控制台中,按一下「Compose new query」(撰寫新查詢) 按鈕。
在查詢編輯器中輸入下列 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 控制台中,按一下「Compose new query」(撰寫新查詢) 按鈕。
在查詢編輯器中輸入下列 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」。這個動作將會刪除資料集、資料表,以及所有資料。
在「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 快速入門:使用 BigQuery DataFrames,按照 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 快速入門:使用 BigQuery DataFrames,按照 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
函式,將所有子時間序列元件 (例如季節性和趨勢) 以視覺化方式呈現。
詳細步驟如下:
圖表顯示,如果 start_station_id=79
為負值,則 Citi Bike 每日總行程數的預測值就沒有用處。使用設有限制的模型,可改善預測資料。
建立有限制的時間序列模型
使用紐約市 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
) 有下降的趨勢。未來的預測值會遵循這項趨勢,且預測數字會隨著時間推移而變得較小。圖表顯示,在 start_station_id=79
為正數的情況下,紐約市自行車每日總趟數的預測值較實用。設有限制的模型會偵測 Citi Bike 單日總趟數 (start_station_id=79
) 有下降趨勢,但仍會提供有意義的預測值。
如本教學課程所示,在預測股價或未來銷售數字等類似情境中,您可以使用 forecast_limit_lower_bound
和 forecast_limit_upper_bound
選項,取得更有意義的預測值。
刪除資料集
刪除專案將移除專案中所有的資料集與資料表。若您希望重新使用專案,您可以刪除本教學課程中所建立的資料集。
刪除專案
如要刪除專案,請進行以下操作: