時系列分析ができるライブラリを比較してみた

Adways Advent Calendar 2020 10 日目の記事です。


 

はじめに

お初にお目にかかります。
やのと申します。

業務では主に機械学習の案件化に向けたデータ分析、モデルの開発、案件化したときのプログラムを書いたりもしています。
その一環で、LSTMなどのRNN系の手法を使って時系列データの分析をしてみたのですが、 未来って断定できるものなんだっけか? という疑問が生まれました。

使い古された例ではありますが、天気予報を例にあげると、明日の天気は「雨」て言われても、傘をもっていくかべきか悩んでしまいますよね。
降水確率が50%だと傘はもって出かけるか悩むけど、90%ってことなら傘は持って出かけるかって感じで降水確率によって行動も変わってくるかと思います。

こういった問題は機械学習だけでなく、統計モデルを使うもしくはエッセンスをプラスすると、解決できたりします。
調べ出したら、結構いろいろな選択肢があったので、Pythonで使えるツール、ライブラリの概要、リンク集、強みや弱みを整理したことをヒトサマにお見せできるようにしたのが今日の記事になります。

Prophet

特徴

Facebook社が開発している時系列予測に特化したOSSで、Python以外にR言語もサポートしています。
内部では後述するStanを使っているようです。
https://github.com/facebook/prophet/blob/master/python/stan/unix/prophet.stan

強み

統計、数学、モデリングといった知識なく使うことができます。
公式サイトでも、データサイエンティストやアナリストの作業を完全自動化できるのが売りと公式ページの冒頭に明記されています。
https://facebook.github.io/prophet/

欠損値があっても特別な前処理とかしなくてもいい感じに処理してくれます。

定常性のないトレンドや季節性のあるデータの予測が強いとされています。
GitHub上のissueでのやりとりです

年、月、週のトレンドを plot_components を呼び出すだけで可視化してくれます。
https://facebook.github.io/prophet/docs/seasonality,holiday_effects,and_regressors.html

使ってみましたが処理が速いです。

弱み

定常性のあるデータでは役立たずになるらしいです。

取り扱う時系列データの構造や、パラメータを調整することで改善できるのかもしれませんが、後述するPyStanやTensorflowProbabilityに比べて精度はやや低い印象です。

関連リンク

statsmodels

概要

Python向けの統計モデリングのOSSです。
時系列データだけでなく、線形回帰などのさまざまな統計モデルをサポートしてます。

時系列分析の王道であるARMAモデル, ARIMAモデル, SARIMAモデル, VARモデルを使うとなったら、statsmodelsの事例が多いので、ここではSARIMAモデル, ARIMAモデル, VARモデルを使う時の強み, 弱みを中心にまとめたいと思います。

強み

利用方法、適用事例が書籍、ネット上の記事でも充実しています。

Box-Jenkins法というモデルの決定方法が決まっているため、属人性が低く、自動化も可能です。補足1

弱み

欠損値があるとエラーになってしまうので特別な前処理をする必要があります。

手法は確立されているものの、見せかけの回帰を防ぐために、単位根検定、共和分のチェックをしてから使わないと間違った結論になる恐れがあります。

単体の処理は速いのですが、SARIMAでグリッドサーチを使って最も最適なパラメータを探索しようとすると、探索回数が掛け算で増えるため、待ち時間が長くなってしまいます。

単位根検定を実施しても非定常な場合、適用が難しくなります。

関連リンク

PyStan

概要

Stan自体はC++で実装されおり、PyStanはPython向けのインターフェイスという立ち位置になっています。
Python以外に、R言語、シェルスクリプト、Juliaなどもサポートされていますが、書籍やインターネット上の記事の大半は、R言語で書かれたものです。

Stanでは様々な統計モデリングができるのが売りですが、時系列分析の切り口だと、状態空間モデルの実装でよく利用されるため、ここでは、Stanで状態空間モデルを使う時の強み, 弱みを中心にまとめたいと思います。

強み

統計モデルをかなり自由に構築できます。

Prophetと同じく、欠損値があってもエラーにならずいい感じに処理してくれます

日本語でも良書とされる書籍が存在します。私も何度も読み返しています。

利用事例が多いのか、上記書籍を含めて、モデルの改善、チューニング方法なども探すといろいろと見つかります。

弱み

Stan独自の言語(C/C++に似ている)で記述しないといけないためしきいが高いです。
Stanの呼び出しや結果の後処理(可視化、保存など)はPython/R言語などで書けるのですが、確率的プログラミング本体はStan独自の言語で書く必要があります。

