前提
LSTMの勉強のため、pythonでLSTMを用いて株価の予測を行うシステムを作成しています。
従来の「100日間のデータを与えて101日目を予測する」というLSTMではなく,「A~C社の1~100日間のデータを与えてD社の1~100日間の株価を予測する」というLSTMを目標にしております。
現在160社のデータ108日間の長さ130個の説明変数
という三次元配列で学習させようとしていますが,あまり参考にできるサイトがなく,学習で様々な値がnanになっており,非常に苦労しています。
学習率を減らしたり,正規化で0除算が行われていないか等色々調べましたが直らず...
やはり160というデータ数では0から予測を行うLSTMは無理なのでしょうか
また,kerasでLSTMネットワークを構築する時に取り入れるといい層の考え方等はありますでしょうか?
実現したいこと
0から予測を行うLSTMネットワークのnanを直したい
発生している問題・エラーメッセージ
Epoch 1/64 5/5 [==============================] - 8s 571ms/step - loss: nan - mae: nan - val_loss: nan - val_mae: nan ...省略... Epoch 64/64 5/5 [==============================] - 1s 234ms/step - loss: nan - mae: nan - val_loss: nan - val_mae: nan _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_3 (InputLayer) [(None, 108, 130)] 0 lstm_2 (LSTM) (None, 108, 130) 135720 conv1d_2 (Conv1D) (None, 108, 1) 391 ================================================================= Total params: 136,111 Trainable params: 136,111 Non-trainable params: 0 _________________________________________________________________
該当のソースコード
python
1import os 2import numpy as np 3from sklearn.model_selection import train_test_split 4from sklearn import preprocessing 5from matplotlib import pyplot as plt 6import tensorflow as tf 7from tensorflow.keras.layers import Conv1D,LSTM,Dense,Input 8from tensorflow.keras.models import Model 9from tensorflow.keras.utils import plot_model 10import pandas as pd 11 12#シーケンスに沿ったデータを作成する関数-------------------------------------------------------- 13def make_dataset(): 14 for i in range(1,21): 15 for j in range(13,21): 16 path="E:\\最強データ2_フレーム揃え\\喜び_13~20\\Actor_"+str(i)+"\\合体"+str(j)+".csv" 17 df=pd.read_csv(path,index_col=0,header=0) 18 df.pop("AU12_r") 19 yy=df["AU06_r"] 20 df=df.apply(lambda x: (x-x.min())/(x.max() - x.min()), axis=0) 21 yyy=yy.values.astype(float) 22 preprocessing.minmax_scale(yyy) 23 data = df.values.astype(float) 24 25 x.append(data) 26 y.append(yyy) 27 28 return np.array(x), np.array(y) 29 30 31x=list() 32y=list() 33x,y= make_dataset() 34x_train, x_valid, y_train, y_valid = train_test_split(x, y, test_size = 1) 35print("3次元リストの要素数: " + str(len(x))) 36print("3次元リストの中にある2次元リストの要素数: " + str(len(x[1]))) 37print("3次元リストの中にあるリストの要素数: " + str(len(x[0][2]))) 38print("2次元リストの要素数: " + str(len(y))) 39print("2次元リストの中にあるリストの要素数: " + str(len(y[2]))) 40 41#データの種類(160)*データの長さ(108)*説明変数(130) 42inputs=Input(shape=(108,130)) 43x = LSTM(130, return_sequences = True)(inputs) 44x = Conv1D(1, 3, padding = "same", activation = "linear")(x) 45model = Model(inputs, x) 46 47adam=tf.keras.optimizers.Adam(lr=0.01) 48model.compile( 49 optimizer = adam,#最適化アルゴリズム 50 loss = "mse",#損失関数 51 metrics = ["mae"]#評価関数 52) 53 54plot_model(model) 55model.fit( 56 x_train, y_train, 57 epochs = 64, 58 batch_size = 32, 59 validation_data = (x_valid, y_valid) 60) 61print(model.summary()) 62pred = model.predict(x_valid) 63print(pred.shape) 64print(pred[0]) 65
試したこと
loss値のnanを無くすために学習率を減らした。
補足情報(FW/ツールのバージョンなど)
keras 2.10.0
Keras-Preprocessing 1.1.2
tensorflow 2.11.0
tensorflow-estimator 2.10.0
tensorflow-io-gcs-filesystem 0.28.0
回答1件
あなたの回答
tips
プレビュー