NNで時系列データを予測しようとしています。予測値を出力して観測値と照らし合わせてみると1ステップほどずれている(遅れている)ように思えます。時刻tでの入力に対して時刻t+1のラベルを付けていて、時刻tの値からt+1の値を予測したいと思っております。しかし思ったように結果が出ず原因がわかりません。ご教授願います。
python
1def supervise(data): #訓練データ作成:時刻tでの入力に対して時刻t+1のラベルを付けている 2 X = data.iloc[:-1, :] 3 y = data.iloc[1:, 1] 4 return X, y 5 6X, y = supervise(df) 7 8 9#%% 10from sklearn.model_selection import train_test_split 11def split_train_test(X, y): 12 X_train, X_val, y_train, y_val = train_test_split(X, y, test_size = 0.1, shuffle = False) 13 return X_train, X_val, y_train, y_val 14 15X_train, X_val, y_train, y_val = split_train_test(X, y) 16 17#%% 18from sklearn.preprocessing import MinMaxScaler 19def scale(X_train, X_val, y_train, y_val): 20 #change type 21 X_train = X_train.astype(np.float32) 22 X_val = X_val.astype(np.float32) 23 y_train = y_train.astype(np.float32) 24 y_val = y_val.astype(np.float32) 25 26 27 28 #scale inputs 29 sclr = MinMaxScaler() 30 X_train['SS'] = sclr.fit_transform(X_train['SS'].values.reshape(-1,1)) 31 X_train['SR'] = sclr.fit_transform(X_train['SR'].values.reshape(-1,1)) 32 X_val['SS'] = sclr.fit_transform(X_val['SS'].values.reshape(-1,1)) 33 X_val['SR'] = sclr.fit_transform(X_val['SR'].values.reshape(-1,1)) 34 #scale outputs 35 y_train = sclr.fit_transform(y_train.values.reshape(-1,1)) 36 y_val = sclr.transform(y_val.values.reshape(-1,1)) 37 38 return X_train, X_val, y_train, y_val 39 40X_train, X_val, y_train, y_val = scale(X_train, X_val, y_train, y_val) 41X_train 42 43 44y_train 45 46#%% 47n_inputs = 2 48n_outputs = 1 49n_neurons = 300 50 51X = tf.placeholder(shape = [None, n_inputs], dtype = tf.float32) 52y = tf.placeholder(shape = [None, n_outputs], dtype = tf.float32) 53 54he_init = tf.contrib.layers.variance_scaling_initializer() 55 56hidden1 = tf.layers.dense(X, n_neurons, activation = tf.nn.relu, kernel_initializer = he_init) 57logits = tf.layers.dense(hidden1, n_outputs) 58 59loss = tf.reduce_mean(tf.square(logits - y)) 60optimizer = tf.train.AdamOptimizer(learning_rate = 0.001) 61training_op = optimizer.minimize(loss) 62 63init = tf.global_variables_initializer() 64 65saver = tf.train.Saver() 66 67n_iterations = 1500 68 69 70with tf.Session() as sess: 71 init.run() 72 for iteration in range(n_iterations): 73 sess.run(training_op, feed_dict = {X : X_train, y : y_train}) 74 if iteration % 100 == 0: 75 save_path = saver.save(sess, '/tmp/nn_300.ckpt') 76 train_mse = loss.eval(feed_dict = {X : X_train, y : y_train}) 77 val_mse = loss.eval(feed_dict = {X : X_val, y: y_val}) 78 print(iteration, '\ttrain_MSE', train_mse, '\tval_mse', val_mse) 79 80with tf.Session() as sess: 81 saver.restore(sess, '/tmp/nn_300.ckpt') 82 y_pred = sess.run(logits, feed_dict = {X : X_val}) 83 84 85plt.figure(figsize=(8, 8)) 86plt.plot(y_pred, label = 'pred') 87plt.plot(y_val, label = 'true') 88plt.xlabel('Time[h]') 89plt.ylabel('Grobal Solar Radiation[W/m^2]') 90plt.legend() 91plt.savefig('nn_10_prediction.png') 92plt.show()
回答1件
あなたの回答
tips
プレビュー