時系列予測が必要になってきたので、まずは基礎から試してみる。
Prophetの使い方メモを参考にした。感謝。
予測手順
Google Colabでやった。まずはインストール&インポート。
!pip install fbprophet
import pandas as pd
from fbprophet import Prophet
from fbprophet import plot
from fbprophet.diagnostics import cross_validation, performance_metrics
例示されていた、あるアメフト選手のWikipediaアクセス数を読み込む。dsが日付で、yが予測値。prophetは2列あれば予測が可能。
中身は2007年12月10日から2016年1月20日までのデータが入っている。
df = pd.read_csv('http://logopt.com/data/peyton_manning.csv')
df
-------------------
ds y
0 2007-12-10 9.590761
1 2007-12-11 8.519590
2 2007-12-12 8.183677
3 2007-12-13 8.072467
4 2007-12-14 7.893572
... ... ...
2900 2016-01-16 7.817223
2901 2016-01-17 9.273878
2902 2016-01-18 10.333775
2903 2016-01-19 9.125871
2904 2016-01-20 8.891374
2905 rows × 2 columns
インスタンスを作成して、 fitする。
m = Prophet() # インスタンスの作成
m.fit(df)
からの予測。列数の多いDFが返ってくる。
future = m.make_future_dataframe(periods=365) # 予測用のDFを365日単位で作成
forecast = m.predict(future) # 予測
forecast.head(3)
---------------------------
ds trend yhat_lower yhat_upper trend_lower trend_upper additive_terms additive_terms_lower additive_terms_upper weekly weekly_lower weekly_upper yearly yearly_lower yearly_upper multiplicative_terms multiplicative_terms_lower multiplicative_terms_upper yhat
0 2007-12-10 8.040603 8.199655 9.485692 8.040603 8.040603 0.803055 0.803055 0.803055 0.352293 0.352293 0.352293 0.450762 0.450762 0.450762 0.0 0.0 0.0 8.843657
1 2007-12-11 8.039061 7.967984 9.253545 8.039061 8.039061 0.553139 0.553139 0.553139 0.119645 0.119645 0.119645 0.433495 0.433495 0.433495 0.0 0.0 0.0 8.592200
2 2007-12-12 8.037518 7.784938 8.988550 8.037518 8.037518 0.350502 0.350502 0.350502 -0.066660 -0.066660 -0.066660 0.417162 0.417162 0.417162 0.0 0.0 0.0 8.388020
公式のチュートリアルに従って、列を絞る。yhatが予測値となる。
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
--------------------
ds yhat yhat_lower yhat_upper
3265 2017-01-15 8.200924 7.516356 8.930180
3266 2017-01-16 8.525932 7.754122 9.260552
3267 2017-01-17 8.313330 7.602456 9.031121
3268 2017-01-18 8.145923 7.443560 8.888622
3269 2017-01-19 8.157831 7.418938 8.870197
plotlyで視覚化する。黒点が実際の値、青い帯が予測値の範囲になる。
plot.plot_plotly(m, forecast)
外れ値らしいものや、大きくズレている期間もあるが概ねいい感じに収まっている。
予測の分解
予測した値を分解して表示することもできる。予測値は以下の要素の組み合わせで計算されている。
デフォルトでの出力内容は、トレンド、季節性(年)、季節性(週)で、ホリデーシーズンなどの自ら追加した要素にも分解することが可能。
plot.plot_components_plotly(m, forecast)
トレンドは2012年をピークに下降気味。予測もおおむね下がる傾向を示している。いずれの季節性にも特徴があるようだが、アメフトドメインがないのでよく分からない。
ひとまずチュートリアルはここまで。特に特微量の指定などなく、そこそこの予測値を得られて便利。オプションなどの使い方も紐解いていく。