1. 總覽
在本實驗室中,您將瞭解如何使用 TensorFlow 建構時間序列預測模型,然後瞭解如何使用 Vertex AI 部署這些模型。
課程內容
內容如下:
- 轉換資料,以便用於機器學習模型
- 以圖表呈現及探索資料
- 使用 BigQuery ML 建立時間序列預測模型
- 使用 LSTM 和 CNN 架構,透過 TensorFlow 建構時間序列預測模型
2. 時間序列預測簡介
本程式碼研究室的重點是說明如何使用 Google Cloud Platform 套用時間序列預測技術。這不是一般的時間序列預測課程,但簡要介紹相關概念或許對使用者有幫助。
時間序列資料
首先,什麼是時間序列?這類資料集會定期記錄資料。時間序列資料集包含時間和至少一個依時間而定的變數。

元件
時間序列可分解為下列元件:
- 趨勢:以可合理預測的模式上升或下降
- 季節性:在特定時間範圍內重複,例如一天、一週、一個月、一季等。
- 隨機:剩餘波動
季節性可能有多個層面。舉例來說,客服中心可能會發現,通話量在每週的特定幾天和特定月份會出現規律變化。除了時間以外,其他變數或許也能解釋殘差。

平穩性
為獲得最佳預測結果,時間序列資料應為平穩資料,也就是平均值和變異數等統計屬性會隨時間保持不變。您可以對原始資料套用差分和去趨勢等技術,讓資料更平穩。
舉例來說,下方的二氧化碳濃度圖表顯示每年重複的模式,且呈現上升趨勢。( 來源)

移除線性趨勢後,資料的平均值會保持不變,因此更適合用於預測。

使用時間序列資料進行機器學習
如要在機器學習問題中使用時間序列資料,必須先轉換資料,才能使用先前的值預測後續值。下表顯示如何建立延遲變數,協助預測目標。

瞭解一些基本概念後,我們就來探索資料並進行預測吧!
3. 設定 Notebook 環境
簡要介紹完資料後,現在來設定模型開發環境。
步驟 1:啟用 API
BigQuery 連接器使用 BigQuery Storage API。在控制台中搜尋 BigQuery Storage API,如果目前已停用,請啟用該 API。

步驟 2:建立 Vertex AI Workbench 筆記本
前往 Cloud Console 的 Vertex AI Workbench 區段,然後按一下「New Notebook」(新增筆記本)。然後選取最新版的「TensorFlow Enterprise 2.x」筆記本類型,且「不加入任何 GPU」:
使用預設選項,然後按一下「建立」。建立執行個體後,請選取「Open JupyterLab」:

接著,從 JupyterLab 建立 Python 3 筆記本:

步驟 3:下載實驗室教材
在 JupyterLab 介面中建立新的終端機視窗:依序點選「File」>「New」>「Terminal」。
然後使用下列指令複製來源素材:
git clone https://github.com/GoogleCloudPlatform/training-data-analyst
4. 探索及視覺化呈現資料
本節內容:
- 建立查詢,將資料分組為時間序列
- 填入缺少的值
- 以視覺化方式呈現資料
- 將時間序列分解為趨勢和季節性成分
步驟 1
在 Vertex AI Workbench 中,前往 training-data-analyst/courses/ai-for-time-series/notebooks 並開啟 01-explore.ipynb。
步驟 2
清除筆記本中的所有儲存格 (依序點選「Edit」>「Clear All Outputs」),在其中一個前幾個儲存格中變更區域、專案和 bucket 設定,然後逐一執行儲存格。
步驟 3
在本節中,您已匯入資料,並以視覺化方式呈現各種維度。現在您已對資料有更清楚的瞭解,可以準備使用這些資料進行機器學習建模。

5. 使用 BigQuery 時間序列預測建立模型
本節內容:
- 將時間序列輸入資料匯入 BigQuery 資料表
- 使用 BigQuery ML 語法建立時間序列模型
- 瞭解如何評估模型參數和準確率
- 使用模型進行預測
步驟 1
我們將使用剛才探索的 CSV 檔案中的原始資料,建立 BigQuery 資料表。首先,請從筆記本環境下載 CSV 檔。
在 training-data-analyst/courses/ai-for-time-series/notebooks/data 目錄中,在 cta_ridership.csv 上按一下滑鼠右鍵,然後下載至本機環境。
步驟 2
接著,我們會將這項資料上傳至 BigQuery 資料表。
在控制台中前往 BigQuery (搜尋或使用這個連結):

