數值缺失的狀況下如何進行機器學習預測?Amazon Forecast幫你來補全

image
在使用機器學習技術進行預測時,最麻煩的問題莫過於數據缺失致使的預測結果不許確。但若是你的預測系統使用了Amazon Forecast,那就簡單了,利用該服務自帶的缺失補全功能,數據問題迎刃而解。html

Amazon Forecast是一項全託管服務,使用機器學習技術生成高準確性預測,且使用者無需具有任何固有機器學習經驗。Forecast適用於多種用例,包括估算產品需求、供應鏈優化、資源規劃、能源需求預測以及計算雲基礎設施使用狀況等。git

藉助Forecast,咱們無需配置服務器或者手動構建機器學習模型,便可享有強大的預測能力。此外,只須要爲本身實際使用的資源付費,其中不存在任何最低成本或預先使用承諾。要使用Forecast,咱們只須要提供待預測變量的歷史數據,以及可能影響預測結果的任何可選相關數據。其中後一部分數據能夠包括隨時間變化的數據(例如價格、事件與天氣),以及分類數據(例如顏色、類型或地區等)。該服務會根據您的數據自動訓練並部署機器學習模型,同時提供API以檢索預測結果。github

在現實預測場當中,咱們每每會發現原始數據中存在嚴重的數值缺失。歷史數據(或者時間序列)中缺乏值,則表明其沒法在各個時間段內提供真實的對應值。這種數值缺失情況可能出自多種緣由,例如在特定時間段內並無對應交易,也多是存在採樣錯誤或者採樣沒法正常進行。算法

Forecast支持對相關及目標時間序列數據集、乃至歷史與預測時間段內的缺失值(包括現有的NaN值)進行自動估算。相關時間序列(RTS)數據中一般涵蓋促銷、價格或與目標值(產品需求量)等相關的缺失信息,在補全以後將顯著提升預測準確率。你們可使用多種缺失值邏輯,包括value、median、min、max、zero、mean與nan(僅適用於目標時間序列)等,具體取決於實際用例。你們能夠在CreatePredictor API中經過FeaturizationConfig使用Forecast提供的這項功能。windows

本文將使用Forecast GitHub repo中的Notebook示例,向你們展現爲相關及目標時間序列(TTS)數據集進行缺失值補全的功能。服務器

在Forecast中處理缺失值dom

時間序列中的缺失值,表明因爲多種緣由而沒法使用真實對應值完成進一步處理的狀況。對於表明產品銷售狀況的時間序列,這些缺失值可能意味着該產品在特定時段內沒法上架銷售 —— 例如產品發佈以前、產品淘汰以後,或者產品暫時不可用(暫時缺貨)。固然,缺失值也可能意味着咱們在這段時間以內沒有記錄下銷售數據。機器學習

即便是在「沒法銷售」並致使目標值爲零的狀況下,咱們面對的缺失值實際上也提示出其餘一些信息。例如,咱們正在銷售、但當前庫存爲零所形成的缺失值表示爲zero,而產品根本沒有正式上市所引起的缺失值一般表示爲nan。正由於如此,若是在目標時間序列中填充zero,則可能致使變量預測值發生過分偏移;而填充nan則可能與售出「零」個商品條目的實際狀況不符,一樣有可能致使預測變量過分偏移。性能

如下時間序列圖,展現了選擇錯誤的填充值如何嚴重影響模型的準確性。圖A與圖B分別表明缺貨商品的需求,黑線表明實際銷售數據。A1中的缺失值被填充爲zero,這致使A2中的預測結果相對偏低(由虛線表示)。一樣的,B1中的缺失值用nan填充,所以在B2中的預測結果更貼近實際值。
image
Forecast提供多種填充方法,用於處理TTS與RTS數據集中的缺失值。所謂填充,是將標準化值添加至數據集中缺失條目的過程。在回溯測試期間,預測會將填充的值(除NaN之外)假定爲真實值,並將其用於評估指標。Forecast支持如下幾種填充方法:學習

  • 中間填充 —— 填充條目開始日期與結束日期之間的全部缺失值。
  • 回溯填充 —— 填充條目最後記錄的數據點與數據集全局結束日期(全部條目的最後結束日期)之間的全部缺失值。
  • 將來填充(僅適用於RTS)—— 填充數據集全局結束日期與預測範圍終點之間的全部缺失值。

下圖所示,直觀展示了這幾種不一樣的填充方法。
image

下表列出了每種方法所支持的不一樣填充選項。關於更多詳細信息,請參閱處理缺失值

imageimage

獲取數據

咱們首先須要爲TTS與RTS導入數據。在本用例中,使用的數據文件爲tts.csv與rts.csv。其中tts.cv會按月對多個商品的需求進行跟蹤,而rts.csv文件則跟蹤各商品的每個月平均價格。這就模擬出了一種至關常見的零售場景。接下來,咱們使用Forecast中的填充方法與邏輯,對這些數據集中的缺失值進行填充。首先,使用如下Python示例代碼對示例商品(item_001)的需求進行可視化:

df = pd.read_csv( "./data/tts.csv" )

df[ df["item_id"]=="item_001" ].plot( x="timestamp" )

image

建立數據集組與數據集

如今,咱們須要建立一個數據集組,並經過如下操做步驟向其中添加TTS與RTS數據集:

  • 在Forecast控制檯上的Dataset groups下,選擇Create dataset group。
  • 在Dataset group name部分,輸入filling_analysis_v1。
  • 在Forecasting domain部分,選擇Retail。
  • 選擇Next。

