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

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

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

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

0回答

1647閲覧

正規化された値をLSTMによって予測が行われた後に元の系列の大きさで評価したい

ammtjm

総合スコア7

Keras

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/12/08 09:21

編集2021/12/10 08:50

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

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問