見出し画像

AIを使って日経平均株価の予測に挑戦 世の中そんなに甘くない編


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

前回の記事で今後の課題としたものの中に、より複雑なAIモデルの使用による予測精度の向上に関する検証を挙げました。

そこで、AIモデルに関する勉強のため、SONYのYouTubeチャンネル「Neural Network Console」に投稿されている動画を視聴しました。

その中に、「Deep Learning入門:ニューラルネットワーク設計の基礎」という動画があります(下記の動画です)。

この動画の1分20秒辺りには、4層のAffineによるAIモデルが紹介されています。

このAIモデルを使用して、前回の記事で用意した学習データと評価データによる検証を行ってみることにしたのですが……。

重大な過ちを発見してしまいました

上記の動画で、私の重大な過ちを発見してしまいました。

動画の15分10秒辺りに「最後の活性化関数とロス関数」という資料の説明があります。

私が行っている日経平均株価の予測は、6種類のラベルから何れか一つを予測するもので、多クラス分類と呼ばれるものです。

多クラス分類の場合、最後の活性化関数Softmax, ロス関数CategoricalCrossEntropyを使用するのが正しいことを知りました。

Softmaxは、各ラベルの発生確率の合計が100%となるようにするものです。

例えば、ラベルA, B, Cとあった場合、ラベルAの発生確率が60%, ラベルBの発生確率が30%, ラベルCの発生確率が10%となるものです。

確かに、多クラス分類にはSoftmaxが最適なのは理解しました。

また、多クラス分類では、ロス関数としてCategoricalCrossEntropyを使用するのが一般的とのことです。

Neural Network Consoleのマニュアルには、CategoricalCrossEntropyに対する説明として下記のように記載されています。

  • CategoricalCrossEntropy

    • カテゴリIndexで与えられるデータセットの変数との交差エントロピーを最小化するニューラルネットワークの出力層です。

この説明だと私にはさっぱり理解できませんでした。

そこで、ChatGPTに教えてもらうことにしました。

ChatGPTのプロンプトに次のように入力したところ、下記のような回答を得ました。

  • プロンプト

    • あなたは最高のAI設計エンジニアです。

    • CategoricalCrossEntropyについて中学生でもわかるようにやさしく解説してください。

  • ChatGPTの回答(抜粋)

    • CategoricalCrossEntropyは、機械学習やディープラーニングの分野でよく使われる損失関数(loss function)の一種

    • 損失関数は、モデルが出力する予測と実際のターゲット(目標)の間の差を評価するために使われる

    • 「Categorical(カテゴリカル)」は、データが複数のクラス(カテゴリ)(例えば、「犬」や「猫」など)に属する場合を指す

    • 「CrossEntropy(クロスエントロピー)」は、予測と実際の値の間の差を測る手法を指し、この差が大きいほど損失も大きくなる

どうやら、CategoricalCrossEntropyは、各クラスに対して、発生確率の期待値とAIモデルが算出した値の差に基づいた損失を求め、その差が小さくなるようにAIモデルを調整するもののようです。

ちなみに、これまで私が使用してきた組み合わせ(最後の活性化関数にSigmoid, ロス関数にBinaryCrossEntropy)は、0か1かの二値分類に使用すべきものでした。

4層のAffineによるAIモデルの構成図

今回は、4層のAffineを使用し、かつ、最後の活性化関数をSoftmax, ロス関数をCategoricalCrossEntropyに修正したAIモデルを使用します。

Neural Network Console Affine 4層 AIモデル 構成図
Affinを4層にしたAIモデルの構成

ここで気になったのが、CategoricalCrossEntropyの横に1と表示されている点です。

CategoricalCrossEntropyのパラメーターを確認すると「Output」が1になっていました。

私が作成した学習データと評価データのラベルはy__0からy__5までの6種類ですので、何か違う気がしたのですが……。

学習の実行でエラーが発生

とりあえず学習を実行したところ、下記のエラーが発生しました。

  • 学習実行時のエラー

    • ValueError: could not broadcast input array from shape (64,6) into shape (64,1)

やはりという感じでしたが、どうすれば良いのかが分かりませんでしたので、アレコレ調べました。

最終的には、Neural Network Consoleに予め用意されていた他のプロジェクトで、かつ、CategoricalCrossEntropyを使用しているものを動作させることで対処法を見つけました。

結論は、学習データと評価データのラベルの表現を変えるというものでした。

これまでは、y__0からy__5のラベルに対して、あるラベルを1, それ以外のラベルを0としていました。

