基於Streamlit_prophet玩轉Prophet時序預測
既然是玩轉,就得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、模型結果
點選左上角執行預測選項,開始模型預測,左側引數調整了,模型會自動重跑:
模型效能指標:
模型錯誤分析,第二個圖中,離紅線越遠的點,預測誤差越離譜(便於後續模型調整,誤差最大時間點,是否考慮剔除異常資料):
藍色陰影是模型預測結果的置信區間(80%),紅線是模型估計的趨勢:
更多細節需要小夥伴們自己去嘗試~這裡不一一展示
小結
Streamlit_prophet是一個能大大簡化時序預測的優秀資料產品,對於資料分析師來說非常友好,但最大缺點是不能直連數倉進行預測,有些遺憾~(看開發者後續會不會考慮接入吧)。
但想要用好這類產品(不限於此產品),核心還是在於瞭解業務、深入理解時序模型、Prophet建模方法
。
參考: 1. https://github.com/artefactory/streamlit_prophet 2. https://facebook.github.io/prophet/docs/quick_start.html#python-api 3. https://github.com/xihuishawpy/little_demo/tree/main/Prophet
歡迎關注個人公眾號:DS數說