1. 總覽
在本研究室中,您將瞭解如何使用 TensorFlow 建構時間序列預測模型,並瞭解如何使用 Vertex AI 部署這些模型。
課程內容
學習重點:
- 轉換資料,以便用於機器學習模型
- 以圖表呈現及探索資料
- 使用 BigQuery ML 建立時間序列預測模型
- 使用 LSTM 和 CNN 架構,使用 TensorFlow 建構時間序列預測模型
2. 時間序列預測簡介
本程式碼研究室的重點,在於如何使用 Google Cloud Platform 套用時間序列預測技術。這並非一般時間序列預測課程,但概念的快速導覽可能會對使用者有所幫助。
時間序列資料
首先,什麼是時間序列?而是會在固定時間間隔內記錄資料的資料集。時間序列資料集同時含有時間,以及至少一個依賴時間的變數。
元件
時間序列可拆解為元件:
- 趨勢:在可預測的模式中向上或向下移動
- 季節性:在特定期間重複,例如一天、週、月、季等。
- 隨機:剩餘波動
季節性因素可能有多個因素。舉例來說,客服中心在一週或特定月份的通話量都可能呈現模式。除了時間以外,殘存的可能還有其他變數可以解釋。
電台
為獲得最佳預測結果,時間序列資料應設為「持續性」,其中平均值和變異數等統計資料屬性在一段時間後會保持不變。不同技術 (如差異與分解) 可應用到原始資料,使資料更加不穩定。
舉例來說,下圖所示的二氧化碳濃度呈現每年重複的趨勢,且呈現上升趨勢。( 資料來源)
移除線性趨勢後,由於資料現在擁有固定的平均值,因此更適合用於預測。
將時間序列資料用於機器學習
如要在機器學習問題中使用時間序列資料,則需要轉換這些資料,以便使用先前的值預測未來的值。下表示範瞭如何建立延遲變數以協助預測目標。
瞭解一些基本概念後,接著就來探索資料和預測吧!
3. 設定筆記本環境
既然我們已簡單介紹一下資料,接著就來設定模型開發環境。
步驟 1:啟用 API
BigQuery 連接器會使用 BigQuery Storage API。在控制台中搜尋 BigQuery Storage API,並啟用這個 API (如果目前已停用)。
步驟 2:建立 Vertex AI Workbench 筆記本
前往 Cloud 控制台的 Vertex AI Workbench 部分,然後按一下「新增筆記本」。接著,選取最新的「TensorFlow 企業版 2.x」筆記本類型,但「不含 GPU」:
使用預設選項,然後點選「建立」。執行個體建立完成後,請選取「Open JupyterLab」:
接著,從 JupyterLab 建立 Python 3 筆記本:
步驟 3:下載研究室教材
透過 JupyterLab 介面建立新的終端機視窗:File ->新功能 ->。
接著使用以下指令複製來源內容:
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
清除筆記本中的所有儲存格 (依序點選「編輯」>「清除所有輸出內容」),在前幾個儲存格中變更區域、專案和值區設定,然後逐一執行儲存格。
步驟 3
您已在本節中匯入資料,並以各種維度呈現資料。對資料有更清楚的瞭解後,即可開始使用這項資料進行機器學習模型模擬。
5. 使用 BigQuery 時間序列預測功能建立模型
在本節中,您將進行以下作業:
- 將時間序列輸入資料匯入 BigQuery 資料表
- 使用 BQML 語法建立時間序列模型
- 瞭解如何評估模型參數和準確率
- 使用模型預測
步驟 1
接下來,我們要使用剛剛探索的 CSV 檔案建立 BigQuery 資料表。首先,從筆記本環境下載 CSV。
在 training-data-analyst/courses/ai-for-time-series/notebooks/data
目錄中,以滑鼠右鍵按一下 cta_ridership.csv
,然後下載至您的本機環境。
步驟 2
接著,我們會將這些資料上傳到 BigQuery 資料表。
透過搜尋或使用這個連結,前往控制台中的 BigQuery:
您可將資料表新增至新的或現有資料集,並將相關資料表分組。如果尚未建立資料集,可以按一下左下角的專案,然後選取右下角的「Create Dataset」(建立資料集)。
請選擇您選擇的名稱 (例如 demo
),接受預設值,然後繼續。
選取該資料集後,選取右下角的「Create Table」建立新資料表。
選取資料表建立選項:
- 使用下列資料建立資料表:上傳
- 選取檔案:cta_ridership.csv
- 資料表名稱:cta_ridership
- 結構定義:勾選方塊來自動偵測「結構定義和輸入參數」
步驟 3
現在,讓我們來建立模型!BigQuery ML 採用與 SQL 類似的簡單語法,可讓您建立多種模型類型。
在查詢編輯器中貼上/輸入這項查詢。如有需要,在 2 個位置以資料集名稱取代「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 的遞增順序傳回結果或 Akaike 資訊條件,並提供模型品質的相對指標。因此,第一列的模型 AIC 最低,屬於最佳模型。
您可以看到 ARIMA 模型的 p、d 和 q 參數,以及模型中發現的季節性。在本例中,熱門模式會同時納入每週和每年的季節性變化。
步驟 5
現在可以使用 ML.FORECAST
函式進行預測了!
在下方貼上/輸入以下內容 (視需要替換示範):
SELECT * FROM ML.FORECAST(MODEL `demo.cta_ridership_model`, STRUCT(7 AS horizon))
這項查詢只是運用我們的模型預測過去 7 天的時間!我們可以看到下方傳回的七列。預測結果也包含信賴區間,預設值為 0.95,但可在查詢中設定。
好極了:我們建立了一個時間序列模型,而且只使用幾個 BQML 查詢。
6. 建立自訂預測模型
在本節中,您將進行以下作業:
- 移除資料中的離群值
- 執行多步驟預測
- 在時間序列模型中加入額外特徵
- 瞭解用於時間序列預測的類神經網路架構:LSTM 和 CNN
- 瞭解統計模型,包括 Holt-Winters 指數平滑
- Ensemble 模型
步驟 1
在 Vertex AI Workbench 中,前往 training-data-analyst/courses/ai-for-time-series/notebooks
並開啟 02-model.ipynb
。
步驟 2
清除筆記本中的所有儲存格 (依序點選「編輯」>「清除所有輸出內容」),在前幾個儲存格中變更區域、專案和值區設定,然後逐一執行儲存格。
步驟 3
在筆記本中,您已瞭解多個模型架構:LSTM、CNN 和統計模型。您可以針對每個模型,根據測試資料查看模型成效:
7. 在雲端中進行訓練和預測
在本節中,您將進行以下作業:
- 準備在雲端中訓練的資料和模型
- 透過 AI 平台訓練訓練模型,並監控工作進度
- 搭配 AI 平台預測使用模型進行預測
步驟 1
在 Vertex AI Workbench 中,前往 training-data-analyst/courses/ai-for-time-series/notebooks
並開啟 03-cloud-training.ipynb
。
步驟 2
清除筆記本中的所有儲存格 (依序點選「編輯」>「清除所有輸出內容」),在前幾個儲存格中變更區域、專案和值區設定,然後逐一執行儲存格。
步驟 3
在上一節中,我們訓練了模型並進行預測,這些模型全都在 Workbench 筆記本中。在本節中,我們將說明如何從筆記本使用 Vertex AI 適用的 Python SDK,以使用 Vertex AI 服務進行訓練和部署。
8. 挑戰
在本節中,您將嘗試將所學概念應用到新的資料集!
我們不會提供詳細操作說明,只有您可以獲得一些提示。
目標是預測來自紐約市的 311 項服務要求。這類非緊急要求包括噪音申訴、路燈問題等
步驟 1
首先來瞭解資料集
首先,請存取 City of New York 311 Service Request 資料集。
如要進一步瞭解資料,請嘗試參考資料集說明中列出的幾個範例查詢,方法如下:
- 在 311 服務要求中,與冰淇淋車有關的要求有多少個?
- 哪些天接到與派對有關的 311 服務要求最多?
在 BigQuery UI 中,選取「Create Query」(建立查詢),瞭解如何存取資料集。請注意,Select 陳述式是從 bigquery-public-data.new_york_311.311_service_requests
查詢。
步驟 2
我們準備好大顯身手了。在本節中,請修改「探索並視覺化」筆記本,以便處理這項資料。
提示
- 複製
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 使用者介面中,選取筆記本,然後選取「Stop」:
如要刪除在本研究室中建立的所有資源,只要刪除工作台筆記本即可,不必停止資源。
透過 Cloud 控制台中的導覽選單前往「儲存空間」,然後刪除您為了儲存模型資產而建立的兩個值區 (警告:只有在您專為本研究室建立新值區的情況下,才需要執行這項操作)。