Clear Filters
Clear Filters

LSTM の予測精度を上げる方法  How to increase LSTM prediction accuracy ?

38 views (last 30 days)
私は株価予測を通して LSTM について勉強しています。
質問は3つあります。
① 株価の予測を行いたいのですが、例えば 60 日後の株価を予測したい場合、input 60 日前の株価で、target 60 日後の株価であっていますか。また、データの前処理の仕方が不適切な場合、適切な方法を教えてください。
LSTM の精度をあげる方法を教えてください。追加するべきコードが知りたいです。
③ 精度を上げるために、検証データの導入を考えているのですが、検証データの作り方と、導入方法を教えてください。
以下、データやコードの詳細になります。
データの前処理として、input および target どちらも -1 ~ 1 の間にスケーリングしております。入出力データは 60 日毎に分割し、セル形式にしております。
今のプログラムだと、波形の動きは、訓練データと予測データで一致していますが、絶対値が最大で 20 % 弱離れています。テストデータも精度は良くないです。
LSTM のコードですが、こちらのサイトをコピペして使用しております。
layers = [
sequenceInputLayer(numFeatures)...
lstmLayer(numHiddenUnits,OutputMode="sequence")...
fullyConnectedLayer(50)...
dropoutLayer(0.5)...
fullyConnectedLayer(numResponses)...
];
maxEpoch = 1000;
miniBatchSize = 20;
options = trainingOptions("adam",...
MaxEpochs=maxEpoch,...
MiniBatchSize=miniBatchSize,...
InitialLearnRate=0.01,...
GradientThreshold=1,...
Shuffle="never",...
Metrics="rmse",...
Plots="training-progress",...
Verbose=0);
お忙しいところ恐縮ですが、ご教授をお願いします。

Accepted Answer

Kojiro Saito
Kojiro Saito on 8 Oct 2024
①は「60 日後の株価を予測したい場合、input は60日前までの株価で、target は 60 日後の株価」ですね。データの前処理は平均値と標準偏差を使って-1 ~ 1 の間に正規化されているなら十分かと思います。データ自体に前処理をしないで、sequenceInputLayer レイヤーにsequenceInputLayer(inputSize, Normalization="zscore")のようにzsoreやzerocenter などの正規化のオプションを入れることもできます。
②LSTMの精度を上げるのに、③の検証用データを追加する方法に加えていくつかアイディアがあります。
・データ量を増やす
学習に使っているデータ量を多くすることで精度が上がる可能性があります。
・パラメーターチューニングをする
LSTMネットワークのdropoutLayerの率を0.5から変えてみるとか、lstmLayerの隠れ層を変えてみるとか。パラメーターを変更してみることで精度向上の可能性があります。
さらに、ディープラーニングのハイパーパラメーターのチューニングによって精度向上が見込めます。下記の例のベイズ最適化を使うパラメーターチューニングではStatistics and Machine Learning Toolboxが必要になりますが、実験マネージャーアプリを使って様々なパラメーターのパターンを網羅して学習できます。
・LSTMを多段にする
精度が上がる保証はないですが、LSTMレイヤーを1層から複数層にしてみる方法もあります。
layers = [ ...
sequenceInputLayer(numFeatures)...
lstmLayer(numHiddenUnits,OutputMode="sequence")...
fullyConnectedLayer(50)...
dropoutLayer(0.5)...
lstmLayer(numHiddenUnits,OutputMode="sequence")...
fullyConnectedLayer(numResponses)];
③は深層学習を使用した sequence-to-one 回帰の例が参考になると思います。
学習用データの準備のセクションで学習用、検証用、テスト用にデータを分割し、
[idxTrain,idxValidation,idxTest] = trainingPartitions(numObservations, [0.8 0.1 0.1]);
trainingOptionsで
ValidationData={XValidation TValidation}, ...
と検証用データを指定している例です。
openExample('nnet/SequenceToOneRegressionUsingDeepLearningExample')
で例を開くと同じフォルダーにtrainingPartitions.mという関数が置かれています。これをご活用ください。
  3 Comments
Kojiro Saito
Kojiro Saito on 15 Oct 2024 at 0:37
回答を採用いただきありがとうございます。
1日前のデータを使った株価予測ならもっと精度は上がりますが、60日前なのでディープラーニングといえども限界があるかと思います。同様の事例をネットで調べてもテストデータで60%ほどの精度しか出ていなかったですね。
ディープラーニング自体を改善させる方法で行き詰まったら問題設定を見直されるのも一手かと思います。今回は入力データは株価だけにしていますが、他の経済指標として例えば為替レートなどを入れてみるとか、60日後ではなくもっと短い期間の予測にする、などが考えられます。
かなえ 永井
かなえ 永井 on 15 Oct 2024 at 0:53
ご返信ありがとうございます。
お試しで 60 日行ってみましたが、限界の可能性があるのですね。
実際の予測でも、日にちが経過する程精度が悪くなっていました。
期間設定を改めて、短期間の予測にシフトしようと思います。

Sign in to comment.

More Answers (0)

Categories

Find more on ビッグ データの処理 in Help Center and File Exchange

Products


Release

R2024a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!