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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

Q&A

解決済

1回答

2140閲覧

LSTMでの予測がうまくいかない

Ykkykk

総合スコア140

Keras

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

0グッド

0クリップ

投稿2021/04/12 04:20

TensorFlowを用いてLSTMモデルを構築し、ディスク使用量の予測をしてみようとしているのですが、予測部分がうまくいかない状態です。
学習曲線は収束しているのですが、未来のデータに対する予測ができないようです。
初心者のRNN(LSTM) | Kerasで試してみるを参考にしておりますが、未来のデータの生成部分があまり理解できておりません。
ディスク使用量データは四万行強ほどあるデータです。これといって目立つような異常値や欠損値はない状態です。下記はPandasでCSVを読み込んだあとに、describe()メソッドを呼んだ際の出力です。

count 41280.000000 mean 43.636047 std 15.434929 min 17.000000 25% 30.000000 50% 44.000000 75% 57.000000 max 75.000000

ソースコードは下記のようにしております。

import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import StandardScaler, MinMaxScaler from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Activation from tensorflow.keras.layers import LSTM from tensorflow.keras.optimizers import Adam from tensorflow.keras.callbacks import EarlyStopping import tensorflow as tf df = pd.read_csv("disk.csv", index_col=0, parse_dates=True) df = df.sort_index() df = df.dropna() print(df.describe()) dataset = df.iloc[:, 0].values dataset = np.array(dataset).reshape(len(dataset), -1) scaler = MinMaxScaler() dataset = scaler.fit_transform(dataset) def make_dataset(dataset, lookback=7): data, target = [], [] for i in range(len(dataset) - lookback): data.append(dataset[i:i+lookback]) target.append(dataset[i+lookback]) data = np.array(data) target = np.array(target) re_data = data.reshape(len(data), lookback, 1) re_target = target.reshape(len(data), 1) return re_data, re_target lookback = 1000 X, y = make_dataset(dataset, lookback) print(X.shape) print(y.shape) def model_fit(): model = Sequential() model.add( LSTM(100, batch_input_shape=(None, X.shape[1], 1), return_sequences=False) ) model.add(Dense(1)) model.add(Activation('linear')) optimizer = Adam(lr=0.001) model.compile(loss="mean_squared_error", optimizer=optimizer) early_stopping = EarlyStopping(monitor="val_loss", mode="auto", patience=20) history = model.fit( X, y, batch_size=512, epochs=500, validation_split=0.3, callbacks=[early_stopping] ) model.save("disk_model.h5") loss = history.history["loss"] val_loss = history.history["val_loss"] epochs = range(len(loss)) plt.figure(figsize=(10, 5)) plt.plot(epochs, loss, color="r", label="Training loss") plt.plot(epochs, val_loss, color="b", label="Validation loss") plt.legend(fontsize=20) plt.show() model_fit() model = tf.keras.models.load_model("disk_model.h5") predicted = model.predict(X) future_test = X[-1].T time_length = future_test.shape[1] future_result = np.array((1)) for step2 in range(400): test_data = np.reshape(future_test, (1, time_length, 1)) batch_predicted = model.predict(test_data) future_test = np.delete(future_test, 0) future_test = np.append(future_test, batch_predicted) future_result = np.append(future_result, batch_predicted) plt.figure(figsize=(15, 5)) plt.plot(range(lookback, len(predicted)+lookback), predicted, color="r", label="predicte_data") plt.plot(range(0, len(dataset)), dataset, color="b", label="row_data") plt.plot(range(0+len(dataset), len(future_result)+len(dataset)), future_result, color="g", label="future") plt.legend() plt.show()

上記のコードを実行すると最終的に下記のグラフがプロットされます。
plot.png
個人的には右端の緑色の予測部分も青色部分と同じ振幅を持っていてほしかったのですが、なぜか0.5未満の値が含まれていないようでした。

こちらのソースコードだと適切に予測できないということでしょうか?
どの辺が問題になっているのかがわからず、調べることさえできない状態です。。。
初歩的なことで申し訳ありませんが、ご教示いただけますと幸いです。よろしくお願いいたします

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

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

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

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

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

guest

回答1

0

ベストアンサー

最後の図を見る限り、過学習をしていると思われます。
まずは、train, validation, testにデータを分けた上でモデルの性能を評価するべきだと思います。

また、ディスクの使用量を予測させるとのことですが、
機械学習は魔法ではないので、その中からある程度の規則性を見出すことができない状態では正しく学習は行なえません。
学習がうまく行かないと思ってパラメータ数を増やすと、本来学習したい特徴ではない特徴を学習してしまい、訓練データに過剰に適合してしまう過学習という問題が起こります。
そのあたりをもう一度詳しく勉強していただいてそのデータのみで本当に予測できるのかどうかを考えてみてはいかがでしょうか?

投稿2021/04/12 10:18

編集2021/04/12 10:20
BoKuToTuZenU

総合スコア51

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

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

Ykkykk

2021/04/13 00:02

ご回答いただきありがとうございます。やはり過学習しているということなのですね。。。ディスク使用量自体ははっきりと予測できなくても良く、上記のQiitaの記事をやってみたので、自分でもなんらかの周期性のありそうなデータで予測っぽいことができないかな、と思った次第です。特徴をつかむことやデータの前処理や選択自体について検討したいと思います。基本的なことで申し訳ありませんでした。ありがとうございます。
BoKuToTuZenU

2021/04/13 06:01

過学習しているかどうかを確かめる方法として、訓練データ、検証データ、テストデータに分けて評価する方法があるかと思います。そうすることで、過学習しているかどうかや、ハイパーパラメータがどのような値を取ればうまく学習できるかどうかを確認することができるかと思います。 データのそれぞれの役割としては、 訓練データ->機械学習のモデル(今回はLSTM)を学習するためのデー% 検証データ->ハイパーパラメータがちょうど良いかを確認するためのデータ テストデータ->モデルの汎化性能(モデルが見たことのないデータでどれほど正確に予測できるか)をテストするデータ こちらは機械学習の本を見ればだいたい書いてあると思います。
Ykkykk

2021/04/13 07:21

再度コメントくださりありがとうございます。その後上記のデータに対して、最初の3000行を学習と検証に使用し(model.fitでvalidation_split=0.3としました)、3001行目から4000行目をモデルの学習後のテストデータとして与えてみた(model.predictに渡した)ところ、テストデータだと思っているデータに対してもそれなりにあっていたのですが、これは学習できているということなのでしょうか???漠然とした質問ですみません。
BoKuToTuZenU

2021/04/15 08:09

テストデータに対してうまく予測できている(予測できているかどうかはモデルを作った人の評価次第です)ならば学習できていると考えても差し支えないかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問