【データ分析】ProphetのQucik Start
時系列予測をシンプルに実行できるProphetについて説明します。
1. prophetについて
1.1 prophetとは時系列予測モデルの1つ
Prophetは、Facebookが開発したPythonの時系列予測モデルです。
Prophetは、自動的にトレンド、季節性、超長期トレンド、祝日などを認識して、優れた予測結果を生成することができます。
数ある時系列予測モデルの中で、かなりシンプルに扱えるライブラリのようです。(そんなに色々使ったことない)
1.2 fbprophetとの違いは?
prophetでコードを調べていると、fbprophetについてよく書かれています。Colaboでこれを実行した時に、インストールに失敗したりしてよく分かりませんでした。
調べると、Facebookが開発したもので新しいのがprophet?ということらしいです。海外のチャットサイトで読んだのでよく分からない・・・
ただ、prophetのドキュメントでもfbprophet出て来ないのでそうなのかも。
2. prophetの使い方
ドキュメント(↑)を参考にしてざっくりと書きます。
2.1 まずはインストール
# Python
import pandas as pd
from prophet import Prophet
2.2 データ読み込みとカラム名変更
次にデータを読み込みます。
この時にちょっと注意が必要で、カラム名を指定のものに変更する必要があります。
日時データをds、目的変数をyです。
このサンプルデータは元々カラム名が変更されているので、
任意のデータを読み込んだ時にミスりやすいです。
カラム名変更する場合は普通にrename。
df = pd.read_csv('https://raw.githubusercontent.com/facebook/prophet/main/examples/example_wp_log_peyton_manning.csv')
# df_tmp.rename(columns={'A': 'ds', 'B': 'y'}, inplace=True) カラム名を変更する場合のコード ※このデータでは変更不要
2.3 モデル生成(&パラメータ調整)
次にモデルを生成する。恐ろしいほど簡単に出来てしまう。
精度上げたいときはProphet内でパラメータのチューニングをしましょう。
以下はデフォルト
(growth='linear', changepoints=None, n_changepoints=25, changepoint_range=0.8, yearly_seasonality='auto', weekly_seasonality='auto', daily_seasonality='auto', holidays=None, seasonality_mode='additive', seasonality_prior_scale=10.0, holidays_prior_scale=10.0, changepoint_prior_scale=0.05, mcmc_samples=0, interval_width=0.8, uncertainty_samples=1000, stan_backend=None)
m = Prophet()
m.fit(df)
2.4 予測用のデータフレームを作成する
予測すらためのdsのみのフレームを作成します。
デフォルトは日別の予測用になっていて、日×時間別の場合は2行目のようにする。
future = m.make_future_dataframe(periods=365)
# future = model.make_future_dataframe(periods=test_length, freq='H')
2.5 予測結果をfutureに反映する
以下でyhatとして予測結果が追加される。
LOWERとUPPERは多分信頼区間のことを言っている。
forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
2.6 グラフを出してみる
fig1のグラフは、黒が実測|青が予測|青の帯が信頼区間95%の範囲
fig2はそれぞれの期間での周期をプロットしている。
モデルを改良したり傾向を見るのに使える。
fig1 = m.plot(forecast)
fig2 = m.plot_components(forecast)
2.7 精度検証
グラフだけでは精度が測りにくいので、
MAPEなどの評価指標で出すと分かりやすいと思います。
よくあるresultsに、テストデータに使用したyと、
予測したforecastのyhatを格納して、以下のようにすれば、
手組で算出できます。
np.mean(abs((results['yhat'] - results['y'])/results['y'])*100)
ここはメソッドない・・みたいです。
3. 感想
とてもシンプルに実行できるので、さくっと使えるようにしておけば、
予測したいタスクに対してそこそこの精度で、予測値を返せるようになりそうです。
なによる簡単にトレンドや曜日周期など可視化できる。
一方で説明変数の追加はしにくそうで、
データコンペにこれ一本で立ち向かうにはシンプル過ぎるのかもしれない。
他のブログを読んでいて、アンサンブルの一つに入れていたという話もあったので、そういう使い方もあるのかもしれませんが、
それにチャレンジするのはもう少し先の話。
この記事が気に入ったらサポートをしてみませんか?