image

  • 在Dataset name部分,輸入filling_analysis_v1_tts。
  • 在Data schema部分,輸入如下代碼:
{
 "Attributes": [
 {
 "AttributeName": "item_id",
 "AttributeType": "string"
 },
 "AttributeName": "timestamp",

 "AttributeType": "timestamp"
 },
 {
 "AttributeName": "demand",
 "AttributeType": "float"
 }
 ]
 }
  • l 選擇Next。

image

  • 在Dataset import name部分,輸入
filling_analysis_v1_tts_dsi。
  • 在Timestamp format部分,輸入yyyy-MM-dd。
  • 在IAM role部分,選擇AmazonForecast-ExecutionRole。
  • 選擇Create dataset import。

image

要導入RTS數據集,請重複以上步驟,並在schema中使用如下代碼:

{
 "Attributes": [
 {
 "AttributeName": "item_id",
 "AttributeType": "string"
 },
 {
 "AttributeName": "timestamp",
 "AttributeType": "timestamp"
 },
 {
 "AttributeName": "price",
 "AttributeType": "float"
 }
 ]
 }

模型建立與推理

在導入數據以後,咱們能夠訓練模型並生成準確率指標。Forecast提供五種內置算法;咱們能夠選擇特定算法,也能夠直接選擇Auto-ML以使Forecast選擇服務中最適合目標功能的算法。關於更多詳細信息,請參閱選擇Amazon Forecast算法

在本用例中,咱們將使用DeepAR+,由於這裏要處理的是300種彼此獨立、且各自擁有兩年曆史數據的商品。當數據集中包含成百上千個時間序列時,DeepAR +算法的性能會優於標準ARIMA與ETS方法。要訓練預測模型,請完成如下操做步驟:

  • 在Forecast控制檯的Train a predictor之下,選擇Start。
  • 在Predictor name部分,輸入filling_analysis_v1。
  • 在Forecast horizon部分,輸入3。
  • 在Forecast frequency部分,選擇month。
  • 在Algorithm部分,選擇Deep_AR_Plus。
  • 在Number of backtest windows部分,輸入1。
  • 在Backtest window offset部分,輸入3。
  • 在Training parameters部分,輸入如下代碼:
{
 "context_length": "6",
 "epochs": "500",
 "learning_rate": "1E-3",
 "learning_rate_decay": "0.5",
 "likelihood": "student-t",
 "max_learning_rate_decays": "0",
 "num_averaged_models": "1",
 "num_cells": "40",
 "num_layers": "2",
 "prediction_length": "3"
}

如今,咱們能夠爲TTS(需求)與RTS(價格)設置缺失值邏輯了。在這裏,咱們將爲TTS與RTS的middlefill與backfill使用mean邏輯。對於futurefill(用於在預測範圍內指定缺失值的邏輯),請在RTS中使用min。另外一種常見的預測狀況,是評估預測期間外部變量(例如價格)的不一樣取值產生的實際影響。這將有助於提高商品計劃效果,使咱們不管面對哪一種狀況都能確保維持恰當的庫存水平。咱們能夠經過更新數據並從新生成預測(關於具體說明,請參閱GitHub repo)、或者使用futurefill方法(同上)併爲模型使用不一樣填充選項(例如max)的方式,在Forecast中模擬這些具體目標場景。

  • 在Featurizations部分,輸入如下代碼:
"AttributeName": "demand",
 "FeaturizationPipeline": [
 {"FeaturizationMethodName": "filling",
 "FeaturizationMethodParameters": {
 "aggregation": "sum",
 "backfill": "mean",
 "frontfill": "none",
 "middlefill": "mean"
 }
 }
 ]
 },
 {
 "AttributeName": "price",
 "FeaturizationPipeline": [
 {"FeaturizationMethodName":"filling",
 "FeaturizationMethodParameters": {
 "backfill": "mean",
 "futurefill": "min",
 "middlefill": "mean"
 }
 }
 ]
 }
]

image

  • 選擇Train predictor。

在模型訓練完成後,咱們能夠轉至預測模型詳細信息頁面以評估相關指標。

建立預測

要建立一項預測,請完成如下操做步驟:

  • 在Forecast控制檯的Forecast generation之下,選擇Start。
  • 在Forecast name部分,輸入filling_analysis_v1_min。
  • 在Predictor部分,選擇filling_analysis_v1。
  • 在Forecast types部分,輸入但願生成預測的分位數;例如.10,.50,.90,.99。
  • 選擇Create a forecast。

預測查詢與可視化

最後,咱們能夠經過控制檯利用QueryForecast API對以上建立的商品預測結果進行可視化處理。

要查詢一項預測,請完成如下操做步驟:

  • 在Forecast控制檯上前往Dashboard,選擇Lookup Forecast。
  • 在Forecast部分,選擇filling_value_v1_min。
  • 在Start date部分,選擇2019/07/01。
  • 在End date部分,選擇2019/12/01。
  • 在item_id部分,選擇item_269(能夠在這裏選擇任意條目)然後點擊Get Forecast。

如今,咱們能夠顯示所選條目的預測需求與歷史需求,以下圖所示。
image
image

總結

本文介紹如何使用Forecast支持的方法選項填充TTS與RTS數據集中的缺失值。你們能夠在提供Forecast服務的全部區域中當即開始使用這項功能。
image

相關文章
相關標籤/搜索