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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

1回答

1662閲覧

kerasによる時系列予測の実装での結果の解釈ができない

stu824

総合スコア2

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2020/10/26 09:38

前提・実現したいこと

kerasによる時系列データの予測をしたく,そのためのモデルの構築をしているのですが,
作成したモデルの出力結果が思った結果が得られません。
モデルでは,5分間隔のデータを入力として使用し,6ステップ先(30分後)の値を予測したいと考えています。
しかし,出力される結果は下記図1のような結果となり,ただ前のステップの値を出力しているような結果となります。
学習データに対して,正解データを6ステップ(30分後)ずらした値として学習させるという考え方がまちがっているのでしょうか?
自分なりの対策として,30分間隔に集計したデータを用いて1ステップ先を予測するという形にしたのですが,
この結果(下記図2)も意図した学習ができていないように感じました。
私のプログラム自体が間違っているのでしょうか?
どこを改善したらいいのか教えてほしいです。

下記コードの意図としては,
pred_timeで予測したい将来を与えています。

【図の説明】
青線:予測値
オレンジ線:観測値

図1
図2

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

Python

1#1変数のみを入力 2 3import os 4import numpy as np 5import pandas as pd 6import matplotlib.pyplot as plt 7 8import_file = 'C:/Users/temp/Desktop/week_day_30min.csv' #データファイルの読み込み 9 10#事前の決定 11test_rate = 0.2 #データの分割割合 12time = 48 #一日の時系列長 13 14#データのインポート 15df = pd.read_csv(import_file) 16 17#必要なデータの抽出 18date = df.iloc[:,0:1].values #データの1列目を抽出 19Pt = df.iloc[:, 4:5].values #データの4列目を抽出 20Pt = Pt.reshape(-1,1) 21 22 23 24#データの分割 25from sklearn.model_selection import train_test_split 26date_1, date_2 = train_test_split(date, test_size=test_rate, shuffle=False) 27train, test = train_test_split(Pt,test_size=test_rate,shuffle=False) 28 29 30 31#0-1への正規化の定義 32from sklearn.preprocessing import MinMaxScaler 33 34def scale(train, test): 35 36 # change type 37 train = train.astype(np.float32) 38 test = test.astype(np.float32) 39 40 # scale inputs 41 sclr = MinMaxScaler() 42 train = sclr.fit_transform(train) 43 44 # scale labels 45 tsclr = MinMaxScaler() 46 test = tsclr.fit_transform(test) 47 48 49 return train, test, sclr, tsclr 50 51#正規化 52train, test, sclr, tsclr = scale(train, test) 53 54 55def create_dataset(dataset, look_back=1, pred_time=1): 56 dataX, dataY = [], [] 57 for i in range(len(dataset)-look_back-pred_time): 58 xset = [] 59 for j in range(dataset.shape[1]): 60 a = dataset[i:(i+look_back), j] 61 xset.append(a) 62 dataY.append(dataset[i + look_back + pred_time, 0]) 63 dataX.append(xset) 64 return np.array(dataX), np.array(dataY) 65 66look_back = 1 67pred_time = 5 68x_train, t_train = create_dataset(train, look_back, pred_time) 69x_test, t_test = create_dataset(test, look_back, pred_time) 70 71 72#各種インポート 73import keras 74from keras.models import Sequential, Model 75from keras.layers import Input, Dense, Activation, LSTM 76from keras.callbacks import EarlyStopping 77import math 78from sklearn.metrics import mean_squared_error, mean_absolute_error 79 80 81#モデルの定義 82Inputs = Input(shape = (x_train.shape[1], x_train.shape[2]), dtype='float32') 83lstm = LSTM(128)(Inputs) 84Outputs = Dense(1, activation='linear')(lstm) 85 86model = Model(inputs=[Inputs], outputs=[Outputs]) 87model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mean_squared_error']) 88 89es = EarlyStopping(monitor='val_loss', 90 patience=10, 91 verbose=1) 92 93#モデルの学習 94history = model.fit(x_train, t_train, epochs=10000, batch_size=20, verbose=1, shuffle=False, validation_split=0.1, callbacks=[es]) 95 96 97#予測 98pred = model.predict(x_test) #予測値 99obs = t_test.reshape(-1,1) #観測値 100 101 102#正規化を戻す 103obs_unscale=tsclr.inverse_transform(obs) 104pred_unscale=tsclr.inverse_transform(pred) 105 106 107#モデルの評価指標 108RMSE = math.sqrt(mean_squared_error(pred_unscale,obs_unscale)) 109ape = mean_absolute_error(pred_unscale, obs_unscale) 110MAPE =ape * 100/len(obs_unscale) 111print("RMSE=",RMSE) 112print("MAPE=",MAPE) 113 114 115#配列 → DataFrame 116dfd = pd.DataFrame(date_2) #日付 117dfp = pd.DataFrame(pred_unscale) #予測値 118dfo = pd.DataFrame(obs_unscale) #観測値 119 120 121#最初の1日を削除 122dfd = dfd[int(time):].reset_index(drop=True) 123dfp = dfp[int(time - pred_time - look_back):].reset_index(drop=True) 124dfo = dfo[int(time - pred_time - look_back):].reset_index(drop=True) 125 126 127#predとobsのDataFrameを一つにまとめる 128df = pd.concat([dfd, dfp, dfo], axis=1).dropna() #axis=1で横方向に連結 129 130 131#DataFrameの行名の変更 132df.columns = ['date_time', 'Pt_pred', 'Pt_obs'] 133 134 135#csvに書き出し 136df.to_csv('C:/Users/temp/Desktop/result/1V/30min/unit/output.csv')

