tutorial は終了していますが、tutorialで紹介されていた他の人のコードを見て、勉強していきましょう。
の確認をしていきます。
tutorialでは、基本的に統計的なもの、time seriesについてはNNをあまり使わないような学習でしたが、ここではバンバンと使っていますので参考になります。
基本となる概念についてはしっかりと解説されていますので、ここでは補足とcodeの説明をします。
EDA:いろいろデータをいじったり視覚化しながらどのようにするかを考えること。
下の関数は、時系列データを教示ありのデータに変換しています。つまり、過去のデータ(入力特徴量)と未来のデータ(目標変数)のペアを作成しています。めちゃくちゃ便利ですね。
def series_to_supervised(data, window=1, lag=1, dropnan=True):
# いろいろしている。
引数は
data: なんらかの時系列データをPandas DataFrame形式で渡す。
window: 過去のいくつの時点のデータを使って未来を予測するかを指定。例えば、window=3 なら、過去3時点分のデータを使う。
lag: 未来のいつの時点を予測するかを指定。例えば、lag=2 なら、2時点先を予測。
返り値はそれらを適切な形の表に直したDataFrameが返っています。
その後、それらをtestとtraningに分け・・と続いています。
何年か前のコードなので、最近見たニュースである、
が頭をよぎりますね。これは改善点?でしょうか?
このあと、多層パーセプトロンを使う際の注意点を述べています。時系列データにはそれ用のNNがありますがここではシンプルなNNを使用しているので、問題があるわけですね。つまり、MLP はシンプルなモデルであるため、時系列予測に適用できるものの、データの順序情報を無視してしまうという欠点があります。そのため、多くの場合、RNN(特に LSTM や GRU)のような、シーケンス情報を考慮できるモデルの方が良い予測性能を発揮します。
このような点で問題があることを説明した上で、NNをMLP、CNN,LSTMと変えた場合の精度の違いを見せてくれています。
最後にCNNーLSTMを見せてくれています。これはCNNとLSTMの良いとこどりをしたようなモデルだということですね。
農林水産省に資料がありました。日本語の資料が読みたければ
をみるのが良いのでしょう。
まとめてみると、
CNN で局所的な特徴を捉え、LSTM でそれらを統合することで、長い時系列データでも効率的に学習できる。
CNN で時間的な局所パターンを抽出し、LSTM でより広範囲な時間的依存関係を学習するという、階層的な特徴抽出が可能
という点でメリットがあるそうです。デメリットは急激に学習時間が増えることですね。
最後のところで、読者が自身でハイパーパラメータ(特にウィンドウサイズやネットワーク構造)を調整し、より良い結果を追求することを推奨しています。
実際、モデルのサイズ変えてみるとどうなるのだろう。と気になった人がおられたらopotunaとかと連携して探索してみる練習になりそうですね。