https://qiita.com/tizuo/items/b9af70e8cdc7fb69397f
を参考に多変量分析にLSTMを使用しました.
時系列データに対して交差検証を行いたいと思い, 以下のサイトを参考にデータを分割しました.
https://zenn.dev/megane_otoko/articles/067_time_series_pred_2nd
使用したデータは(3910, 64)のサイズです.
#やりたいこと
1列目から64列目までを入力して, 1列目の系列の予測をLSTMを使って行い, RMSEで評価する.
RMSEは訓練データ, 予測結果ともに正規化から元の系列に戻して計算したい.
#発生している問題
inverse_transformが行えていないのか, 正規化されたままのtrainPredictとinverse_transformを行った後の結果がほぼ同じ値になっている.
そのためRMSEが正規化された状態での計算となり, 非常に小さな値となってしまう.
#わからないこと
LSTMを実行した後に正規化を元に戻す方法,または手動で正規化を行い, LSTMを実行した後, 予測結果と訓練,テストデータを正規化前に戻して
RMSEを算出する方法.
#以下プログラム
python
1#データの分割数 2Fold=5 3 4#時系列分析用の訓練用,テスト用のデータ分割 5 6from sklearn.model_selection import TimeSeriesSplit 7tscv = TimeSeriesSplit(n_splits=Fold, test_size=100) 8 9#LSTM 10from keras.models import Sequential 11from keras.models import load_model 12from keras.layers import Dense 13from keras.layers import LSTM 14from sklearn.preprocessing import MinMaxScaler 15#正規化 16scaler = MinMaxScaler(feature_range=(0, 1)) 17dataset_new = scaler.fit_transform(dataset_new) 18dataset_new = pd.DataFrame(dataset_new) 19dataset_new=dataset_new.loc[:,[64個のカラム, 1列目に目的変数をもってきている]] 20cross_rmse2=[] 21for fold, (train_index, test_index) in enumerate(tscv.split(dataset_new)): 22 X_train, X_test = dataset_new.iloc[train_index], dataset_new.iloc[test_index] 23 Y_train, Y_test = interpolate_rssi_dataset.iloc[train_index], interpolate_rssi_dataset.iloc[test_index] 24 25 26 def create_dataset(dataset_new, look_back=1): 27 dataX, dataY = [], [] 28 for i in range(len(dataset_new) - look_back - 1): 29 xset = [] 30 for j in range(dataset_new.shape[1]): 31 a = dataset_new.iloc[i:(i + look_back), j] 32 xset.append(a) 33 dataY.append(dataset_new.iloc[i + look_back, 0]) 34 dataX.append(xset) 35 return np.array(dataX), np.array(dataY) 36 37 38 look_back = 12 39 trainX, trainY = create_dataset(X_train, look_back) 40 testX, testY = create_dataset(X_test, look_back) 41 42 #kerasのLSTMで受け付けられている形式に変換 .shape[0]は行数, .shape[1]は列数, .shape[2]は3次元目の長さ 43 trainX = np.reshape(trainX, (trainX.shape[0], trainX.shape[1], trainX.shape[2])) 44 testX = np.reshape(testX, (testX.shape[0], testX.shape[1], testX.shape[2])) 45 46 #モデル作成 47 model = Sequential() 48 model.add(LSTM(4, input_shape=(testX.shape[1], look_back))) 49 model.add(Dense(1)) 50 model.compile(loss='mean_squared_error', optimizer='adam') 51 model.fit(trainX, trainY, epochs=2, batch_size=32, verbose=2) 52 53 #検証 54 trainPredict = model.predict(trainX) 55 testPredict = model.predict(testX) 56 57 print(trainPredict[:,0]) 58 pad_col = np.zeros(dataset_new.shape[1]-1) 59 def pad_array(val): 60 return np.array([np.insert(pad_col, 0, x) for x in val]) 61 62 trainPredict = scaler.inverse_transform(pad_array(trainPredict)) 63 trainY = scaler.inverse_transform(pad_array(trainY)) 64 testPredict = scaler.inverse_transform(pad_array(testPredict)) 65 testY = scaler.inverse_transform(pad_array(testY)) 66 #正規化を元に戻す 67 print(trainPredict[:,0]) 68 trainScore = math.sqrt(mean_squared_error(trainY[:,0], trainPredict[:,0])) 69 print('Train Score: %.2f RMSE' % (trainScore)) 70 testScore = math.sqrt(mean_squared_error(testY[:,0], testPredict[:,0])) 71 print('Test Score: %.2f RMSE' % (testScore)) 72 cross_rmse2.append(testScore) 73print(f"cross rmse2 =",np.mean(cross_rmse2))
#実行結果
python
1Epoch 1/2 2107/107 - 4s - loss: 0.1102 - 4s/epoch - 41ms/step 3Epoch 2/2 4107/107 - 2s - loss: 0.0303 - 2s/epoch - 23ms/step 5[0.42974246 0.429881 0.43014005 ... 0.5590104 0.55925095 0.5603747 ] #これは正規化された状態でのtrainPredict 6[0.42974246 0.42988101 0.43014005 ... 0.55901039 0.55925095 0.56037468] #これはinverseを行い正規化を元に戻したtrainPredict 7Train Score: 0.14 RMSE 8Test Score: 0.04 RMSE 9Epoch 1/2 10110/110 - 5s - loss: 0.0276 - 5s/epoch - 41ms/step 11Epoch 2/2 12110/110 - 2s - loss: 0.0097 - 2s/epoch - 22ms/step 13[0.5084579 0.50872 0.50901794 ... 0.84188867 0.8352394 0.83327174] 14[0.5084579 0.50871998 0.50901794 ... 0.84188867 0.83523941 0.83327174] 15Train Score: 0.07 RMSE 16Test Score: 0.14 RMSE 17Epoch 1/2 18113/113 - 5s - loss: 0.0299 - 5s/epoch - 41ms/step 19Epoch 2/2 20113/113 - 3s - loss: 0.0201 - 3s/epoch - 22ms/step 21[0.42214507 0.42244956 0.42274225 ... 0.7995421 0.7988943 0.7994946 ] 22[0.42214507 0.42244956 0.42274225 ... 0.79954213 0.79889429 0.79949462] 23Train Score: 0.13 RMSE 24Test Score: 0.13 RMSE 25Epoch 1/2 26116/116 - 4s - loss: 0.0435 - 4s/epoch - 38ms/step 27Epoch 2/2 28116/116 - 3s - loss: 0.0113 - 3s/epoch - 22ms/step 29[0.45806852 0.458272 0.4584012 ... 0.803413 0.80381125 0.8031619 ] 30[0.45806852 0.45827201 0.4584012 ... 0.80341297 0.80381125 0.80316192] 31Train Score: 0.09 RMSE 32Test Score: 0.14 RMSE 33Epoch 1/2 34119/119 - 5s - loss: 0.0259 - 5s/epoch - 39ms/step 35Epoch 2/2 36119/119 - 3s - loss: 0.0089 - 3s/epoch - 22ms/step 37[0.47482297 0.47502875 0.47521576 ... 0.7998894 0.79979026 0.7996928 ] 38[0.47482297 0.47502875 0.47521576 ... 0.79988939 0.79979026 0.79969281] 39Train Score: 0.08 RMSE 40Test Score: 0.14 RMSE 41cross rmse2 = 0.11922512266093292
あなたの回答
tips
プレビュー