試したこと

ハイパーパラメータの設定や,学習回数を増やすなどをしましたが,
上記の図のような結果しか得られませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こちらの質問と同等の事象と思われます。
https://teratail.com/questions/293157

ひとつの変数だけの推移で「少し後」をLSTMで予測すると、単純に最新の入力値を出力するだけの予測になりがちです。説明変数を増やすか、モデルそのものを(LSTMから)変えた方が良いです。

個人的には、LSTMは、大きな傾向や周期を読み取るのは得意ですが、直近の動きを予測するのは苦手と感じます。交通量の直近の予測は、周辺何kmかの交通量測定ポイントの値とかを説明変数に加え、LSTM以外の手法を使った方が、うまく当たると思います。直近の動きを周辺測定値からLSTM以外の手法で予測しつつ、LSTMでの大きな周期を予測するモデルを、アンサンブルすると、よい予測ができるように思います。

追加情報

この事情は、歴史的に?有名で、以下の記事が何度も引用されています。
ディープラーニングで株価予測するときの罠
特に学習時のaccの値を見ることで、同じ事象なのかが分かると思います。

投稿2020/10/26 10:37

編集2020/10/26 22:00
toast-uz

総合スコア3266

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

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

stu824

2020/10/26 11:11

回答ありがとうございます。 説明変数を増やすというのは, 例えば予測したい地点のデータの他に周辺地点のデータを使用するという意味でしょうか? それとも,t,t-1,…,t-5のデータを用いてt+1の予測をする時のt,t-1…の部分を増やすという意味でしょうか? 前者である場合,現状モデル自体に誤りがあるというよりはそもそも学習の限界ということでしょうか? 理解が及ばず申し訳ありません。
toast-uz

2020/10/26 11:17

前者です。現在の結果は、30分後はノイズ要素が強く、現状値ままとして予測するのが最も確からしいという解釈ですね。学習の限界であるように思います。なので、LSTMは1日とか1週間とかの大きなトレンドを予測するのに留めて、短期予測は、周辺地点のデータをソースに追加する等、別の手段を探るべきと思います。時系列予測=RNNやLSTM、という固定概念から離れてください。
stu824

2020/10/26 11:22

ありがとうございます。 確かに時系列の予測にはLSTMがいいと頭でっかちになっていたと思います。 追加のデータ他のモデルも試してみようと思います。 丁寧な回答をしていただきありがとうございました。大変助かりました。
stu824

2020/10/26 11:53

重ね重ねありがとうございます。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問