TensorFlow 2.x での多変量LSTMとデータの前処理
こちらのサイトを参考に多変量LSTMにトライしています。
python
1import numpy as np 2import pandas as pd 3from matplotlib import pyplot as plt 4%matplotlib inline 5import seaborn as sns 6import time 7 8df = pd.read_csv('12.22min.csv') 9df['time'] = pd.to_datetime(df['time']) 10df.set_index('time', inplace=True) 11 12df
python
1#ルックバック数 2look_back =25 3 4#データ数 5sample_size = len(df) - look_back 6 7#予測に用いる期間 8past_size = int(sample_size*0.8) 9future_size = sample_size - past_size +1 10 11#データセットを作る関数 12def make_dataset(raw_data, look_back=25): 13 _X = [] 14 _y = [] 15 16 for i in range(len(raw_data) - look_back): 17 _X.append(raw_data[i : i + look_back]) 18 _y.append(raw_data[i + look_back]) 19 _X = np.array(_X).reshape(len(_X), look_back, 1) 20 _y = np.array(_y).reshape(len(_y), 1) 21 22 return _X, _y 23 24from sklearn import preprocessing 25 26columns = list(df.columns) 27del columns[0] 28 29# 最小0、最大1に正規化 30Xs =[] 31for i in range(len(columns)): 32 Xs.append(preprocessing.minmax_scale(df[columns[i]])) 33Xs = np.array(Xs) 34 35# 各数値データを作成 36X_flow, y_flow = make_dataset(Xs[0], look_back=look_back) 37X_sBP, y_sBP = make_dataset(Xs[1], look_back=look_back) 38X_mBP, y_mBP = make_dataset(Xs[2], look_back=look_back) 39X_dBP, y_dBP = make_dataset(Xs[3], look_back=look_back) 40X_HR, y_HR = make_dataset(Xs[4], look_back=look_back)
ここでエラーが出てしまいました。
IndexError Traceback (most recent call last)
<ipython-input-115-5737a4ea2153> in <module>
4 X_mBP, y_mBP = make_dataset(Xs[2], look_back=look_back)
5 X_dBP, y_dBP = make_dataset(Xs[3], look_back=look_back)
----> 6 X_HR, y_HR = make_dataset(Xs[4], look_back=look_back)
IndexError: index 4 is out of bounds for axis 0 with size 4
下から11行目の「del columns[0]」で変に列がずれてしまったのだと思い削除したら次へ進めたのですが
python
1# 多変量LSTMに対応するための各データを結合 2X_con = np.concatenate([X_flow, X_sBP, X_mBP, X_dBP, X_HR], axis=2) 3 4X = X_con 5y = y_flow 6 7# データを過去分(訓練に用いる分)と未来分(未来の予測に用いる分)に分割 8X_past = X[:past_size] 9X_future = X[past_size-1:] 10y_past = y[:past_size] 11y_future = y[past_size-1:] 12 13# 訓練データを定義 14X_train = X_past 15y_train = y_past 16 17import tensorflow as tf 18from tensorflow.keras.layers import Input, LSTM, Dense, BatchNormalization 19from tensorflow.keras.models import Model 20from tensorflow.keras.optimizers import SGD, Adam 21 22# LSTMモデルを作成する関数 23def create_LSTM_model(): 24 input = Input(shape=(np.array(X_train).shape[1], np.array(X_train).shape[2])) 25 x = LSTM(64, return_sequences=True)(input) 26 x = BatchNormalization()(x) 27 x = LSTM(64)(x) 28 output = Dense(1, activation='relu')(x) 29 model = Model(input, output) 30 return model 31 32model = create_LSTM_model() 33model.summary() 34model.compile(optimizer=Adam(learning_rate=0.0001), loss='mean_squared_error')
python
1history = model.fit(X_train, y_train, epochs=200, batch_size=64, verbose=1)
ここでepochにloss:nanしか出なくなり先に進めなくなってしまいました。
サイトの例文と相違する部分は
・時系列が分刻みである
・要素の列が一つ少ない
・予測対象の列が2列目に来ている
・各列の名称に沿ってデータ作成時に名称変更している
くらいと思うのですが、何が原因でうまくいかないのかわかりません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/07 03:03 編集
2021/01/07 03:19
2021/01/09 02:27