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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Keras

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

Python

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

受付中

LSTMでテストデータの正答率が不自然に良すぎるのは何故でしょうか。

KineSaku
KineSaku

総合スコア0

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Keras

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

Python

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

1回答

0評価

4クリップ

26閲覧

投稿2018/03/23 15:40

編集2022/01/12 10:55

リンク内容イメージ説明
LSTMを使って有る時系列データの予測を行ってみたところ、
不自然に正答率が良すぎる結果となってしまいました。
CSVから読み込んだデータをトレーニング用データとテスト用データに分割し、
トレーニング後にテスト用データを使ってpredictさせています。
Look_backは12で学習は300回行いました。
predictの結果としましては
トレーニングが13.44 RMSEに対して
テストデータ予測時が8.96 RMSEとなりました。
トレーニング用の部分とテスト予測時のデータを見比べてみると
周期的ではないように見えますし、ここまでうまく予測できるはずはないのでは?と考えております。

X(t-11) ~ X(t) までのデータからX(t+1) を予測するというのを繰り返していると考えているのですが、
以下

ソースコードと予測結果のグラフを観て何かおかしな箇所有りますでしょうか?
※グラフはブルーが実際のデータ
オレンジがトレーニング後 トレーニングデータを用いてpredictしたものになります。
緑はテストデータを用いてpredictを行った結果です。

結果が間違っているのでは?と思っておりますが、何か助言頂けないでしょうか?

アドバイスよろしくお願いいたします。

python

import numpy import matplotlib.pyplot as plt import matplotlib.ticker as tick # 目盛り操作に必要なライブラリを読み込みます import pandas import math from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM from sklearn.preprocessing import MinMaxScaler from sklearn.metrics import mean_squared_error #データ読み込み Yは最初の列に配置する dataframe = pandas.read_csv('/root/userspace/Hiwasawa/lesson3/LSTM/LSTMData3.csv', usecols=[2]) plt.plot(dataframe.iloc[:,0],label = "DataA") plt.legend() #目盛り関係 plt.gca().yaxis.set_major_locator(tick.MultipleLocator(500)) plt.show() print(dataframe.head()) dataset = dataframe.values dataset = dataset.astype('float32') # normalize the dataset scaler = MinMaxScaler(feature_range=(0, 1)) dataset = scaler.fit_transform(dataset) # split into train and test sets train_size = int(len(dataset) * 0.67) test_size = len(dataset) - train_size train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:] print(len(train), len(test)) # convert an array of values into a dataset matrix # if you give look_back 3, a part of the array will be like this: Jan, Feb, Mar def create_dataset(dataset, look_back=1): dataX, dataY = [], [] for i in range(len(dataset)-look_back-1): xset = [] for j in range(dataset.shape[1]): a = dataset[i:(i+look_back), j] xset.append(a) dataY.append(dataset[i + look_back, 0]) dataX.append(xset) return numpy.array(dataX), numpy.array(dataY) # reshape into X=t and Y=t+1 look_back = 12 trainX, trainY = create_dataset(train, look_back) testX, testY = create_dataset(test, look_back) print(testX.shape) print(testX[0]) print(testY) # reshape input to be [samples, time steps(number of variables), features] *convert time series into column trainX = numpy.reshape(trainX, (trainX.shape[0], trainX.shape[1], trainX.shape[2])) testX = numpy.reshape(testX, (testX.shape[0], testX.shape[1], testX.shape[2])) # create and fit the LSTM network model = Sequential() model.add(LSTM(4, input_shape=(testX.shape[1], look_back))) #shape:変数数、遡る時間数 model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') model.fit(trainX, trainY, epochs=300, batch_size=1, verbose=2) # make predictions trainPredict = model.predict(trainX) testPredict = model.predict(testX) pad_col = numpy.zeros(dataset.shape[1]-1) # invert predictions def pad_array(val): return numpy.array([numpy.insert(pad_col, 0, x) for x in val]) trainPredict = scaler.inverse_transform(pad_array(trainPredict)) trainY = scaler.inverse_transform(pad_array(trainY)) testPredict = scaler.inverse_transform(pad_array(testPredict)) testY = scaler.inverse_transform(pad_array(testY)) # calculate root mean squared error trainScore = math.sqrt(mean_squared_error(trainY[:,0], trainPredict[:,0])) print('Train Score: %.2f RMSE' % (trainScore)) testScore = math.sqrt(mean_squared_error(testY[:,0], testPredict[:,0])) print('Test Score: %.2f RMSE' % (testScore)) print(testY[:,0]) print(testPredict[:,0]) # shift train predictions for plotting trainPredictPlot = numpy.empty_like(dataset) trainPredictPlot[:, :] = numpy.nan trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict # shift test predictions for plotting testPredictPlot = numpy.empty_like(dataset) testPredictPlot[:, :] = numpy.nan testPredictPlot[len(trainPredict)+(look_back*2)+1:len(dataset)-1, :] = testPredict # plot baseline and predictions plt.plot((scaler.inverse_transform(dataset))[:,0]) plt.plot(trainPredictPlot[:,0]) plt.plot(testPredictPlot[:,0]) plt.show()![イメージ説明](ec8e45dbcc3412a41d1c7727feb08304.png)

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

mkgrei
mkgrei

2018/03/23 16:11

データはなにを使っていますか?独自データの場合差し支えなければ載せていただけないでしょうか。
KineSaku
KineSaku

2018/03/23 16:26

コメントありがとうございます。 データですが、teratailへのアップロードの方法が解りませんでしたので、GoogleDriveのリンクを張らせて頂きます。
KineSaku
KineSaku

2018/03/23 16:27

https://drive\.google\.com/file/d/1cFI4USDzzr9qygxjKEAh7UzGdi02NJa5/view\?usp=sharing
KineSaku
KineSaku

2018/03/23 16:29

CSVの3列目DataAが対象のデータとなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Keras

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

Python

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