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

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

ただいまの
回答率

90.52%

  • Python

    7944questions

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

  • TensorFlow

    673questions

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 290

Dyn.Mat.Mec

score 2

NNで時系列データを予測しようとしています。予測値を出力して観測値と照らし合わせてみると1ステップほどずれている(遅れている)ように思えます。時刻tでの入力に対して時刻t+1のラベルを付けていて、時刻tの値からt+1の値を予測したいと思っております。しかし思ったように結果が出ず原因がわかりません。ご教授願います。

オレンジ:予測値、青:観測値

def supervise(data):   #訓練データ作成:時刻tでの入力に対して時刻t+1のラベルを付けている
    X = data.iloc[:-1, :]
    y = data.iloc[1:, 1]
    return X, y

X, y = supervise(df)


#%%
from sklearn.model_selection import train_test_split
def split_train_test(X, y):
    X_train, X_val, y_train, y_val = train_test_split(X, y, test_size = 0.1, shuffle = False)
    return X_train, X_val, y_train, y_val

X_train, X_val, y_train, y_val = split_train_test(X, y)

#%%
from sklearn.preprocessing import MinMaxScaler
def scale(X_train, X_val, y_train, y_val):
    #change type
    X_train = X_train.astype(np.float32)
    X_val = X_val.astype(np.float32)
    y_train = y_train.astype(np.float32)
    y_val = y_val.astype(np.float32)



    #scale inputs
    sclr = MinMaxScaler()
    X_train['SS'] = sclr.fit_transform(X_train['SS'].values.reshape(-1,1))
    X_train['SR'] = sclr.fit_transform(X_train['SR'].values.reshape(-1,1))
    X_val['SS'] = sclr.fit_transform(X_val['SS'].values.reshape(-1,1))
    X_val['SR'] = sclr.fit_transform(X_val['SR'].values.reshape(-1,1))
    #scale outputs
    y_train = sclr.fit_transform(y_train.values.reshape(-1,1))
    y_val = sclr.transform(y_val.values.reshape(-1,1))

    return X_train, X_val, y_train, y_val

X_train, X_val, y_train, y_val = scale(X_train, X_val, y_train, y_val)
X_train


y_train

#%%
n_inputs = 2
n_outputs = 1
n_neurons = 300

X = tf.placeholder(shape = [None, n_inputs], dtype = tf.float32)
y = tf.placeholder(shape = [None, n_outputs], dtype = tf.float32)

he_init = tf.contrib.layers.variance_scaling_initializer()

hidden1 =  tf.layers.dense(X, n_neurons, activation = tf.nn.relu, kernel_initializer = he_init)
logits = tf.layers.dense(hidden1, n_outputs)

loss = tf.reduce_mean(tf.square(logits - y))
optimizer = tf.train.AdamOptimizer(learning_rate = 0.001)
training_op = optimizer.minimize(loss)

init = tf.global_variables_initializer()

saver = tf.train.Saver()

n_iterations = 1500


with tf.Session() as sess:
    init.run()
    for iteration in range(n_iterations):
        sess.run(training_op, feed_dict = {X : X_train, y : y_train})
        if iteration % 100 == 0:
            save_path = saver.save(sess, '/tmp/nn_300.ckpt')
            train_mse = loss.eval(feed_dict = {X : X_train, y : y_train})
            val_mse = loss.eval(feed_dict = {X : X_val, y: y_val})
            print(iteration, '\ttrain_MSE', train_mse, '\tval_mse', val_mse)

with tf.Session() as sess:
    saver.restore(sess, '/tmp/nn_300.ckpt')
    y_pred = sess.run(logits, feed_dict = {X : X_val})


plt.figure(figsize=(8, 8))
plt.plot(y_pred, label = 'pred')
plt.plot(y_val, label = 'true')
plt.xlabel('Time[h]')
plt.ylabel('Grobal Solar Radiation[W/m^2]')
plt.legend()
plt.savefig('nn_10_prediction.png')
plt.show()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • quiqui

    2018/06/27 11:18

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

    キャンセル

  • Dyn.Mat.Mec

    2018/06/27 14:01

    追記しました。

    キャンセル

回答 1

checkベストアンサー

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/27 08:17 編集

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

    キャンセル

  • 2018/06/27 16:59 編集

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

    キャンセル

  • 2018/06/27 17:15

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

    キャンセル

  • 2018/06/27 18:30

    以前に似た質問に答えたことがあります。
    https://teratail.com/questions/118765

    結論から言うと、多分何も学習していません。
    そのモデルでは前日の値を繰り返すほうがスコアが高い可能性すらあります。

    キャンセル

  • 2018/06/28 10:57 編集

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

    キャンセル

  • 2018/06/28 13:08

    https://teratail.com/questions/11876を拝見したのですが、解決方法として差分を予測するとあります。「差を一度計算してから、その相関を消すことによって正しいモデルになります。」をもう少し解説していただけるとありがたいです。時刻tの値を予測したい場合は時刻t-1と時刻tの値の差を取りその差を予測するようなモデルを作り差を予測した後にt-1の値からtを算出するということでしょうか。

    キャンセル

  • 2018/06/29 23:58

    いつでもサンプル数が増えて、特徴量が増えると改善の可能性があります。
    ただ今の現状に特別に有効かと言われると、そうではないように思います。
    エラーというものを考えた際に、絶対誤差と相対誤差があります。
    今のケースは消しうる大きな相対誤差を消さずに保持していることに問題があります。

    > 差を一度計算してから、その相関を消すことによって正しいモデルになります。
    についてはおっしゃる通りで正しいと思います。
    z_i = y_i+1 - y_i
    を求めてから、zに対して学習を行うべきいというものです。

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    Kerasを用いたCNN3によるcifar10の画像認識

    Keras初心者です。 CNNを理解するためにKerasでモデルを作り、cifar10のデータを元にモデルの認識精度を出力しようとしています。 以下のプログラムに対するエラーの

  • 解決済

    Tensorflowのfully_connected_feedの実行にエラーが続く

    tensoflowのfully_connected_feed.pyを実行しようとしているのですが、どう試行錯誤してもエラーが続きます。 tensorflowのインストールの仕方、

  • 解決済

    index.reshapeの代わり

    困っていること pythonで index.reshape の代わりになるコードはありませんか? 発生している問題・エラーメッセージ NotImplementedError: 

  • 解決済

    機械学習の精度が上がらない

    前提・実現したいこと tensorflowを使ったテストプログラムを作成し、機械学習に必要十分なデータ量がどれだけなのか、その感覚を掴みたい、またはそのデータ量を推定するための見当

  • 受付中

    Tensorflowで異なるセッションでのrestoreして値の復元する際に、uninitializ...

    savar.save()で保存した値を異なるセッションでrestore()する際に初期化しているにも関わらず初期化されていない(uninitialize)とエラーが表示される。 4

  • 解決済

    tensorflowでのalexnetの実装で精度が変化しない

    前提・実現したいこと こんにちは。 趣味で画像認識を勉強しているものです。 「tensorflowでゆるゆりの製作会社を判定してみた」(http://mobiles-han.blo

  • 受付中

    GPU版tensorflowが動かない

     前提・実現したいこと tensorflow(GPU)を使用して畳み込みニューラルネットワークの チュートリアルをやっています。  発生している問題・エラーメッセージ C:\U

  • 解決済

    kerasで途中で計算処理をしたい場合について

    現在tensorflowをバックエンドとしたkerasを用いてネットワークを組んでいます。 簡単な処理はkerasのlayers.core.Lambdaと、Keras back

同じタグがついた質問を見る

  • Python

    7944questions

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

  • TensorFlow

    673questions