見出し画像

上がるの? 下がるの? 二値分類 AIを使って日経平均株価の予測に挑戦 初めてのLSTM編


前回の記事より、今後の課題を振り返る

前回は、RNNにおいて最も単純な構造であるElman Netを使って、日経平均株価の予測に対する二値分類を行いました。

Elman Netでは、実用的な性能を得ることは難しいとのことでしたが、実際に試したところ、これまでと変わらない結果となりました。

今回は、今後の課題として挙げたLSTM(Long Short Term Memory)を使って、日経平均株価の予測に対する二値分類を行います。

LSTMを構築する際に参照したのは、前回の記事でも紹介した下記の動画「Deep Learning入門:数式なしで理解するLSTM (Long short-term memory)」です。

AIモデルに使用したRNN LSTMの構造図

先ずは、動画に基づいて構築したLSTMの構造図を下記に示します。

RNN LSTM AIモデル 構造図
RNN LSTMによるAIモデルの構造図

上記のLSTMを構築するにあたり、参照した動画には存在しないものを1つだけ追加しました。

それは、Reshapeです(Inputの下に配置されています)。

このReshapeの役割は、下記の通りです。

  • Reshapeの役割

    • 入力される1行14列のベクトルデータを2行7列に変形する

    • ベクトルデータの中身は下記の通り

      • 2営業日分のローソク足(終値、始値、高値、安値)

      • 2営業日分の移動平均(5, 25, 75日)

LSTMの構造は、Elman NetにInputGate機能、ForgetGate機能、OutputGate機能の3つを加えたものです。

上記の動画を見て、この点が理解できると、その構造が分かってくると思います。

AIモデルの学習および評価を実行

早速、LSTMを使って日経平均株価の予測を行ってみます。

下記は、LSTMに前回の記事で作成したRNN用の学習データを学習させた際の学習曲線です。

RNN LSTM AIモデル 二値分類 学習曲線
RNN LSTMのAIモデルによる二値分類の学習曲線

前回のElman Netを使用した結果と同じく、LSTMを使用しても学習曲線はほぼ平行となってしまいました。

以下に、評価結果の混同行列を示します。

RNN LSTM AIモデル 二値分類 混同行列
RNN LSTMのAIモデルによる二値分類の混同行列

上記の混同行列は、前回のElman Netを使用した場合の結果と同一でした。

残念ながら、LSTMを使用しても、日経平均株価の予測に対する二値分類の性能向上を図ることはできませんでした。

RNN LSTMを微修正してAffineの出力ニューロン数を100に変更

RNNの構造を用いたAIモデルは、フィードバックループが存在するためにパラメーターの調整が(少なくとも私には)難しいという特徴があります。

つまり、どこかのパラメーターを適当に修正すると、辻褄が合わない箇所が発生し、AIモデルの学習および評価を実行するとエラーが出てしまうのです。

このため、現状はようやく動作した状態を維持しつつ、LSTMの学習および評価を行ってきました。

しかし、現状の構造は中間層のAffineの出力ニューロン数が7つとなっており、流石に少ないと感じています。

なぜなら、これまでのAIモデルで使用してきたAffineの出力ニューロン数は100だったからです。

このため、Affineの出力ニューロン数が100となるようにAIモデルの構造を修正しました。

それが下記となります。

RNN LSTM AIモデル 構造図 Affine 出力ニューロン数 100
Affineの出力ニューロン数を100としたRNN LSTMによるAIモデルの構造図

新たにAffineNをReccurentInputの下に追加し、OutShapeパラメーターを100としました。

そして、Affineの出力ニューロン数を100としたAIモデルの学習曲線が下記となります。

RNN LSTM AIモデル 学習曲線 Affine 出力ニューロン数 100
Affineの出力ニューロン数を100としたRNN LSTMのAIモデルによる二値分類の学習曲線

Affineの出力ニューロン数を100とした結果、学習曲線のCOSTとTRAINING ERRORが低下しました。

一方で、VALIDATION ERRORが上昇する結果となってしまいました。

Neural Network Consoleのマニュアルによると、COST, TRAINING ERRORおよびVALIDATION ERRORの説明は次の通りです。

  • Neural Network Consoleのマニュアルより

    • COSTは、最適化段階でのロス関数の出力値を示す

    • ERRORは、Epochの終了時点での学習データ、評価データそれぞれにおけるロス関数の出力値を示す

      • つまり、学習データに対するERRORがTRAINING ERROR

      • つまり、評価データに対するERRORがVALIDATION ERROR

インターネットでVALIDATION ERRORが上昇している状況について調べたところ、過学習の状態に陥っているとのことでした。

過学習とは、AIモデルが学習データで最適化されすぎた結果、条件が異なる他の評価データに対して学習した性能が十分に発揮されない状態です。

AIモデルの学習に3時間もかけたのに、この結果とは、残念です。

とりあえず、AIモデルの評価における混同行列を以下に示します。

RNN LSTM AIモデル 二値分類 混同行列 Affine 出力ニューロン数 100
Affineの出力ニューロン数を100としたRNN LSTMのAIモデルによる二値分類の混同行列

Affineの出力ニューロン数を100としたことで、y'=0の列に数値が並ぶようになりました。

この点に関しては、大きな進歩です。

しかし、Accuracy(分類精度)は53.84%から50.29%に低下してしまいました。

今後の課題

LSTMの使用に加えて、中間層であるAffineの出力ニューロン数を100とした結果、ようやく二値分類のスタートラインに立てたような気がしています。

今後は、過学習への対策を検討していきます。

ちなみに、インターネットで過学習への対策について調べたところ、下記の方法が紹介されていました。

  • 過学習への対策

    • 学習データ(説明変数)の見直し

    • AIモデルの見直し

また、LSTMを使った多クラス分類の検証も進めていきたいと思います。

番外編 LSTMで使われている2つのDelayについて

上記のLSTMの構成を見ていて、ふと気がついたことがあります。

Mul2_2の出力に接続されている2つのDelay(Delay_HDelay_C)ですが、1つで良いのではないかと思いました。

Delayに関するNeural Network Consoleの説明には、下記のようにあります。

  • Delay

    • RecurrentNeuralNetworkにおける時間遅れ信号を示すレイヤーです。

Delayのパラメーターとして、時間遅れ信号のサイズ、初期値、等があるのですが、今回は、2つのDelayで同じパラメーターを使用しています。

2つのDelayを異なるパラメーターで制御する場合は上記の構造となるのでしょうが、同じパラメーターで制御する場合は1つで良いのではないでしょうか。

ちなみに、Delayを1つにまとめると、LSTMの構造は下記のとなります。

Delayを1つにまとめたRNN LSTMによるAIモデルの構造図

Delayを1つにまとめた状態でAIモデルの学習、評価を実行してみましたが、Delayを2つ使った構造の結果との違いは認められませんでした。

AIモデルのデータについて

今回作成したAIモデルのデータは、Googleドライブにて共有しています。

URL: https://drive.google.com/drive/folders/1GjFfESdB8D63JWxULEJzx8gXNoEQfpcm?usp=drive_link

  • N225_LSTM_1.sdcproj

    • Neural Network Console用のプロジェクトファイル

    • 基本となるLSTM構造のAIモデル

  • N225_LSTM_Affine100N.sdcproj

    • Neural Network Console用のプロジェクトファイル

    • 中間層のAffineの出力ニューロン数を100としたLSTM構造のAIモデル


いいなと思ったら応援しよう!