Python > Prophetによる時系列データの予測

更新日 2019-08-16
広告

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とかにすると、また違った結果になるかもしれません。 ここはチューニングの領域だと思います。

データ分析のライブラリの抽象度がとても高くなっており、簡単に使えるようになっていることがわかりました。すごいですね。

広告
お問い合わせは sweng.tips@gmail.com まで。
inserted by FC2 system