Deep Karmaning

技術系の話から日常のことまで色々と書きます

Kerasを使ったRNNによる時系列データ予測の試み-その2

概要

前回Kerasでトレンドのある時系列データの予測を試みましたが、あまりうまくいきませんでした。

特に以下の2つの課題があったと思います。

  • 時刻を経るごとに大きくなる動きを捉えられておらず、他の簡単な手法に精度が劣っていた

  • 予測の予測による結果が芳しくない

そこで再度データの前処理を工夫し、これらの課題を解決して望ましい精度がでました。今回はその試みを備忘録として書いておきます。

課題の解決のためにやったこと

課題の解決のために行ったことは以下です。

データの前処理の工夫

時系列データの予測では一般的な時系列分析の手法では、データが定常であることが求められると思います。 前回分析では1階差を取ることで取り除こうとしましたが、実際には時刻を経る毎に大きくなる傾向と、季節性のトレンドを上手く抑えることが出来ていませんでした(以下図)。 f:id:rf00:20180217131543p:plain

そこで今回は以下の二つの前処理をしました。

  • logをとる

logをとることで時刻を経る毎に大きくなる動きを抑えました

  • 12階差をとる

12階差をとることでトレンドと季節性を取り除きました

これらの処理を行った結果以下のようなデータになりました。 f:id:rf00:20180217131931p:plain

何とも言えない形ですがADF検定を行うと(今回は緩めに10%水準で判定します)、p値は0.072395875099912771と単位根過程であるという帰無仮説が棄却される結果となりました。

結果

前処理を工夫することで、予測の結果で予測させることでも十分に良い精度が出ました。

予測結果は以下図の青い線です。

f:id:rf00:20180217133426p:plain

元データにない範囲も予測させていますが、これまでの推移をいい感じになぞってトレンドも捉えられているような予測になっています。

MAEで39.634146341463413でした。

ちなみにR上でprophetで雑に予測させた結果は以下です。

f:id:rf00:20180217133702p:plain

MAEをみると48.07456なのでRNNのほうが精度が上回っています(勿論きちんとパラメータチューニングしたらRNNが負ける可能性はあります)。

今回使ったPythonとRのソースコードは以下になります。

github.com

まとめ

RNNといえども、通常の時系列データと同様に前処理を工夫して定常過程に変換する必要が有ることがわかりました。

これはネットワーク構造を工夫することで、この問題もうまく解決できたりするんでしょうか。

私はDeep Learningの理論的側面にあまりにも疎いためなんとも言えないですが、もし構造側で解決できるのであれば、特徴量のことを全く考えなくていいのでいいなあと思いました(このあたりも今後調べたいです)。

それでは今後は多変量の時系列データを使った予測にもチャレンジしていきたいと思います。

ツッコミどころ等ありましたらコメントお願い致します。