ベイズ統計学、確率的プログラミングへの知見がないと使えないため、しきいは高く、データサイエンティスト、アナリストのスキルや知識に依存する要素がかなりあります。
私の例であげると、データの前処理(標準化、対数変換、BoxCox変換)や再パラメータ化などを通じて、なんとか収束するところを模索するといったモデルを作っているといった状況ですが、T分布、ポアソン分布などの正規分布以外の分布を駆使して、モデルを書きたいと試行錯誤しているのですが、残念な結果にしかたどりつかない状況です。

Box-Jenkins法のような手法が確立されていないため、属人性が高く、自動化も難しいとされています。補足1

処理が遅いです。
式が複雑になり、計算量が増えると待ち時間が特に長く感じます。
推論の手法をMCMCではなく、変分推論に変えるという方法もありますが、自身のスキルが不足しているせいか、残念な結果になることが多いです。

R言語での使用事例や書籍が多いため、Stanの呼び出し部分や結果を処理するコードはR言語やドキュメントを咀嚼しながらPythonで書き直す必要があるため、Pythonだと手間がかかります。

関連リンク

TensorFlow Probability

概要

Google社が開発している確率的プログラミング言語で、TensorFlow上で動きます。
Stanと同じく、時系列分析の切り口だと、状態空間モデルの実装によく利用されるため、ここでも状態空間モデルを使う場合を中心に強み、弱みを説明します。

強み

変分推論を使うと、処理が速いです。
Stanでは性能に問題があったのですが、TensorFlow Probabilityでは問題はあまり感じません。

欠損値に対して特別な前処理とかしなくてもいい感じに処理してくれます。

TensorFlow上で動くため、TensorFlowの強み(GPU上で動く、分散学習に対応していることなど)を活かすことができます。

Stanに比べて敷居が低いです。
Stanのときのような独自言語の習得や、確率分布を意識したコードを書く必要がありません。 分布を意識したコードを書くこともできます。

弱み

Stanより自由度が下がります。
edward2などの低レイヤーのAPI使えば、様々な分布モデルを使うことができるようですが、まだそこまで追いかけられていません。

Stanより情報量(特に日本語)が少ないので、チューニングの仕方やモデル選択の仕方などがあっているのかちょっと自信がなくなるときがあります。

Stan同様、Box-Jenkins法のような手法が確立されていないため、属人性が高く、自動化も難しいとされています。

関連リンク

モンテカルロドロップアウト

概要

通常のTensorFlowやPytorchといった深層学習(時系列分析の場合、RNN系のレイヤーを使って)でモデルを組むのですが、通常は訓練時のみ有効にするDropout層を予測の段階でも有効にするというアプローチです。

強み

深層学習で作った機械学習のモデルに比較的容易に組み込むことができます。

弱み

チューニングの手法が正直よくわかっていないです。
Dropout率をあげると、予測区間が拡がるので、Dropout率と実データと突き合わせながらDropout率を調整していたのですが、そんな方法でよいのか?と思いながら試行錯誤しているといった状況です。  

ドキュメントや書籍での紹介事例は少ないです。

関連リンク

ほかにも

PyMCやUberが開発しているPyroなどもあります。
どちらも、Stan、statsmodelに比べると日本語での情報量が少なかったため、深追いできていません。

ツール、ライブラリといったカテゴリではないのですが、AutoML系のサービスを使ってみるのもありだと考えています。

PyMC3

PyMC3自体は開発が終了したTheanoに依存しているため、紆余曲折を経て、Jaxに移行を進めているようです。

Pyro

Uber社の開発している確率的プログラミング言語です。
Pytorch上で動くのですが、私自身がPytorchに不慣れなため、あまり追いかけきれていません。

関連でNumPyroというものもあるようです。同じUber社が開発しているようなのですが、関係性などは謎だらけであまり追いかけ切れていません。

AutoML系

リンクのみにさせていただきます。

まとめ

ツール、ライブラリを比較するにあたっては、コードもがっつり書いたんですが、仕事で使うこと前提で書いてしまいました。
これを掲載すると怒られてしまうので、今日は概要と強み/弱みや役立つリンクをまとめるというところまでにさせていただきたきました。

誰かに教えを請うもしくは勉強会などで深めていった知見ではないので、間違っている部分などあるかもしれませんが、ご容赦いただければ助かります。

補足

本文では説明しきれなった用語は以下にまとめています。
まとめきれなかった用語は私の解釈をいれて説明しております。


 

次は弓場さんの記事です。