Python > Prophetによる時系列データの予測
広告
Prophetは、facebookが開発している時系列データ予測用のライブラリです。 試してみます。
予測に使うサンプルデータとして、AirPassengers.csvを使います。 このデータは色々なところで勉強用に使われているので、"AirPassengers.csv"でググれば、データは見つかります。例えば、ここに、データがあります。
以下の説明ではJupyter Notebook環境を前提とします。 Jupyter Notebookのインストールは「Jupyter Notebookを使う」の記事を参照してください。 また、pandasの使い方については、Pandasの使い方を参照してください。
いくつかモジュールが必要なので、importしておきます。
import numpy as np import pandas as pd from matplotlib import pylab as plt import seaborn as sns %matplotlib inline sns.set() from fbprophet import Prophetデータを読み込みます。
data = pd.read_csv('AirPassengers.csv', parse_dates=[0], dtype={1:'float'})Prophetは、'ds'と'y'というカラム名を前提としています。 AirPassengersのカラム名はMonthと#passengersなので、カラム名を変更する必要があります。
data.rename(columns={'Month': 'ds', '#Passengers': 'y'}, inplace=True)これで準備完了です。 データを与えて、Prophetのモデルを構築します。
m = Prophet() m.fit(data)モデルの作成が完了したら、予測します。 365日分、予測してみます。
future = m.make_future_dataframe(365) forecast = m.predict(future)これで予測完了です。すごく簡単です。可視化してみます。
plt.plot(forecast.ds, forecast.yhat, 'r') plt.plot(data.ds, data.y)
すごい。fitメソッドにデータを渡して、make_future_dataframeメソッドに予測期間を渡して、それでpredictメソッドを呼ぶだけで、これはすごいです。
上の例では、AirPassengers.csvの時刻データが「月ごと」なのに、予測を一日ごとに実施していました。 これはProphetのデフォルトの振る舞いなのだと思います。 そこで、予測を一か月単位で行ってみます。
# 月単位(m)で、24個(=2年分)のデータを予測する。 future = m.make_future_dataframe(periods=24, freq='m') forecast = m.predict(future) plt.plot(forecast.ds, forecast.yhat, 'r') plt.plot(ts)
あたりまえだが、グラフ(赤線のほう)がなめらかになりました。
続いて、季節性を考慮してモデルを構築してみます。 一年単位のパターンがありえるので、yearly_seasonalityの値を調節します。
m = Prophet(yearly_seasonality=30) m.fit(data)公式ドキュメントによれば、デフォルトでは、yearly_seasonalityは10とのことです。 10より大きい値を指定することで、周期性をより強く考慮するが、過学習してしまうリスクも高まるそうです。 ちなみに「一週間」や「一日」の周期性も考慮できます。
m = Prophet(yearly_seasonality=20, daily_seasonality=20, weekly_seasonality=20)さて、周期性を考慮したモデルで予測してみましょう。
future = m.make_future_dataframe(periods=24, freq='m') # 月単位(m)で24個(=2年分)予測する。 forecast = m.predict(future) plt.plot(forecast.ds, forecast.yhat, 'r') plt.plot(data.ds, data.y)
先ほどの結果と、大差ない結果となりました。 30じゃなく、20とか40とかにすると、また違った結果になるかもしれません。 ここはチューニングの領域だと思います。
データ分析のライブラリの抽象度がとても高くなっており、簡単に使えるようになっていることがわかりました。すごいですね。