Facebookが公開している時系列解析用のライブラリProphetの公式ドキュメントを翻訳していきます。
目次
1.Prophet公式ドキュメント翻訳(概要&特徴編)
2.Prophet公式ドキュメント翻訳(インストール編)
3.Prophet公式ドキュメント翻訳(クイックスタート編)
4.Prophet公式ドキュメント翻訳(飽和状態の予測編)
5.Prophet公式ドキュメント翻訳(トレンドの変化点編)
6.Prophet公式ドキュメント翻訳(周期性・イベント効果・説明変数の追加編)
7.Prophet公式ドキュメント翻訳(増加し続ける周期性編)
8.Prophet公式ドキュメント翻訳(誤差の間隔編)
9.Prophet公式ドキュメント翻訳(外れ値編)
10.Prophet公式ドキュメント翻訳(1日単位ではないデータ編)
11.Prophet公式ドキュメント翻訳(モデルの診断編)]
12.Prophet公式ドキュメント翻訳(ヘルプ編)
2018/10/19公開。原文リンクは以下。
・Prophet概要&特徴:https://facebook.github.io/prophet/
・公式ドキュメント:https://facebook.github.io/prophet/docs/quick_start.html
今回の記事はProphetのクイックスタート編です。
#Python API
Prophetはscikit-learnのモデル構築APIに準じています。私たちはProphetクラスのインスタンスを作成し、データをモデルにあてはめ、predictメソッドで予測します。
Prophetモデルの学習データは常に2列のカラム(dsとy)を持つデータフレームです。ds(datestamp)カラムは、理想的にはdateならYYYY-MM-DD、timestampならYYYY-MM-DD HH:MM:SSというPandasのフォーマットであると良いです。yカラムは数値型でなければならず、私たちがProphetで予測したい値を表します。
例としてPeyton Manning氏のウィキペディアのページビュー(日単位)という時系列のログデータを見てみましょう。私たちはこのデータをWikipediatrendというRのパッケージを使ってスクレイピングしました。Peyton Manning氏のウィキペディアのデータは良い例になりました。というのも、そのデータは複数の周期性や伸び率の変化に対するモデルの学習能力、そして特殊な日(Manning氏の決勝戦の日やスーパーボウル出場日)に対するモデルの対応能力といったProphetモデルの特徴を浮き彫りにしてくれたからです。用いたデータのCSVファイルはこちらにあります。
まず、データをインポートします。
# Python
import pandas as pd
from fbprophet import Prophet
# Python
df = pd.read_csv('../examples/example_wp_log_peyton_manning.csv')
df.head()
DS | Y | |
---|---|---|
0 | 2007-12-10 | 9.590761 |
1 | 2007-12-11 | 8.519590 |
2 | 2007-12-12 | 8.183677 |
3 | 2007-12-13 | 8.072467 |
4 | 2007-12-14 | 7.893572 |
新しいProphetオブジェクトをインスタンス化することによってモデルを作成します。予測モデル作成における、パラメータ調整などの各設定はコンストラクタとして扱われます。次にfitメソッドを呼び出し、さきほどのデータを渡します。データをモデルにあてはめるプロセスは約1~5秒かかります。
#Python
m = Prophet()
m.fit(df)
未来の予測には、日付を含むdsカラムが入ったデータフレームを使います。Prophet.make_future_dataframeメソッドを使うことで、予測した期間を追加したデータフレームを得られます。予測する日数は自分で指定できます。デフォルトの設定では、予測モデルは日付を変数として含んでいます。したがって今回はデフォルト設定のままでモデルを作成します。
# Python
future = m.make_future_dataframe(periods=365)
future.tail()
DS | |
---|---|
3265 | 2017-1-15 |
3266 | 2017-1-16 |
3267 | 2017-1-17 |
3268 | 2017-1-18 |
3269 | 2017-1-19 |
predictメソッドは先ほど作成したfutureの各行をyhatという予測値にあてはめます。yhatは学習させた時系列データより先の日については、学習データを用いて予測値を算出します。forecastオブジェクトは予測値を示すyhatの列を含むデータフレームです。 |
# Python
forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
DS | YHAT | YHAT_LOWER | YHAT_UPPER | |
---|---|---|---|---|
3265 | 2017-1-15 | 8.199274 | 7.489884 | 8.969065 |
3266 | 2017-1-16 | 8.524244 | 7.790682 | 9.266504 |
3267 | 2017-1-17 | 8.311615 | 7.553025 | 9.049803 |
3268 | 2017-1-18 | 8.144232 | 7.428174 | 8.864747 |
3269 | 2017-1-19 | 8.156091 | 7.395160 | 8.883232 |
Prophet.plotメソッドを用いて、forcastデータフレームを渡すことで予測をプロットできます。 |
# Python
fig1 = m.plot(forecast)
予測の構成要素を見たい場合は、Prophet.plot_componentsメソッドを使えます。デフォルト設定ではトレンドに加え、時系列データの年・週単位の周期性が表示されます。イベント日の効果を考慮したい場合は、holidays=を含めてください。イベント効果を含めた結果が同様に表示されます。
# Python
fig2 = m.plot_components(forecast)
各メソッドで利用できる詳細なオプションについては、help(Prophet)やhelp(Prophet.fit)などのdocstringを利用してください。CRANが提供するRのリファレンスマニュアルでは、利用できる機能すべての簡潔な説明が記載されています。その説明はPythonバージョンのProphetにも当てはまります。
#R API
Rでは、通常の予測APIを用います。そのAPIでは予測値の生成やモデルオブジェクトの作成などの機能が提供されています。predictとplotメソッドをそのモデルオブジェクトに対して呼び出すことができます。
# R
library(prophet)
まずデータを読み込み、ds変数に格納します。Python APIと同様にこれはdsとyのカラムを持つデータフレームです。dsは日付データ、yは数値データを持ちます。dsカラムはdate形式(YYYY-MM-DD)またはtimestamp形式(YYYY-MM-DD HH:MM:SS)でなければいけません。Python APIで述べたように、ここではPetyon ManningのWikipediaのページビューログを用います。データのcsvファイルはこちら
# R
df <- read.csv('../examples/example_wp_log_peyton_manning.csv')
Prophetモデル作成のためにprophet関数を呼び出します。第一引数は時系列のデータフレームです。追加する引数はProphetモデルがデータを扱う方法をコントロールするために使います。詳細は後述します。
# R
m <- prophet(df)
予測は日付データを含むdsカラムをもつデータフレームによって生成されます。make_future_dataframe関数はモデルオブジェクトと予測する日数を入れることで適切なデータフレームを生成します。デフォルト設定では、学習データより先の日については学習データを用いて予測します。
# R
future <- make_future_dataframe(m, periods = 365)
tail(future)
ds
3265 2017-01-14
3266 2017-01-15
3267 2017-01-16
3268 2017-01-17
3269 2017-01-18
3270 2017-01-19
Rのモデリングプロセスの大半では予測値を表示するためにpredict関数使います。forecastオブジェクトは予測値が入ったyhatカラムを含むデータフレームです。その他の列は予測値の誤差の範囲や日付です。
# R
forecast <- predict(m, future)
tail(forecast[c('ds', 'yhat', 'yhat_lower', 'yhat_upper')])
ds yhat yhat_lower yhat_upper
3265 2017-01-14 7.824163 7.127881 8.609668
3266 2017-01-15 8.205942 7.452071 8.904387
3267 2017-01-16 8.530942 7.742400 9.300974
3268 2017-01-17 8.318327 7.606534 9.071184
3269 2017-01-18 8.150948 7.440224 8.902922
3270 2017-01-19 8.162839 7.385953 8.890669
plot関数を使ってモデルとforecastオブジェクトを渡すことで予測結果をプロットできます。
# R
plot(m, forecast)
prophet_plot_components関数を使って、予測をトレンドや年・週単位の周期性に落とし込むことができます。
# R
prophet_plot_components(m, forecast)
インタラクティブな予測のプロットをする場合は、dyplot.prophet(m, forecast)コマンドを使ってDygraphを表示させます。
各メソッドで利用できる詳細なオプションについては、?prophetや ?fit.prophetなどのdocstringを利用してください。docstringにある説明はCRANが提供するRのリファレンスマニュアルにも記載されています。