使用 SageMaker DeepAR 度預測演算法 - Amazon SageMaker

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 SageMaker DeepAR 度預測演算法

Amazon SageMaker DeepAR 預測演算法是一種監督式學習演算法,可使用循環神經網路 () 預測純量 (一維) 時間序列。RNN經典的預測方法,例如自動倒退綜合移動平均線 (ARIMA) 或指數平滑 (ETS),可將單一模型適合每個單獨的時間序列。他們接著會使用模型來將時間序列外插至未來。

但是在許多應用程式中,您在一組橫截面單位會有許多類似的時間序列。例如,您可能擁有針對不同產品、伺服器負載和網頁請求需求分組的時間序列。針對這類應用程式,您可以受益於跨越所有時間序列共同訓練的單一模型。DeepAR 便是採用此方法。當您的資料集包含數百個相關的時間序列時,DeepAR 優於標準ARIMA和ETS方法。您也可以使用已訓練的模型,來對類似其已訓練過的新時間序列產生預測。

DeepAR 演算法的訓練輸入是一個或 (最好) 多個由相同程序或類似程序產生的 target 時間序列。根據此輸入資料集,演算法會訓練模型,學習這個程序/多個程序的近似值,並運用它來預測目標時間序列如何演進。每個目標時間序列都可以選擇性地關聯至靜態 (與時間無關) 分類特徵的向量 (由 cat 欄位提供) 及動態 (時間相依) 時間序列的向量 (由 dynamic_feat 欄位提供)。 SageMaker 透過從訓練資料集中的每個目標時間序列中隨機抽樣訓練範例來訓練 DeepAR 模型。每個訓練範例都包括一對相鄰內容和具有固定預先定義長度的預測視窗。若要控制網路能看見的過去時間長度,請使用 context_length 超參數。若要控制網路對未來所能預測的時間長度,請使用 prediction_length 超參數。如需詳細資訊,請參閱DeepAR 演算法的運作方式

DeepAR 演算法的輸入/輸出介面

DeepAR 支援兩種資料通道。必要的 train 通道會描述訓練資料集。選擇性的 test 通道則會描述演算法在訓練後用來評估模型準確度的資料集。您可以使用 L JSONines 格式提供訓練和測試資料集。檔案可以是 gzip 或 Parquet 檔案格式。

指定訓練和測試資料的路徑時,您可以指定單一檔案,或是包含多個檔案的目錄,而這些檔案也都可以存放在子目錄中。如果您指定目錄,Deepar 會使用目錄中的所有檔案作為對應通道的輸入,但以句點 (.) 開頭的檔案和名為 _ SUCCESS 的檔案除外。這能確保您可以直接使用 Spark 任務產生的輸出資料夾,做為 DeepAR 訓練任務的輸入通道。

根據預設,DeepAR 模型會從指定輸入路徑中的檔案副檔名判斷輸入格式 (.json.json.gz.parquet)。如果路徑未以其中一個延伸模組結尾,您必須在 of Python 中明確指定格式。SDK使用 s3_輸入類別的content_type 參數。

您輸入檔案中的記錄應包含下列欄位:

  • start——有格式的字串YYYY-MM-DD HH:MM:SS。開始時間戳記不可包含時區資訊。

  • target——代表時間序列的浮點數值或整數陣列。您可以在 Parquet 中將缺少的值編碼為null常值、"NaN"字串或在 JSON Parquet 中編碼為nan浮點值。

  • dynamic_feat(選用) ——代表自訂特徵時間序列 (動態特徵) 向量的浮點數值或整數陣列。若您設定此欄位,所有記錄都必須擁有相同數量的內部陣列 (相同數量的特徵時間序列)。此外,每個內部陣列都必須與相關聯的 target 值再加上 prediction_length 的長度相同。特徵中不支援遺失的值。例如,如果目標時間序列代表不同產品的需求,相關聯的 dynamic_feat 可能是布林值時間序列,表示促銷是否套用 (1) 於特定產品 (0):

    {"start": ..., "target": [1, 5, 10, 2], "dynamic_feat": [[0, 1, 1, 0]]}
  • cat(選用) — 可用來編碼記錄所屬群組的分類特徵陣列。分類特徵必須編碼為以 0 為基礎的正整數序列。例如,分類領域 {R, G, B} 可編碼成 {0, 1, 2}。每個分類領域中的所有值都必須出現在訓練資料集中。這是因為 DeepAR 演算法只能預測在訓練期間觀察到的分類。此外,每個分類特徵都會內嵌在低維度的空間中,而該空間的維度則由 embedding_dimension 超參數控制。如需詳細資訊,請參閱DeepAR 超參數