しかし、Neural Network Consoleを使用した多クラス分類を行う場合は、ラベルを「y:label」とし、その値を0~5(ラベルが6種類の場合)で表現するのが正しいことが分かりました。

学習データと評価データのラベルを修正

学習データと評価データのラベルを以下の手順に従って修正していきます。

  • 学習データと評価データのラベルを修正する手順

    • Excelファイルでの処理

      1. 前回の記事で作成したExcelファイルを使用する

      2. 6種類のラベルから一つにまとめたラベルを作成する

      3. Min-Max正規化処理を行った数値が記載されているシート上から6種類のラベルを削除する

      4. 新たに作成した一つにまとめたラベルを削除した6種類のラベルの代わりにコピーする

      5. 作成したExcelファイルを保存する

      6. 一つにまとめたラベルを追加したシートをcsv形式で名前を付けて保存する(以下、このcsvファイルを編集する)

    • csvファイルでの処理

      1. 1行目をx__0~x__6, y:labelに修正する

      2. 移動平均値およびラベルが欠損する行を削除する

      3. csvファイルをコピーし、1つを学習データ、もう1つを評価データとする

      4. 学習データの下位x行を削除し、ファイルを保存する

      5. 評価データの下位x行を残し、上位の行を削除し、ファイルを保存する

Excelファイルでの処理において、手順2までを行ったものが下記となります。

Neural Network Console ラベル追加 加工データ
前回の記事で作成したExcelファイルに一つにまとめたラベルを追加したデータ

上記のExcelデータにおいて、H~M列に記載されているのが前回追加したラベルです。

そして今回、N列に一つにまとめたラベルを追加しました。

ここでやりたいことは、以下の通りです。

  • 各ラベルの組み合わせと一つにまとめたラベルの関係

    • (H列, I列, J列, K列, L列, M列) → N列

    • (0, 0, 0, 0, 0, 1) → 0

    • (0, 0, 0, 0, 1, 0) → 1

    • (0, 0, 0, 1, 0, 0) → 2

    • (0, 0, 1, 0, 0, 0) → 3

    • (0, 1, 0, 0, 0, 0) → 4

    • (1, 0, 0, 0, 0, 0) → 5

セルN2のラベルを算出する関数はLOG(BIN2DEC(CONCAT(H2:M2)), 2)です。

CONCAT(H2:M2)は、セルH2~M2のテキストを結合する関数です。

上記の例では、CONCAT(H2:M2)の出力が"000010"となります。

続いて、BIN2DEC(CONCAT(H2:M2))は、CONCAT関数で生成された二値の値を10進数に変換する関数です。

"000010"をBIN2DECで処理すると"2"となります。

ここで、私が期待するラベルの数値は"1"ですので、底が"2"のLOGをとり、"2"を"1"にします。

全てのN列に対して上記の関数を適用した結果が、上図にあるExcelの表です。

以後は、上記の手順に従って学習データと評価データを用意すれば良いです。

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

上記のAIモデルを学習させた際の学習曲線を下記に示します。

Neural Network Console Affine 4層 AIモデル 学習曲線
Affinを4層にしたAIモデルにおける学習曲線

今回の学習では、学習曲線を収束させるためにEpoch(学習回数)を500としました。

ERRORの値が1.0以上となっており、大きいのが気になります。

続いて、評価結果を以下に示します。

Neural Network Console Affine 4層 AIモデル 混同行列
Affinを4層にしたAIモデルにおける混同行列

AIモデルの予測値であるy'__0, y'__1およびy'__4の列が全て0となっているのが確認できます。

y:label=0の行においてy'__0が0ということは、AIモデルにy'__0(目的変数)を予想してほしいデータ(説明変数)を入力したにもかかわらず、他のフラグをAIモデルが予想してしまったことを意味します。

y:label=1, 4の行についても同様です。

また、y:label=2に関しては、AIモデルがy'__2と予想したケースが1あるものの、誤ってy'__2以外と予想してしまったケースが4であるため、精度は低いです。

今回は、Affineの4層化に加えて、Softmax+CategoricalCrossEntropyの正しい組み合わせを使用しており、それなりの結果を期待したのですが、残念です。

今後の課題

多クラス分類に関する知識を補うため、いろいろと勉強することにします。

また、翌営業日の株価が上がるか下がるかのみを予測する二値分類についても検証してみたいと思います。

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

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


この記事が気に入ったらサポートをしてみませんか?