Prophetでインスタント機械学習


はじめに

この記事はMicroAd Advent Calendar 2017の23日目の記事です。

現在マイクロアドで内定者としてアルバイトをしています。
つい最近Prophetを知ったので、そのことについて少しだけ書かせて頂きます。

Prophetとは

すーぱー簡単に書くことができる時系列データ専用のフェイスブックが作った機械学習ライブラリです。
現時点ではpythonとRに対応しているみたいです。
今回はバージョンfbprophet==0.2.1をpythonで試していきます。

今回試してみるデータ

最近乱高下の激しいBTCをお題にして、今後1年間どのような値動きをするかを適当に予測します。
今回は以下のサイトでデータを入手しました。csvで保存できるため、pandas等での使い勝手が良いです。

"日付け","終値","始値","高値","安値","前日比%"
"2017年12月23日","1,709,670","1,593,787","1,839,993","1,278,313","7.27"
"2017年12月22日","1,593,787","1,830,241","1,993,563","1,260,284","-12.92"
"2017年12月21日","1,830,241","1,875,889","2,105,416","1,768,900","-2.43"
...
"2014-09-19","43,370","45,779","52,882","41,302","-5.26"
"2014-09-18","45,779","48,559","52,882","45,020","-5.73"
"2014-09-17","48,559","49,299","50,653","47,561","-1.50"

過去2~3年分くらいのBTC/JPYのデータを入手できます。

Prophetを利用するときには、dateやdatetimeのカラム名をdsとすることと、分析対象の数値をyにしなければなりません。
なので今回は「yyyy年mm月dd日」を「yyyy-mm-dd」に変換、終値を数値に変換してそれぞれカラム名をdsyにします。

ds,y
2014-09-17,48559
2014-09-18,45779
2014-09-19,43370
...
2017-12-21,1830241
2017-12-22,1593787
2017-12-23,1709670

プログラム

必要なライブラリはpandasとfbprophetだけです。

pip3 install pandas
pip3 install fbprophet

そしてコードはこれだけです!

import pandas as pd
from fbprophet import Prophet

data = pd.read_csv("BTC_JPY.csv")
model = Prophet()
model.fit(data)
future = model.make_future_dataframe(periods=365)
forecast = model.predict(future)
model.plot(forecast)
model.plot_components(forecast)

細かくて煩わしいことは全部Prophetがやってくれますが、
ある程度のパラメーターを設定することもできます。
例: model = Prophet(growth='logistic')
以下は設定できるパラメータとその初期値です。

growth='linear', 
changepoints=None, 
n_changepoints=25, 
yearly_seasonality='auto', 
weekly_seasonality='auto', 
daily_seasonality='auto', 
holidays=None, 
seasonality_prior_scale=10.0,
holidays_prior_scale=10.0, 
changepoint_prior_scale=0.05, 
mcmc_samples=0, 
interval_width=0.80, 
uncertainty_samples=1000

実行結果


-考察-

これからも上がりそう(適当)

まとめ

統計や数学やプログラミングが全くできない私でも、なんとなくそれっぽい結果を出力したふりをすることができました。
使ってみて思った利点は以下の3点です。

・ 細かい設定なしにとりあえず実行できる
・ 学習が速い
・ 結果のグラフの出力も簡単

比較的簡単といわれるscikit-learnやKerasでも、今回と同じことをしようとするとそれなりに知識が必要になります。
もちろん、それらのライブラリでは時系列データに限らず学習でき、モデルの設計やチューニングができる柔軟性があります。
Prophetはとりあえず一旦サクッと予測してみるというような使い方が出来るのが非常に魅力的です。

P.S.

VisualStudioCodeに拡張機能"Jupyter"を入れたらPythonの開発環境としてとても素晴らしいものになりました。