如果您使用一個JSON文件,它必須是JSON行格式。例如:

{"start": "2009-11-01 00:00:00", "target": [4.3, "NaN", 5.1, ...], "cat": [0, 1], "dynamic_feat": [[1.1, 1.2, 0.5, ...]]} {"start": "2012-01-30 00:00:00", "target": [1.0, -5.0, ...], "cat": [2, 3], "dynamic_feat": [[1.1, 2.05, ...]]} {"start": "1999-01-30 00:00:00", "target": [2.0, 1.0], "cat": [1, 4], "dynamic_feat": [[1.3, 0.4]]}

在此範例中,每個時間序列都有兩個相關聯的分類特徵,及一個時間序列特徵。

針對 Parquet,您會使用相同的三個欄位來做為欄。此外,"start" 可以是 datetime 類型。您可以使用 gzip (gzip) 或 Snappy 壓縮程式庫 (snappy) 來壓縮 Parquet 檔案。

如果演算法不使用 catdynamic_feat 欄位來訓練,則它會學習一個 “全球” 模型,這是在推論時間內與目標時間序列的特定身分無關的模型,僅以其形狀為條件。

如果模型以每個時間序列所提供的 catdynamic_feat 特徵資料為條件,則預測可能會受到具有相應 cat 特徵之時間序列的字元影響。例如,如果 target 時間序列代表服裝項目的需求,您可以在第一個元件中關聯編碼項目類型的二維 cat 向量 (例如,1 = 鞋子、0 = 包裝),並在第二個元件中關聯項目的顏色 (例如 0 = 紅色、1 = 藍)。範例輸入如下所示:

{ "start": ..., "target": ..., "cat": [0, 0], ... } # red shoes { "start": ..., "target": ..., "cat": [1, 1], ... } # blue dress

在推論時,您可以請求具有 cat 值之目標的預測,這些值是訓練資料中觀察到的 cat 值組合,例如:

{ "start": ..., "target": ..., "cat": [0, 1], ... } # blue shoes { "start": ..., "target": ..., "cat": [1, 0], ... } # red dress

下列準則適用於訓練資料:

  • 時間序列的開始時間和長度可以不同。例如,在行銷中,產品通常在不同的日期進入零售目錄,所以它們的開始日期自然不同。但是,所有序列都必須有相同的頻率、類別特徵數和動態特徵數。

  • 根據檔案中時間序列的位置隨機輪換訓練檔案。換句話說,時間序列在檔案中應以隨機順序發生。

  • 請務必將 start 欄位設定正確。演算法使用 start 時間戳記來衍生內部特徵。

  • 若您使用分類特徵 (cat),所有時間序列都必須具備相同數量的分類特徵。若資料集包含 cat 欄位,演算法會使用它並從資料集截取群組的基數。根據預設,cardinality"auto"。若資料集包含 cat 欄位,但您不想要使用它,您可以將 cardinality 設為 "" 來停用它。若模型是使用 cat 特徵訓練,您必須針對推論包含它。

  • 若您的資料集包含 dynamic_feat 欄位,演算法會自動使用它。所有時間序列都必須擁有相同數量的特徵時間序列。每個特徵時間序列中的時間點與 one-to-one 目標中的時間點相對應。此外,dynamic_feat 欄位中的項目應和 target 具有相同的長度。若資料集包含 dynamic_feat 欄位,但您不想要使用它,請透過設定來停用它 (將 num_dynamic_feat 設為 "")。若模型是使用 dynamic_feat 欄位訓練,您必須針對推論提供此欄位。此外,每個特徵都必須具備所提供目標加上 prediction_length 的長度。換句話說,您必須提供未來的特徵值。

如果您指定選用的測試通道資料,DeepAR 演算法會使用不同的準確率指標,來評估經過訓練的模型。演算法會計算測試資料上的均方根誤差 (RMSE),如下所示:

RMSE公式:平方米(1/NT(總和 [I,t](Y 帽子(我,t)-y(I,t))^ 2))

yi,t 是時間序列 i 在時間 t 時的真值,而 ŷi,t 是預測平均值。總和涵蓋了測試集中的所有 n 時間序列,以及每個時間序列最後的 T 時間點,其中的 T 對應預測期間。您可以藉由設定 prediction_length 超參數,來指定預測期間的長度。如需詳細資訊,請參閱DeepAR 超參數

此外,演算法會使用加權分位數損失來評估預測分布的準確度。對於落在範圍 [0, 1] 之中的分位數,加權分位數損失的定義如下:

