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に比べて精度はやや低い印象です。
関連リンク
- 公式ページ
- GitHub
- 有志の方の日本語訳
- リクルートテクノロジーズ様での利用事例
statsmodels
概要
Python向けの統計モデリングのOSSです。
時系列データだけでなく、線形回帰などのさまざまな統計モデルをサポートしてます。
時系列分析の王道であるARMAモデル, ARIMAモデル, SARIMAモデル, VARモデルを使うとなったら、statsmodelsの事例が多いので、ここではSARIMAモデル, ARIMAモデル, VARモデルを使う時の強み, 弱みを中心にまとめたいと思います。
強み
利用方法、適用事例が書籍、ネット上の記事でも充実しています。
Box-Jenkins法というモデルの決定方法が決まっているため、属人性が低く、自動化も可能です。補足1
弱み
欠損値があるとエラーになってしまうので特別な前処理をする必要があります。
手法は確立されているものの、見せかけの回帰を防ぐために、単位根検定、共和分のチェックをしてから使わないと間違った結論になる恐れがあります。
単体の処理は速いのですが、SARIMAでグリッドサーチを使って最も最適なパラメータを探索しようとすると、探索回数が掛け算で増えるため、待ち時間が長くなってしまいます。
単位根検定を実施しても非定常な場合、適用が難しくなります。
関連リンク
- 公式ページ
- GitHub
- AICを使ったパラメータ探索方法は参考になります。
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だと手間がかかります。
関連リンク
- 本家
- GitHub
- PyStan
- 有志の方の日本語の翻訳サイト
TensorFlow Probability
概要
Google社が開発している確率的プログラミング言語で、TensorFlow上で動きます。
Stanと同じく、時系列分析の切り口だと、状態空間モデルの実装によく利用されるため、ここでも状態空間モデルを使う場合を中心に強み、弱みを説明します。
強み
変分推論を使うと、処理が速いです。
Stanでは性能に問題があったのですが、TensorFlow Probabilityでは問題はあまり感じません。
欠損値に対して特別な前処理とかしなくてもいい感じに処理してくれます。
TensorFlow上で動くため、TensorFlowの強み(GPU上で動く、分散学習に対応していることなど)を活かすことができます。
Stanに比べて敷居が低いです。
Stanのときのような独自言語の習得や、確率分布を意識したコードを書く必要がありません。
分布を意識したコードを書くこともできます。
弱み
Stanより自由度が下がります。
edward2などの低レイヤーのAPI使えば、様々な分布モデルを使うことができるようですが、まだそこまで追いかけられていません。
Stanより情報量(特に日本語)が少ないので、チューニングの仕方やモデル選択の仕方などがあっているのかちょっと自信がなくなるときがあります。
Stan同様、Box-Jenkins法のような手法が確立されていないため、属人性が高く、自動化も難しいとされています。
関連リンク
- 公式ページ
- GitHub
- 時系列データのケーススタディ(使い方の参考になります)
- builderscon tokyo 2019の動画ですが、Tensorflow Probabilityの立ち位置や、使い方などを初心者向けにわかりやすく説明してくれています。
モンテカルロドロップアウト
概要
通常のTensorFlowやPytorchといった深層学習(時系列分析の場合、RNN系のレイヤーを使って)でモデルを組むのですが、通常は訓練時のみ有効にするDropout層を予測の段階でも有効にするというアプローチです。
強み
深層学習で作った機械学習のモデルに比較的容易に組み込むことができます。
弱み
チューニングの手法が正直よくわかっていないです。
Dropout率をあげると、予測区間が拡がるので、Dropout率と実データと突き合わせながらDropout率を調整していたのですが、そんな方法でよいのか?と思いながら試行錯誤しているといった状況です。
ドキュメントや書籍での紹介事例は少ないです。
関連リンク
- 論文
- 私自身が業務でkerasを使っていることもあり、理解しやすかったです
- 手法が紹介されている書籍ですが、数式の展開が中心なので、文系の私にとって眠り薬です。
- ベイズ深層学習のp158から説明があります。
ほかにも
PyMCやUberが開発しているPyroなどもあります。
どちらも、Stan、statsmodelに比べると日本語での情報量が少なかったため、深追いできていません。
ツール、ライブラリといったカテゴリではないのですが、AutoML系のサービスを使ってみるのもありだと考えています。
PyMC3
PyMC3自体は開発が終了したTheanoに依存しているため、紆余曲折を経て、Jaxに移行を進めているようです。
- 関連リンク
- 公式
- 紆余曲折については以下の記事が詳しいです。
Pyro
Uber社の開発している確率的プログラミング言語です。
Pytorch上で動くのですが、私自身がPytorchに不慣れなため、あまり追いかけきれていません。
関連でNumPyroというものもあるようです。同じUber社が開発しているようなのですが、関係性などは謎だらけであまり追いかけ切れていません。
AutoML系
リンクのみにさせていただきます。
- Amazon Forecast
- Azure Machine Learning
まとめ
ツール、ライブラリを比較するにあたっては、コードもがっつり書いたんですが、仕事で使うこと前提で書いてしまいました。
これを掲載すると怒られてしまうので、今日は概要と強み/弱みや役立つリンクをまとめるというところまでにさせていただきたきました。
誰かに教えを請うもしくは勉強会などで深めていった知見ではないので、間違っている部分などあるかもしれませんが、ご容赦いただければ助かります。
補足
本文では説明しきれなった用語は以下にまとめています。
まとめきれなかった用語は私の解釈をいれて説明しております。
- 統計モデリング
取り扱いたい、分析したい現実の事象を統計
という武器を駆使して作られたモデル=模型。これをつくることを統計モデリングと解釈しています。
識者の方によってちょっとずつ定義が少しずつ異なるので、参考になる定義へのリンクを貼らせていただきます。 - 欠損値
データの欠測、欠落のことです。
機器の故障が原因でデータが一部取れないケースや、アンケートを実施したものの回収できないもしくは一部未回答の項目があるような場合が例として考えられます。 - 定常性
時間や位置によって確率分布が変化しない状態と解釈しています。
定常性がある場合、一時的な異常値が出ても、最終的には戻ってくる場所が決まっているので、予測がしやすいという特徴があります。
以下の記事が理解に役立ちます。 - グリッドサーチ
全てのパラメータの組み合わせを総当たり方式で試して、最も性能のよかったものを採用する方法です。
総当たりなので、試したいパラメータの数、組み合わせが多いと時間がかかります。 - ARMA, ARIMA, SARIMA, VAR
ARMAモデル
をトレンド成分のあるデータに対応させたものがARIMAモデル
です。
ARIMAモデル
を周期成分のあるデータに対応させたものがSARIMAモデル
です。
複数の時系列データ同士の相互作用、関係性に注目したものがVARモデル
です。
詳細は以下を参考にしていただければと思います。 - BoxCox変換
データの構造を正規分布に近づけてデータ分析、モデルの作成を可能にする方法の一つです。
機械学習的な書き方だと、特徴量エンジニアリングの一種です。
以下の記事が役立ちます。 - 状態空間モデル
過去のデータや外生変数から状態変数
を決定し、そこに正規分布などを使って観測誤差を発生させた観測変数
からなる統計モデルと解釈しています。
以下の記事が役立ちます。 - 確率的プログラミング言語
アウトプット(変数)が確率変数から成り立つ不確実性を扱うことのできるプログラミング言語。
この記事の始まりである、未来って断定できるものなんだっけか?を実現するために必要なものと理解しています。 - 補足
時系列分析と状態空間モデルの基礎: RとStanで学ぶ理論と実装のp180を参考にしました。 - 変分ベイズ、変分推論、変分近似
本来は、事後分布のパラメータを直接探すのは困難なため、近似分布を使ってパラメータを探す方法ですが、処理の高速化のために使われるケースもあります。
以下の記事が役立ちます。 - 単位根
元のデータは非定常だが、差分(今期と前期の差など)データは定常性が認められるデータのことです。 - ドロップアウト
以下の記事が役立ちます。
次は弓場さんの記事です。