LSTM の予測精度を上げる方法 How to increase LSTM prediction accuracy ?
38 views (last 30 days)
Show older comments
私は株価予測を通して 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);
お忙しいところ恐縮ですが、ご教授をお願いします。
0 Comments
Accepted Answer
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)];
学習用データの準備のセクションで学習用、検証用、テスト用にデータを分割し、
[idxTrain,idxValidation,idxTest] = trainingPartitions(numObservations, [0.8 0.1 0.1]);
trainingOptionsで
ValidationData={XValidation TValidation}, ...
と検証用データを指定している例です。
openExample('nnet/SequenceToOneRegressionUsingDeepLearningExample')
で例を開くと同じフォルダーにtrainingPartitions.mという関数が置かれています。これをご活用ください。
3 Comments
Kojiro Saito
on 15 Oct 2024
回答を採用いただきありがとうございます。
1日前のデータを使った株価予測ならもっと精度は上がりますが、60日前なのでディープラーニングといえども限界があるかと思います。同様の事例をネットで調べてもテストデータで60%ほどの精度しか出ていなかったですね。
ディープラーニング自体を改善させる方法で行き詰まったら問題設定を見直されるのも一手かと思います。今回は入力データは株価だけにしていますが、他の経済指標として例えば為替レートなどを入れてみるとか、60日後ではなくもっと短い期間の予測にする、などが考えられます。
More Answers (0)
See Also
Categories
Find more on ビッグ データの処理 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!