跳到主要內容
公司博客上

使用Facebook Prophet和Apache Spark進行大規模細粒度時間序列預測

分享這篇文章

試試我們的時間序列預測筆記本需求預測解決方案加速器

時間序列預測的進步使零售商能夠產生更可靠的需求預測。現在的挑戰是及時地產生這些預測,並以允許企業對產品庫存進行精確調整的粒度級別進行預測。利用Apache火花™而且Facebook的先知麵對這些挑戰,越來越多的企業發現他們可以克服過去解決方案的可伸縮性和準確性限製。

在這篇文章中,我們將討論時間序列預測的重要性,可視化一些樣本時間序列數據,然後構建一個簡單的模型來展示Facebook Prophet的使用。一旦您習慣於構建單個模型,我們將結合Prophet與Apache Spark™的魔力,向您展示如何同時訓練數百個模型,使我們能夠以目前很少實現的粒度級別為每個單獨的產品-商店組合創建精確的預測。

準確及時的預測比以往任何時候都更加重要

為了更好地預測產品和服務的需求,提高時間序列分析的速度和準確性對零售商的成功至關重要。如果商店中放置了太多的產品,貨架和儲藏室空間就會緊張,產品就會過期,零售商可能會發現他們的財務資源被庫存所束縛,使他們無法利用製造商產生的新機會或消費者模式的轉變。如果商店裏的產品太少,顧客可能無法購買他們需要的產品。beplay体育app下载地址這些預測錯誤不僅會立即導致零售商的收入損失,而且隨著時間的推移,消費者的挫折感可能會驅使他們轉向競爭對手。beplay体育app下载地址

新的預期需要更精確的時間序列預測方法和模型

一段時間以來,企業資源規劃(ERP)係統和第三方解決方案已經為零售商提供了基於簡單時間序列模型的需求預測能力。但隨著技術的進步和行業壓力的增加,許多零售商正在尋求超越線性模型和更傳統的算法。

提供的新功能,例如Facebook的先知這些機器學習模型正從數據科學界湧現出來,公司正在尋求將這些機器學習模型應用於時間序列預測需求的靈活性。

Facebook先知標誌

這種擺脫傳統預測解決方案的轉變,要求零售商等企業不僅要在需求預測的複雜性方麵發展內部專業知識,還要在及時生成數十萬甚至數百萬個機器學習模型所需的工作的有效分配方麵發展專業知識。幸運的是,我們可以使用Spark來分發這些模型的訓練,從而不僅可以預測產品和服務的總體需求,還可以預測每個地點對每種產品的獨特需求。

在時間序列數據中可視化需求季節性

為了演示使用Prophet為單個商店和產品生成細粒度的需求預測,我們將使用一個公開可用的數據集Kaggle。它由10家不同商店50種商品5年的每日銷售數據組成。

首先,讓我們看看所有產品和商店的整體年度銷售趨勢。正如你所看到的,產品銷售總額逐年增長,沒有明顯的趨同跡象。

樣本Kaggle零售數據用於演示Prophet和Spark的組合細粒度需求預測功能接下來,通過每月查看相同的數據,我們可以看到,同比上升的趨勢並不是每個月都在穩步推進。相反,我們看到了一個明顯的季節模式,夏季是高峰,冬季是低穀。的內置數據可視化特性Databricks協beplay娱乐ios作筆記本,我們可以將鼠標移到圖表上,查看每個月的數據值。

在工作日層麵,銷量在周日達到峰值(工作日0),隨後在周一(工作日1)出現大幅下降,然後在一周的其餘時間穩步回升。

演示了用傳統的時間序列預測方法計算季節模式的難度

從Facebook Prophet上的一個簡單的時間序列預測模型開始

如上圖所示,我們的數據顯示了銷售額明顯的同比上升趨勢,以及年度和每周的季節性模式。先知的設計就是要解決這些數據中的重疊模式。

Facebook Prophet遵循scikit-learn API,所以對於任何有sklearn經驗的人來說都應該很容易上手。我們需要傳遞一個2列熊貓DataFrame作為輸入:第一列是日期,第二列是要預測的值(在本例中是銷售額)。一旦我們的數據有了合適的格式,建立一個模型就很容易了:

進口熊貓作為pdfbprophet進口先知#實例化模型並設置參數模型=先知(interval_width =0.95增長=“線性”daily_seasonality =weekly_seasonality =真正的yearly_seasonality =真正的seasonality_mode =“乘法”#擬合模型到曆史數據model.fit (history_pd)

現在我們已經將模型與數據進行了匹配,讓我們用它來構建90天的預測。在下麵的代碼中,我們定義了一個數據集,該數據集既包括曆史日期,也包括使用先知日期的90天之後的日期make_future_dataframe方法:

