質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4831閲覧

NNでの時系列データ予測。出力が1ステップほどずれている。

Dyn.Mat.Mec

総合スコア8

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/06/26 21:24

編集2018/06/27 05:01

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()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2018/06/27 02:18

グラフを書いているコードが載ってないような気がしますが
guest

回答1

0

ベストアンサー

そもそも前のステップのyがXに入っていませんか?

モデルでの推定値と、前ステップのyの値と比べて、どちらがスコアがいいのですか?

またグラフは何をプロットしていますか?
テストデータだけですか?教師データとテストデータを合わせたものですか?

投稿2018/06/26 22:22

mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Dyn.Mat.Mec

2018/06/27 09:23 編集

回答ありがとうございます。 時刻tのデータから時刻t+1の日射量を予測したいため、入力が時刻tの日射量に対しての教師データは時刻t+1の日射量です。この時刻t+1の教師データの値は次ステップの入力Xに入って時刻t+2の日射量を予測するための入力になっています。これに問題点があるのでしょうか。グラフはテストデータに対しての予測値と観測値のみプロットしました。
Dyn.Mat.Mec

2018/06/27 08:01 編集

テストデータの入力を予測したい時刻の2ステップ前のデータにするとズレがなくなりました。しかし1ステップ前のデータから予測するように訓練したのに2ステップ前からのデータでないとずれるのがわかりません。
Dyn.Mat.Mec

2018/06/27 08:15

上記の2ステップ前のデータを入力するとズレがなくなるというのは誤りでした。
mkgrei

2018/06/27 09:30

以前に似た質問に答えたことがあります。 https://teratail.com/questions/118765 結論から言うと、多分何も学習していません。 そのモデルでは前日の値を繰り返すほうがスコアが高い可能性すらあります。
Dyn.Mat.Mec

2018/06/28 02:56 編集

その可能性が高そうです。つまりパターン認識が出来ず1ステップ前のデータを出力する方が損失が小さくなると学習したという認識でいいですか? またこの現象の解決方法として入力データ数を増やす、入力する特徴量を増やすというのはありでしょうか?
Dyn.Mat.Mec
mkgrei

2018/06/29 14:58

いつでもサンプル数が増えて、特徴量が増えると改善の可能性があります。 ただ今の現状に特別に有効かと言われると、そうではないように思います。 エラーというものを考えた際に、絶対誤差と相対誤差があります。 今のケースは消しうる大きな相対誤差を消さずに保持していることに問題があります。 > 差を一度計算してから、その相関を消すことによって正しいモデルになります。 についてはおっしゃる通りで正しいと思います。 z_i = y_i+1 - y_i を求めてから、zに対して学習を行うべきいというものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問