前提・実現したいこと
詳解ディープラーニングという参考書のコードを参考にLSTMを用いた時系列データの
予測を行いたいのですが、本来なら0~1の範囲内で増減するはずの
予測値の値がほぼ一定になってしまいます。
なぜそうなるのか、理解できていないので皆様のお力をお借りしたい所存です。
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
python3
1''' 25.2.6 LSTM - Keras (sinæ³¢) 3''' 4 5 6import numpy as np 7import matplotlib.pyplot as plt 8from sklearn.model_selection import train_test_split 9import tensorflow as tf 10from tensorflow.keras import datasets 11from tensorflow.keras.models import Sequential 12from tensorflow.keras.layers import Dense, LSTM 13from tensorflow.keras import optimizers 14from tensorflow.keras.callbacks import EarlyStopping 15import sp波動法 16 17 18if __name__ == '__main__': 19 np.random.seed(123) 20 tf.random.set_seed(123) 21 22 ''' 23 1. データの準備 24 ''' 25 N=0 26 f = sp波動法.file 27 for i in range(len(f)): 28 if np.isnan(sp波動法.file['60日移動平均'][i]): 29 N+=1 30 else: 31 break 32 #print(N) 33 length_of_sequences = len(f) 34 35 maxlen = 60 36 37 x = [] 38 t = [] 39 40 for i in range(N,length_of_sequences - maxlen): 41 x.append(sp波動法.kairiritu[i:i+maxlen]) 42 t.append(sp波動法.jousyou[i+maxlen]) 43 44 x = np.array(x).reshape(-1, maxlen, 1) 45 t = np.array(t).reshape(-1, 1) 46 47 x_train, x_val, t_train, t_val = \ 48 train_test_split(x, t, train_size=0.8, test_size=0.2, shuffle=False) 49 #print(x) 50 #print(t) 51 # print(x_train.shape) 52 # print(x_val.shape) 53 # print(t_train.shape) 54 # print(t_val.shape) 55 56 ''' 57 2. モデルの構築 58 ''' 59 model = Sequential() 60 model.add(LSTM(50, activation='tanh', 61 recurrent_activation='sigmoid', 62 kernel_initializer='glorot_normal', 63 recurrent_initializer='orthogonal')) 64 model.add(Dense(1, activation='linear')) 65 66 ''' 67 3. モデルの学習 68 ''' 69 optimizer = optimizers.Adam(learning_rate=0.001, 70 beta_1=0.9, beta_2=0.999, amsgrad=True) 71 72 model.compile(optimizer=optimizer, 73 loss='mean_squared_error') 74 75 es = EarlyStopping(monitor='val_loss', 76 patience=10, 77 verbose=1) 78 79 hist = model.fit(x_train, t_train, 80 epochs=1000, batch_size=100, 81 verbose=2, 82 validation_data=(x_val, t_val), 83 callbacks=[es]) 84 85 ''' 86 4. モデルの評価 87 ''' 88 gen = [None for i in range(maxlen)] 89 cnt1=0 90 cnt2=0 91 cnt3=0 92 cnt4=0 93 num=0 94 #print(cnt) 95 #z = x[:1] 96 97 98 for i in range(len(f) - maxlen): 99 z1 = x[:i+N] 100 z = z1.reshape(-1, maxlen, 1) 101 #print(z) 102 preds = model.predict(z[-1:]) 103 #z = np.append(gen, preds)[1:] 104 105 gen.append(preds[0,0]) 106 107 #print(gen) 108 109 for i in range(len(f) - maxlen): 110 if gen[i] is None: 111 continue 112 if sp波動法.jousyou[i]==1: 113 if gen[i] >= 0.5: 114 cnt1+=1 115 else: 116 cnt2+=1 117 else: 118 if gen[i] < 0.5: 119 cnt1+=1 120 else: 121 cnt2+=1 122 正答率=cnt1/(cnt1+cnt2) 123 print(正答率) 124 125 fig = plt.figure() 126 plt.rc('font', family='serif') 127 #plt.xlim([0, len(f)]) 128 #plt.ylim([-0.2, 1.2]) 129 plt.plot(range(len(f)), sp波動法.jousyou, 130 color='gray', 131 linestyle='--', linewidth=0.5) 132 plt.plot(range(len(f)), gen, 133 color='black', linewidth=1, 134 marker='o', markersize=1, markerfacecolor='black', 135 markeredgecolor='black') 136 # plt.savefig('output.jpg') 137 plt.show()
試したこと
補足情報(FW/ツールのバージョンなど)
データはデューカスコピーから円ドルのBIDデータを一日足で二年分取得しています。
環境はanaconda3でインストールしたpython3をspyderで記述しています。