基於Streamlit_prophet玩轉Prophet時序預測

語言: CN / TW / HK

既然是玩轉,就得easy,在通俗搞懂核心原理的基礎上,重在實踐。

本文首先介紹Prophet模型基本使用,再介紹一個開箱即用的開源專案--Streamlit_prophet,進一步降低Prophet使用門檻(甚至給運營、業務都會用~)

簡介

時間序列受4種成分影響: - 趨勢:巨集觀、長期、持續性的作用力 - 週期:比如商品價格在較短時間內,圍繞某個均值上下波動; - 季節:變化規律相對固定,並呈現某種週期特徵;“季節”不一定按年計,每週、每天的不同時段的規律,也可稱作季節性。 - 隨機:隨機的不確定性,也就是指隨機過程 (Stochastic Process)。

4種成分疊加起來就是對整個時序的影響,有加法模型乘法模型: - 加法模型:相對獨立,4個成分間的影響較小; - 乘法模型:相互影響更明顯;

之前時序文章介紹了AR、MA、ARIMA等傳統的時序模型,但用起來較麻煩,需要不斷調整d\p\q三個引數,雖然可以通過“無腦”隨機搜尋交叉驗證找出合適的引數,但並不絲滑,就算是優秀的資料分析師都會感覺頭皮發麻~(哈哈哈,大佬勿噴)

Prophet,就是為上述場景量身定製的,直接通過引數去調整4種成分,簡單易用,效果拉滿(閃亮登場~)。

Prophet使用

1、安裝

這裡的坑比較多(win下安裝),網上也有很多爬坑記錄,但有一種最簡單的方式--conda安裝: shell conda install pystan conda install prophet

2、使用

基本用法

和scikit-learn的用法風格類似: ```python from prophet import Prophet import pandas as pd

df = pd.read_csv('example_wp_log_peyton_manning.csv')

0、基本方法

建立預測器,擬合數據

m = Prophet() m.fit(df)

設定預測框

future = m.make_future_dataframe(periods=365) future.tail()

對未來時間點進行預測,預測給出預測值和置信區間

forecast = m.predict(future) forecast[['ds','yhat','yhat_lower','yhat_upper']].tail()

畫圖

fig1 = m.plot(forecast)

畫出分量圖

fig2 = m.plot_components(forecast) ```

引入假期因子

```python

1、對【假期和特別活動】進行建模

通過 holidays 引數,將假期因素加入模型

playoffs = pd.DataFrame({ 'holiday': 'playoff', 'ds': pd.to_datetime(['2008-01-13', '2009-01-03', '2010-01-16', '2010-01-24', '2010-02-07', '2011-01-08', '2013-01-12', '2014-01-12', '2014-01-19', '2014-02-02', '2015-01-11', '2016-01-17', '2016-01-24', '2016-02-07']), 'lower_window': 0, 'upper_window': 1, }) superbowls = pd.DataFrame({ 'holiday': 'superbowl', 'ds': pd.to_datetime(['2010-02-07', '2014-02-02', '2016-02-07']), 'lower_window': 0, 'upper_window': 1, }) holidays = pd.concat((playoffs, superbowls))

傳入假期時間構建預測器

m = Prophet(holidays=holidays) forecast = m.fit(df).predict(future) fig = m.plot_components(forecast) ```

引入法定節假日因子

```python

2、另外引入【法定節假日】,加入模型(通過add_country_holidays方法)

m = Prophet(holidays=holidays) m.add_country_holidays(country_name='US') # CN :中國法定節假日 m.fit(df)

forecast = m.predict(future) fig = m.plot_components(forecast) ```

季節性調整

使用“部分傅立葉和"來估計季節性: ```python

3、更改年季節性引數

年季節性,預設是10;周季節性,預設是3

增加傅立葉項的數量可以使季節性適應更快的變化週期,但也可能導致過度擬合

from prophet.plot import plot_yearly m = Prophet(yearly_seasonality=20).fit(df) a = plot_yearly(m) Prophet預設:【每週】和【每年】的季節性,可以使用 add_seasonality方法新增其他季節性,比如每月、每季度、每小時:

4、指定自定義季節性

關閉周季節性,加入月季節性

m = Prophet(weekly_seasonality=False) m.add_seasonality(name='monthly', period=30.5, fourier_order=5) forecast = m.fit(df).predict(future) fig = m.plot_components(forecast) 如果發現假期效應過擬合了,可以通過holidays_prior_scale引數調整(預設是10),降低該引數會減弱假期效應;seasonality_prior_scale,季節效應同理python m = Prophet(holidays=holidays, holidays_prior_scale=0.05).fit(df) forecast = m.predict(future) forecast[(forecast['playoff'] + forecast['superbowl']).abs() > 0][ ['ds', 'playoff', 'superbowl']][-10:] ``` 還有其他用法,不多介紹,可參考個人github上的程式碼示例,示例來源於Prophet官方文件

Streamlit_prophet部署

開源專案官方介紹:

Deploy a Streamlit app to train, evaluate and optimize a Prophet forecasting model visually.

可知,streamlit_prophet是構建在streamlit上、基於prophet時序預測模型的應用。。看官方視訊介紹,感覺很好用,跑起來~

官方視訊應用截圖

1、部署

和本地安裝prophet一樣,坑很多,但還是基於conda去安裝就行。

建立虛擬環境:

shell conda create -n streamlit_prophet python=3.8 activate streamlit_prophet

安裝streamlit_prophet:

```shell conda install pystan

pip install -U streamlit_prophet

啟動服務

streamlit_prophet deploy dashboard ``` 本地訪問:http://127.0.0.1:8080/ ,瀏覽器看到如下介面即說明部署成功~

應用介面

2、使用介紹

官方自帶了一些資料示例,能快速上手;遺憾的是,我們使用只能上傳csv檔案資料(限制了最大200M),不能直連數倉資料自帶資料示例

上傳資料

對於資料列有選擇、過濾、抽樣、清洗模組:

資料預處理

調整潛在拐點、季節、節假日效應引數:

模型引數調整

模型驗證、預測:

3、模型結果

點選左上角執行預測選項,開始模型預測,左側引數調整了,模型會自動重跑: 1、模型預測概覽

模型效能指標: 2、模型指標

模型錯誤分析,第二個圖中,離紅線越遠的點,預測誤差越離譜(便於後續模型調整,誤差最大時間點,是否考慮剔除異常資料): 3、錯誤分析

image.png

藍色陰影是模型預測結果的置信區間(80%),紅線是模型估計的趨勢:

4、預測

更多細節需要小夥伴們自己去嘗試~這裡不一一展示

小結

Streamlit_prophet是一個能大大簡化時序預測的優秀資料產品,對於資料分析師來說非常友好,但最大缺點是不能直連數倉進行預測,有些遺憾~(看開發者後續會不會考慮接入吧)。

但想要用好這類產品(不限於此產品),核心還是在於瞭解業務、深入理解時序模型、Prophet建模方法


參考: 1. http://github.com/artefactory/streamlit_prophet 2. http://facebook.github.io/prophet/docs/quick_start.html#python-api 3. http://github.com/xihuishawpy/little_demo/tree/main/Prophet


歡迎關注個人公眾號:DS數說