Python
機械学習
人工知能

facebookのAI prophetを使った時系列データの将来予測

FacebookのProphetとは

Prophetは、FacebookのCore Data Scienceチームが公開したオープンソースソフトウェアです。時系列データを予測するために、RまたはPythonで利用可能なフレームワークです。特に毎年、毎週ごとの周期性や、休日などの影響を加味したモデルである点が特徴となります。
https://facebook.github.io/prophet/

別のサイトの情報によると、Pythonの機械学習フレームワークのScikit learnと使い方が似ているそうです。

Prophetの特徴

  1. 正確で早い
  2. 全自動
  3. チューニング可能な予測
  4. RまたはPythonで使用可能

インストール方法

Windows 10 64bitの場合について、説明します。事前に、Prophetが依存するいくつかのライブラリをインストールする必要があります。

まずは、Anacondaをインストールします。(必須ではありませんが、Pythonと、主要なライブラリがインストールされるので、楽です)
Anacondaをインストールしないバイは、個別に、下記ライブラリをインストールする必要があります。

  • numpy
  • cython
  • matplotlib

Anacondaに含まれていないものとして、以下をインストールします。

  • PyStan
  • C++ Compiler
  • libpython
  • mingw-w64

まずは、Pystanのインストール。Anaconda Promptから実行します。


> pip install pystan

次に、こちらからC++ Compilerをインストール
http://landinghub.visualstudio.com/visual-cpp-build-tools

そして、libpythonとmingw-w64をインストールします。


> conda install libpython
> conda install -c msys2 m2w64-toolchain

これで、Prophetが依存するライブラリのインストールが完了です。
ようやくProphetをインストールします。pipでもインストールできるそうですが、僕の環境ではうまく行かなかったので、下記のcondaコマンドでインストールしました。


> conda install -c conda-forge fbprophet

Prophetの動作確認

ちゃんとインストールされたか、確認するために、Quick Startのプログラムを動かしてみます。

CSVファイルの入手

下記サイトから分析データをダウンロードします。Wikipediaページの日次訪問者数を分析します。
example_wp_peyton_manning.csv を使用します。

https://github.com/facebook/prophet/tree/master/examples

ソースコード

チュートリアルに書いてあるとおりです。グラフは、コンソールで実行しても表示されなかったので、png形式で保存するように書き換えました。

QuickStart.py
import pandas as pd
import numpy as np
from fbprophet import Prophet

df = pd.read_csv('example_wp_peyton_manning.csv')
# print(df.head())
df['y'] = np.log(df['y'])

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()

m.plot(forecast).savefig('1.png');

m.plot_components(forecast).savefig('2.png');

こんな短いコードで動くんですね。

予測結果

うまく動いていますね。黒点が過去の実績、青線が将来の予測データのようです。
1.png

年毎、週毎の周期性と、トレンドに分けて要素ごとの分析結果を分けて表示することができます。これは面白いですね。
2.png

今後にやりたいこと

facebookのProphetはまだまだ細かいチューニングができるそうで、いろいろ試してみたいなと思います。