您可以將資料表新增至新資料集或現有資料集,這類資料集會將相關資料表分組。如果尚未建立資料集,可以按一下左下角的專案,然後選取右下角的「建立資料集」。

選擇名稱 (例如 demo),接受預設值,然後繼續。
選取該資料集後,選取右下角的「建立資料表」,即可建立新資料表。

選取下列任一資料表建立選項:
- 建立資料表來源:上傳
- 選取檔案:cta_ridership.csv
- 資料表名稱:cta_ridership
- 結構定義:勾選方塊,自動偵測「結構定義和輸入參數」

步驟 3
現在要建立模型了!BigQuery ML 提供類似 SQL 的簡單語法,可讓您建立各種模型類型。
在查詢編輯器中,貼上/輸入這項查詢,並視需要將兩處的「demo」換成資料集名稱:
CREATE OR REPLACE MODEL
`demo.cta_ridership_model` OPTIONS(MODEL_TYPE='ARIMA',
TIME_SERIES_TIMESTAMP_COL='service_date',
TIME_SERIES_DATA_COL='total_rides',
HOLIDAY_REGION='us') AS
SELECT
service_date, total_rides
FROM
`demo.cta_ridership`
讓我們瞭解語法的重要元素:
| 這個陳述式會建立模型。這個陳述式有許多變體,例如 |
| 在這裡,我們會定義模型選項,第一個選項是模型類型。選取 ARIMA 會建立時間序列預測模型。 |
| 包含日期/時間資訊的資料欄 |
| 資料欄 |
| 這個選用參數可讓我們將節慶納入模型。由於上一個步驟的資料探索顯示,節慶假日的乘客人數較少,且資料來自美國伊利諾州芝加哥,因此我們將美國節慶假日納入模型。 |
| 這個部分會選取用來訓練模型的輸入資料。 |
您可以在查詢中新增多項其他選項,例如在有多個時間序列時定義資料欄,或是選擇是否自動探索 ARIMA 模型參數。詳情請參閱時間序列模型的 CREATE MODEL 陳述式語法參考資料。
步驟 4
讓我們進一步瞭解我們的模型。訓練完成後,請再次執行查詢,並視需要替換 demo:
SELECT * FROM ML.EVALUATE(MODEL `demo.cta_ridership_model`)
現在來解讀結果。每列都會顯示候選模型及其參數和評估統計資料。結果會依 AIC (即 赤池資訊量準則) 遞增排序,這項指標可相對指出模型品質。因此,第一列中的模型 AIC 最低,可視為最佳模型。
您會看到 ARIMA 模型的 p、d 和 q 參數,以及模型中發現的季節性。在本例中,最佳模型包含每週和每年的季節性因素。

步驟 5
現在,我們可以使用 ML.FORECAST 函式預測結果了!
貼上/輸入下列內容 (如有需要,請將 demo 換成其他名稱):
SELECT
*
FROM
ML.FORECAST(MODEL `demo.cta_ridership_model`,
STRUCT(7 AS horizon))
這項查詢只會使用我們的模型預測 7 天後的結果!我們可以看到下方傳回的七個資料列。預測結果也會包含信賴區間 (預設為 0.95,但可在查詢中設定)。

做得好!我們只用了幾項 BQML 查詢,就建立了一個時間序列模型。
6. 建立自訂預測模型
本節內容:
- 從資料中移除離群值
- 執行多步驟預測
- 在時間序列模型中加入其他特徵
- 瞭解時間序列預測的類神經網路架構:LSTM 和 CNN
- 瞭解統計模型,包括 Holt-Winters 指數平滑法
- 集成模型
步驟 1
在 Vertex AI Workbench 中,前往 training-data-analyst/courses/ai-for-time-series/notebooks 並開啟 02-model.ipynb。
步驟 2
清除筆記本中的所有儲存格 (依序點選「Edit」>「Clear All Outputs」),在其中一個前幾個儲存格中變更區域、專案和 bucket 設定,然後逐一執行儲存格。
步驟 3
在筆記本中,您已探索多種模型架構:LSTM、CNN 和統計模型。您可以查看每個模型在測試資料上的效能:

7. 在雲端訓練及預測
本節內容:
- 準備要用於雲端訓練的資料和模型
- 使用 AI Platform Training 訓練模型並監控工作進度
- 使用 AI Platform Prediction 透過模型進行預測
步驟 1
在 Vertex AI Workbench 中,前往 training-data-analyst/courses/ai-for-time-series/notebooks 並開啟 03-cloud-training.ipynb。
步驟 2
清除筆記本中的所有儲存格 (依序點選「Edit」>「Clear All Outputs」),在其中一個前幾個儲存格中變更區域、專案和 bucket 設定,然後逐一執行儲存格。
步驟 3
在上一節中,我們在 Workbench 筆記本中訓練模型並進行預測。在本節中,我們示範如何從筆記本使用 Vertex AI Python SDK,透過 Vertex AI 服務進行訓練和部署。

8. 挑戰
在本節中,您將嘗試將所學概念套用至新的資料集!
我們不會提供詳細說明,只會給予一些提示 (如有需要!)。
目標是預測紐約市的 311 服務要求。這類非緊急要求包括噪音投訴、路燈問題等。
步驟 1
首先,請瞭解資料集。
首先,請存取「City of New York 311 Service Requests」資料集。
如要進一步瞭解資料,請試用資料集說明中列出的幾個查詢範例:
- 在 311 服務要求中,與冰淇淋車有關的要求有多少個?
- 哪些天接到與派對有關的 311 服務要求最多?
在 BigQuery UI 中選取「建立查詢」,即可查看如何存取資料集。請注意,選取陳述式是從 bigquery-public-data.new_york_311.311_service_requests 查詢。
步驟 2
我們已準備好開始。在本節中,請修改「Explore and Visualize」筆記本,以便使用這項資料。
提示
- 複製
01-explore.ipynb筆記本,然後開始使用。 - 如要探索資料,請嘗試以下查詢:
from google.cloud import bigquery as bq
sql = """
SELECT * FROM `bigquery-public-data.new_york_311.311_service_requests` LIMIT 5
"""
client = bq.Client(project=PROJECT)
df = client.query(sql).to_dataframe()
df.head()
- 如要按月取得事件計數,請使用這項查詢:
SELECT
COUNT(unique_key) as y,
DATE_TRUNC(DATE(created_date), month) as ds
FROM `bigquery-public-data.new_york_311.311_service_requests`
GROUP by ds ORDER BY ds asc
- 更新常數部分中的資料欄變數。在上述查詢中,目標資料欄為 y,日期資料欄為 ds。沒有其他功能。
- 請考慮變更匯出資料的檔案名稱,以供下一個實驗室使用。
- 使用下列方式匯出資料:
df.to_csv(YOUR-EXPORT-FILENAME, index=False)
步驟 3
現在,我們來使用每月資料建立時間序列模型。
提示:
- 複製
02-model.ipynb筆記本,然後開始使用。 - 更新資料集參數:
- 更新
target_col和ts_col參數,使其與新資料集相符。 - 更新模型參數:
- 頻率為每月 (月份開始的代碼為「MS」)
- 輸入步驟:12 (回溯期為 12 個月)
- 輸出步驟:3 (預測未來 3 個月)
- 季節:12 (季節性為 12 個月)
- 如果您在先前的筆記本中變更了輸入檔案名稱,請一併變更。
- 如果您在月中執行查詢,最後一個月的每月總計金額會遠低於預期。因此,為了本實驗室的目的,請使用
df = df[:-1]從資料集中移除最後一個月。 - 資料中似乎沒有明顯的離群值,因此請略過或註解掉這些儲存格。
- 調整這個新模型的 LSTM 單位、CNN 篩選器和核心大小。
9. 清除
如要繼續使用這部筆電,建議在不使用時關機。在 Cloud 控制台的 Workbench 使用者介面中,選取筆記本,然後選取「停止」:

如要刪除在本實驗室中建立的所有資源,請刪除工作台筆記本,而非停止執行。
使用 Cloud 控制台的導覽選單,瀏覽至「儲存空間」,然後刪除您建立的兩個 bucket,以儲存模型資產 (警告:只有在您專為本實驗室建立新 bucket 時,才執行這項操作)。