加權分位數損失方程。

qi,t(τ) 是模型所預測分布的 τ-quantile (τ 分位數)。若要指定要為哪些分位數計算損失,請設定 test_quantiles 超參數。除了這些之外,指定的分位數損失平均會做為訓練日誌的一部分報告。如需相關資訊,請參閱 DeepAR 超參數

對於推論,DeepAR 接受JSON格式和以下字段:

  • "instances",其中包括以 Lines 格式JSON顯示的一或多個時間序列

  • "configuration" 的名稱,包含產生預測的參數

如需詳細資訊,請參閱DeepAR 推論格式

使用 DeepAR 演算法的最佳實務

準備時間序列資料時,請遵循下列最佳實務以取得最佳結果:

  • 除了分割訓練和測試資料集以外,一律為訓練、測試,和在呼叫模型以進行推論時提供整個時間序列。無論您如何設定 context_length,都不要分割時間序列或只提供一部分。針對延遲值特徵,模型會使用比 context_length 中所設定的值更往前的資料點。

  • 調校 DeepAR 模型時,您可以分割資料集來建立訓練資料集和測試資料集。在典型評估中,您會在用於訓練,但是位於訓練期間可見最後一個時間點之後未來 prediction_length 時間點的相同時間序列上測試模型。您可以建立滿足此條件的訓練和測試資料集,方法是使用整個資料集 (所有可用時間序列的完整長度) 做為測試集,並在訓練期間從每個時間序列移除最後一個 prediction_length 點以用於訓練。在訓練期間,模型便會看不到訓練期間它所評估時間點的目標值。在測試期間,演算法會保留測試集中每個時間序列的最後一個 prediction_length 點,並產生預測。然後,它會比較預測與保留的值。您可以多次重複測試集內的時間序列,但在不同的端點切斷它們,以建立更複雜的評估。使用此方法,平均指標便會從不同時間點的多個預測進行平均。如需詳細資訊,請參閱調校 DeepAR 模型

  • 請避免針對 prediction_length 使用過大的值 (>400),因為這樣會使模型變慢而且較不準確。如果您想要進一步預測未來,請考慮以更低的頻率彙整您的資料。例如,使用 5min 代替 1min

  • 由於使用了延遲,模型可以往回查看時間序列中比 context_length 所指定的值更早的時間。因此,您不必將此參數設為較大的值。我們建議您從針對 prediction_length 所使用的值開始。

  • 我們建議您盡量在越多的時間序列上訓練 DeepAR 模型。雖然在單一時間序列上訓練的 DeepAR 模型可能運作良好,但標準預測演算法 (例如ARIMA或ETS) 可能會提供更準確的結果。當您的資料集包含數百個相關時間序列時,DeepAR 演算法的執行效能便會開始優於標準方法。目前,DeepAR 要求所有訓練時間序列中可用的觀察總數至少為 300。

EC2DeepAR 度演算法的執行個體建議

您可以在GPU和CPU執行個體上以及單機和多機器設定中訓練 DeepAR。我們建議您從單一執行個體開始 (CPU例如,ml.c4.2xlarge 或 ml.c4.4xlarge) 開始,並僅在必要時切換至執行個體和多部電腦。GPU使用GPUs和多台機器僅針對較大型號(每層有許多單元和多層)和大型迷你批量(例如,大於 512)提高吞吐量。

對於推論,DeepAR 僅CPU支援執行個體。

context_lengthprediction_lengthnum_cellsnum_layersmini_batch_size 指定較大的值,可能會建立對小型執行個體來說過大的模型。在這種情況下,請使用較大的執行個體類型,或是減少這些參數的值。此問題也會在執行超參數調校任務時頻繁發生。在這種情況下,請使用大小適合模型調校任務的執行個體類型,並考慮限制關鍵參數的數值上限,避免任務失敗。

DeepAR 範例筆記本

如需示範如何準備時間序列資料集以訓練 SageMaker DeepAR 演算法,以及如何部署經過訓練的模型以執行推論的範例筆記本,請參閱電力資料集的 DeepAR 示範,其中說明 DeepAR 在真實世界資料集上的進階功能。如需建立及存取 Jupyter 筆記本執行個體 (可用來執行中範例) 的指示 SageMaker,請參閱。Amazon SageMaker 筆記本實建立並開啟記事本執行個體之後,請選擇 [SageMaker 範例] 索引標籤以查看所有 SageMaker範例的清單。若要開啟筆記本,請選擇其使用標籤,然後選擇建立複本

如需 Amazon SageMaker Deepar 演算法的詳細資訊,請參閱下列部落格文章: