St_Hakky’s blog

Data Science / Human Resources / Web Applicationについて書きます

【Python】時系列解析:Prophetで時系列解析してみたのでまとめる

こんにちは。

最近、時系列解析が熱いですね!(ただ、仕事で使っているだけという笑)

Rの方がまだ時系列解析のライブラリなどは揃っている感じはあります。Pythonでやろうと思うと、選択肢に上がってくるのは、statsmodelsなどもあると思いますが、今回はFacebookが作成して公開している、「Prophet」というライブラリを使用してみようと思います。

本家のサイト

いくつか参考になる本家のサイトをあげておきます。また、このライブラリ自体はRでも使用することができます。

Githubによると、このライブラリはFacebookの「Core Data Science team」によって作成されたオープンソースライブラリみたいです。どうでもいいけど、Data Science teamのページがかっこよすぎる、、、。

Install

今回使用した環境が、MacなのでMacでのインストール方法について書きます。このライブラリは、pystanに依存しているみたいですね。

■pip

pipでインストールすることができます。これが一番簡単かなと思いますね。

$ pip install fbprophet
■conda

私はAnacondaを使っているので、こちらの方法を試しました。

$ conda install gcc
$ conda install -c conda-forge fbprophet

gccをセットアップするにあたって、それも事前にインストールする必要があるみたいです。

Prophetを使ってみた

本家のサイトにもあるQuick Startをやってみます。

他のドキュメントについては、以下を見るのが早そうです。

論文を読んだメモ

以下の論文を読みました。

論文を読んだ時のメモだけでブログを書こうかと思ったが、先人があまりにも素晴らしすぎる記事を書いているので、改めて私が書く必要はないなと思ったので、ここでは簡単に実際にモデルを改良する際などに参考になりそうなメモを残します。

概要説明系の資料は、以下の参考のところにいくつかリンクを貼ったのですが、中身の具体的な理論については、以下のブログが参考になりました。

時系列データにおける異常値の取り扱いについて
  • 異常値は取り除く必要なく、普通に処理してくれるが、取り除いたほうが精度が改善する可能性があることがわかった
時系列データの周期性について
  • Prophetでは、いくつかの周期性の関数を入れることができるようになっていました。
  • 基本的には、フーリエ関数をいくつも重ね合わせた感じのものになっているので、周期性が複数見られるやつに関しては、その分関数を追加してやればよく、例えば、以下のような周期性のものを追加してやればいい。

- 週単位
- 月単位
- 年単位

休日・イベント効果について
  • Prophetが少しわかりにくいのだが、holidayとなっているところに、天気や祝日、イベントなどの効果を全部丸ごと入れることができる。ソースコードをいじって、改めてパラメーターなどを式に追加することも検討したが、結局は同じ構造になるので、普通にここに追加すればいい。

- add_regressor ってやつで、特殊な関数を入れ込むことができるので、モデルを作る際には、検討してみるのはアリかも。binaryである必要性はないようなので、気温などの効果もみることができるっぽい。

  • 一応、イベントの種類ごとに、事前分布とかのスケールもつけることができるので、休日なども、「普通の休日」と「3連休以上の大型連休の場合」みたいな、それごとに効果の影響を変えたい場合は、そうすることもできる。めんどくさいけど。
  • デフォルトでついている、build-inな国別の休日の処理やんちゃな設定でビビる。日本はないけど。
  • 連休効果などは、lower_windowとかupper_windowとかで処理が出来そうな予感。
予測の不確かさの幅
  • 最終的には、正規分布を仮定してのモデルになっているので、予測結果の不確かさもその分布でのものになる。
  • 異常検知を手っ取り早くやるなら、この値を使えば良いのかな。
異常検知について
  • Prophet上で、ChangePointの検出も行なっているが、あくまで多めに変化点をバラマキ、それに対してラプラス分布でL1のペナルティのようなものをおいた事前分布を表現し、検知しているだけである。よって、変化点を別モデルを使って検知しに行って、それをモデルに組み込むのはある程度理にかなっている可能性はある。

- デフォルトでは学習データの最初の80%しか使わずに、ChangePointを検知しないので、そこに注意する。サンプル数が少ない場合にはもっと少なくしてもいいかもしれない。
- これはすなわちトレンドの変化点という文脈で吸収しているだけなので、外れ値処理とは少し文脈が違う。検知を事前に行なって予測を行うのはアリかも。

  • 異常データの検知については、ラプラス分布(平均0, 分散τ)の分布をもつdeltaがthresholdを以上であった場合に検知するようになっている。これについては、正規分布の外れ値の検知方法となんら変わりない感じである。

- changepoint_prior_scaleを変えれば、事実上τを変更することになる

評価関数について
  • Prophetで提唱されている方法が良さそうだった。順序関係を操作できないので、厳密にはCrossValidationとは違うけど、そういうやり方をしてやっていました。他には、評価関数に関しては、以下の資料が参考になると論文にあった。

- [25 years of time series forecasting’, International Journal of Forecasting](https://robjhyndman.com/papers/ijf25.pdf)

終わりに

メモをそのまま晒しているだけなので、あんまり文脈とかわからない感じになってしまった(反省)。

それでは。

参考

概要説明系

取っ掛かりとして、以下の資料は参考になりました。

これよりももう少し深いところが知りたい場合には、以下のブログが参考になりました。

最後の細かいところをやっぱり知るには、ぶっちゃけ論文読んでソースコード読むしかないですが、論文もソースコードもすごく難しい訳ではないので、読んだ方がいいと思います。

Kaggle

Kaggleのカーネル上で実際にやってみた例を書いてあるもの。

時系列予測ライブラリ関係
外れ値検知・変化点検知