Future_pd = model.make_future_dataframe(時間=90頻率=' d 'include_history =真正的#預測數據集Forecast_pd = model.predict(future_pd)

就是這樣!現在,我們可以使用Prophet內置的.plot方法來可視化我們的實際數據和預測數據是如何排列的,以及對未來的預測。正如您所看到的,我們前麵描述的每周和季節性需求模式實際上反映在預測結果中。

Predict_fig =模型。情節(forecast_pd包含=“日期”ylabel =“銷售”顯示(圖)

這個可視化有點忙。Bartosz Mikulski報道一個很好的分解這很值得一查。簡而言之,黑點代表我們的實際情況,深藍色線代表我們的預測,淺藍色帶代表我們的(95%)不確定性區間。

與Prophet和Spark並行訓練數百個時間序列預測模型

既然我們已經演示了如何構建單個時間序列預測模型,那麼我們可以使用Apache Spark的強大功能來加倍努力。我們的目標不是為整個數據集生成一個預測,而是為每個產品-商店組合生成數百個模型和預測,作為連續操作執行這將是非常耗時的。

例如,以這種方式構建模型可以讓連鎖雜貨店根據不同地點的不同需求,為他們應該為桑達斯基商店訂購的牛奶量與克利夫蘭商店所需的牛奶量創建精確的預測。

如何使用Spark dataframe分發時間序列數據的處理

數據科學家經常使用分布式數據處理引擎來處理訓練大量模型的挑戰Apache火花.通過杠杆火花集群,集群中的單個工作節點可以與其他工作節點並行訓練模型的子集,大大減少了訓練整個時間序列模型集合所需的總體時間。

當然,在工作節點(計算機)集群上訓練模型需要更多的雲基礎設施,這是有代價的。但是,隨著按需雲資源的容易獲得,公司可以快速提供所需的資源,訓練模型,並快速釋放這些資源,從而允許他們實現大規模的可伸縮性,而無需對物理資產進行長期承諾。

在Spark中實現分布式數據處理的關鍵機製是DataFrame.通過將數據加載到Spark DataFrame中,數據將分布到集群中的各個worker中。這允許這些工作人員以並行的方式處理數據子集,減少執行工作所需的總時間。

當然,每個工作人員都需要訪問完成其工作所需的數據子集。通過根據鍵值分組數據(在本例中是關於store和item的組合),我們將這些鍵值的所有時間序列數據集中到特定的工作節點上。

store_item_history.groupBy (“存儲”“項目”#……
我們在這裏共享groupBy代碼,以強調它如何使我們能夠高效地並行訓練許多模型,盡管在我們在下一節中為數據設置並應用UDF之前,它不會真正發揮作用。

利用pandas用戶定義函數的強大功能

時間序列數據按商店和商品正確分組後,我們現在需要為每一組訓練一個模型。為此,我們可以使用熊貓的用戶定義函數(UDF),它允許我們對DataFrame中的每組數據應用自定義函數。

該UDF不僅將為每個組訓練一個模型,而且還將生成一個表示該模型預測的結果集。但是,雖然該函數將獨立於其他組對DataFrame中的每個組進行訓練和預測,但從每個組返回的結果將方便地收集到單個結果DataFrame中。這將允許我們生成存儲項目級別的預測,但將我們的結果作為單個輸出數據集呈現給分析師和經理。

正如您在下麵的簡短Python代碼中看到的,構建UDF相對簡單。類實例化UDFpandas_udf方法,該方法標識它將返回的數據的模式和它期望接收的數據類型。緊接著,我們定義將執行UDF工作的函數。

在函數定義中,我們實例化我們的模型,配置它並使它適應它所接收到的數據。模型進行預測,並將該數據作為函數的輸出返回。

@pandas_udf (result_schema PandasUDFType。GROUPED_MAPdefforecast_store_itemhistory_pd):#實例化模型,配置參數模型=先知(interval_width =0.95增長=“線性”daily_seasonality =weekly_seasonality =真正的yearly_seasonality =真正的seasonality_mode =“乘法”#適合模型model.fit (history_pd)#配置預測Future_pd = model.make_future_dataframe(時間=90頻率=' d 'include_history =真正的#做預測Results_pd = model.predict(future_pd)#……#回報預測返回results_pd

現在,把它們組合在一起,我們用groupBy命令,以確保我們的數據集被正確地劃分為代表特定存儲和項目組合的組。然後我們簡單地應用將UDF添加到我們的數據框架中,允許UDF擬合模型並對每組數據進行預測。

函數對每個組的應用程序返回的數據集被更新,以反映我們生成預測的日期。這將幫助我們跟蹤在不同模型運行期間生成的數據,因為我們最終將功能投入生產。

pyspark.sql.functions進口當前日期結果store_item_history.groupBy (“存儲”“項目”蘋果(forecast_store_item).withColumn (“training_date”當前日期())

下一個步驟

我們現在已經為每個商店-商品組合構建了一個時間序列預測模型。使用SQL查詢,分析師可以查看每個產品的定製預測。在下麵的圖表中,我們繪製了10家商店對產品1的預計需求。正如你所看到的,需求預測因商店而異,但正如我們所預期的,所有商店的總體模式是一致的。

隨著新的銷售數據的到來,我們可以有效地生成新的預測,並將這些預測附加到我們現有的表結構中,允許分析師隨著情況的發展更新業務預期。

要了解更多,請觀看題為星巴克如何利用Facebook Prophet和Azure Databricks進行大規模需求預測看看我們的需求預測解決方案加速器

需求預測網絡研討會標題

免費試用Databricks

相關的帖子

看到所有公司博客上的帖子
Baidu
map