質問編集履歴
8
タイトル
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
正規化された値を
|
1
|
+
正規化された値をLSTMによって予測が行われた後に元の系列の大きさで評価したい
|
body
CHANGED
@@ -14,7 +14,8 @@
|
|
14
14
|
inverse_transformが行えていないのか, 正規化されたままのtrainPredictとinverse_transformを行った後の結果がほぼ同じ値になっている.
|
15
15
|
そのためRMSEが正規化された状態での計算となり, 非常に小さな値となってしまう.
|
16
16
|
#わからないこと
|
17
|
-
正規化を元に戻す方法,または手動で正規化を行い, LSTMを実行した後, 予測結果と訓練,テストデータを正規化前に戻して
|
17
|
+
LSTMを実行した後に正規化を元に戻す方法,または手動で正規化を行い, LSTMを実行した後, 予測結果と訓練,テストデータを正規化前に戻して
|
18
|
+
RMSEを算出する方法.
|
18
19
|
#以下プログラム
|
19
20
|
```python
|
20
21
|
#データの分割数
|
7
本文
title
CHANGED
File without changes
|
body
CHANGED
@@ -134,6 +134,4 @@
|
|
134
134
|
Train Score: 0.08 RMSE
|
135
135
|
Test Score: 0.14 RMSE
|
136
136
|
cross rmse2 = 0.11922512266093292
|
137
|
-
```
|
137
|
+
```
|
138
|
-
というような出力結果となります.
|
139
|
-
5回LSTMを回すことはできているのですが, 訓練とテストの結果が一致してしまっています. おそらく訓練とテストの分割に問題があるのかと思うのですが, どのように変更すればよいのでしょうか.
|
6
タイトル修正
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
正規化された値
|
1
|
+
正規化された値を元に戻して評価したい
|
body
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
inverse_transformが行えていないのか, 正規化されたままのtrainPredictとinverse_transformを行った後の結果がほぼ同じ値になっている.
|
15
15
|
そのためRMSEが正規化された状態での計算となり, 非常に小さな値となってしまう.
|
16
16
|
#わからないこと
|
17
|
-
正規化を元に戻す方法,または手動で正規化を行い,
|
17
|
+
正規化を元に戻す方法,または手動で正規化を行い, LSTMを実行した後, 予測結果と訓練,テストデータを正規化前に戻してRMSEを算出する方法.
|
18
18
|
#以下プログラム
|
19
19
|
```python
|
20
20
|
#データの分割数
|
5
タイトルの修正
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
1
|
+
正規化された値が戻らない
|
body
CHANGED
File without changes
|
4
本文とコードの修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -7,10 +7,14 @@
|
|
7
7
|
使用したデータは(3910, 64)のサイズです.
|
8
8
|
|
9
9
|
#やりたいこと
|
10
|
-
1列目から64列目までを入力して,
|
10
|
+
1列目から64列目までを入力して, 1列目の系列の予測をLSTMを使って行い, RMSEで評価する.
|
11
|
+
RMSEは訓練データ, 予測結果ともに正規化から元の系列に戻して計算したい.
|
12
|
+
|
11
13
|
#発生している問題
|
14
|
+
inverse_transformが行えていないのか, 正規化されたままのtrainPredictとinverse_transformを行った後の結果がほぼ同じ値になっている.
|
12
|
-
|
15
|
+
そのためRMSEが正規化された状態での計算となり, 非常に小さな値となってしまう.
|
16
|
+
#わからないこと
|
13
|
-
|
17
|
+
正規化を元に戻す方法,または手動で正規化を行い, これを戻す式を64列に対して適応する方法.
|
14
18
|
#以下プログラム
|
15
19
|
```python
|
16
20
|
#データの分割数
|
@@ -22,29 +26,17 @@
|
|
22
26
|
tscv = TimeSeriesSplit(n_splits=Fold, test_size=100)
|
23
27
|
|
24
28
|
#LSTM
|
25
|
-
from sklearn.model_selection import train_test_split
|
26
|
-
from sklearn.metrics import mean_squared_error
|
27
|
-
from sklearn.metrics import mean_absolute_error
|
28
|
-
import statsmodels.api as sm
|
29
|
-
from statsmodels.tsa import stattools
|
30
29
|
from keras.models import Sequential
|
31
30
|
from keras.models import load_model
|
32
31
|
from keras.layers import Dense
|
33
32
|
from keras.layers import LSTM
|
34
33
|
from sklearn.preprocessing import MinMaxScaler
|
35
|
-
import pandas as pd
|
36
|
-
import numpy as np
|
37
|
-
import matplotlib.pyplot as plt
|
38
|
-
import warnings
|
39
|
-
import math
|
40
34
|
#正規化
|
41
35
|
scaler = MinMaxScaler(feature_range=(0, 1))
|
42
36
|
dataset_new = scaler.fit_transform(dataset_new)
|
43
37
|
dataset_new = pd.DataFrame(dataset_new)
|
44
|
-
dataset_new
|
38
|
+
dataset_new=dataset_new.loc[:,[64個のカラム, 1列目に目的変数をもってきている]]
|
45
|
-
#最後に全体のrmseを算出するための空のリスト
|
46
39
|
cross_rmse2=[]
|
47
|
-
|
48
40
|
for fold, (train_index, test_index) in enumerate(tscv.split(dataset_new)):
|
49
41
|
X_train, X_test = dataset_new.iloc[train_index], dataset_new.iloc[test_index]
|
50
42
|
Y_train, Y_test = interpolate_rssi_dataset.iloc[train_index], interpolate_rssi_dataset.iloc[test_index]
|
@@ -57,8 +49,7 @@
|
|
57
49
|
for j in range(dataset_new.shape[1]):
|
58
50
|
a = dataset_new.iloc[i:(i + look_back), j]
|
59
51
|
xset.append(a)
|
60
|
-
#予測したいのは64列目(最終列)の系列データ
|
61
|
-
dataY.append(dataset_new.iloc[i + look_back,
|
52
|
+
dataY.append(dataset_new.iloc[i + look_back, 0])
|
62
53
|
dataX.append(xset)
|
63
54
|
return np.array(dataX), np.array(dataY)
|
64
55
|
|
@@ -82,6 +73,7 @@
|
|
82
73
|
trainPredict = model.predict(trainX)
|
83
74
|
testPredict = model.predict(testX)
|
84
75
|
|
76
|
+
print(trainPredict[:,0])
|
85
77
|
pad_col = np.zeros(dataset_new.shape[1]-1)
|
86
78
|
def pad_array(val):
|
87
79
|
return np.array([np.insert(pad_col, 0, x) for x in val])
|
@@ -90,11 +82,11 @@
|
|
90
82
|
trainY = scaler.inverse_transform(pad_array(trainY))
|
91
83
|
testPredict = scaler.inverse_transform(pad_array(testPredict))
|
92
84
|
testY = scaler.inverse_transform(pad_array(testY))
|
93
|
-
|
85
|
+
#正規化を元に戻す
|
94
|
-
print(trainPredict[
|
86
|
+
print(trainPredict[:,0])
|
95
|
-
trainScore = math.sqrt(mean_squared_error(trainY[:,
|
87
|
+
trainScore = math.sqrt(mean_squared_error(trainY[:,0], trainPredict[:,0]))
|
96
88
|
print('Train Score: %.2f RMSE' % (trainScore))
|
97
|
-
testScore = math.sqrt(mean_squared_error(testY[:,
|
89
|
+
testScore = math.sqrt(mean_squared_error(testY[:,0], testPredict[:,0]))
|
98
90
|
print('Test Score: %.2f RMSE' % (testScore))
|
99
91
|
cross_rmse2.append(testScore)
|
100
92
|
print(f"cross rmse2 =",np.mean(cross_rmse2))
|
@@ -102,56 +94,46 @@
|
|
102
94
|
#実行結果
|
103
95
|
```python
|
104
96
|
Epoch 1/2
|
105
|
-
107/107 - 4s - loss: 0.
|
97
|
+
107/107 - 4s - loss: 0.1102 - 4s/epoch - 41ms/step
|
106
98
|
Epoch 2/2
|
107
|
-
107/107 - 2s - loss: 0.
|
99
|
+
107/107 - 2s - loss: 0.0303 - 2s/epoch - 23ms/step
|
108
|
-
[
|
100
|
+
[0.42974246 0.429881 0.43014005 ... 0.5590104 0.55925095 0.5603747 ] #これは正規化された状態でのtrainPredict
|
109
|
-
-92.32716536]
|
110
|
-
[
|
101
|
+
[0.42974246 0.42988101 0.43014005 ... 0.55901039 0.55925095 0.56037468] #これはinverseを行い正規化を元に戻したtrainPredict
|
111
|
-
-92.32716536]
|
112
|
-
Train Score: 0.
|
102
|
+
Train Score: 0.14 RMSE
|
113
|
-
Test Score: 0.
|
103
|
+
Test Score: 0.04 RMSE
|
114
104
|
Epoch 1/2
|
115
|
-
110/110 - 5s - loss: 0.
|
105
|
+
110/110 - 5s - loss: 0.0276 - 5s/epoch - 41ms/step
|
116
106
|
Epoch 2/2
|
117
|
-
110/110 - 2s - loss: 0.
|
107
|
+
110/110 - 2s - loss: 0.0097 - 2s/epoch - 22ms/step
|
108
|
+
[0.5084579 0.50872 0.50901794 ... 0.84188867 0.8352394 0.83327174]
|
118
|
-
[
|
109
|
+
[0.5084579 0.50871998 0.50901794 ... 0.84188867 0.83523941 0.83327174]
|
119
|
-
-92.32716536]
|
120
|
-
[-92.32716536 -92.32716536 -92.32716536 ... -92.32716536 -92.32716536
|
121
|
-
-92.32716536]
|
122
|
-
Train Score: 0.
|
110
|
+
Train Score: 0.07 RMSE
|
123
|
-
Test Score: 0.
|
111
|
+
Test Score: 0.14 RMSE
|
124
112
|
Epoch 1/2
|
125
|
-
113/113 -
|
113
|
+
113/113 - 5s - loss: 0.0299 - 5s/epoch - 41ms/step
|
126
114
|
Epoch 2/2
|
127
|
-
113/113 -
|
115
|
+
113/113 - 3s - loss: 0.0201 - 3s/epoch - 22ms/step
|
116
|
+
[0.42214507 0.42244956 0.42274225 ... 0.7995421 0.7988943 0.7994946 ]
|
128
|
-
[
|
117
|
+
[0.42214507 0.42244956 0.42274225 ... 0.79954213 0.79889429 0.79949462]
|
129
|
-
-92.32716536]
|
130
|
-
[-92.32716536 -92.32716536 -92.32716536 ... -92.32716536 -92.32716536
|
131
|
-
-92.32716536]
|
132
|
-
Train Score: 0.
|
118
|
+
Train Score: 0.13 RMSE
|
133
|
-
Test Score: 0.
|
119
|
+
Test Score: 0.13 RMSE
|
134
120
|
Epoch 1/2
|
135
|
-
116/116 - 4s - loss: 0.
|
121
|
+
116/116 - 4s - loss: 0.0435 - 4s/epoch - 38ms/step
|
136
122
|
Epoch 2/2
|
137
|
-
116/116 -
|
123
|
+
116/116 - 3s - loss: 0.0113 - 3s/epoch - 22ms/step
|
124
|
+
[0.45806852 0.458272 0.4584012 ... 0.803413 0.80381125 0.8031619 ]
|
138
|
-
[
|
125
|
+
[0.45806852 0.45827201 0.4584012 ... 0.80341297 0.80381125 0.80316192]
|
139
|
-
-92.32716536]
|
140
|
-
[-92.32716536 -92.32716536 -92.32716536 ... -92.32716536 -92.32716536
|
141
|
-
-92.32716536]
|
142
|
-
Train Score: 0.
|
126
|
+
Train Score: 0.09 RMSE
|
143
|
-
Test Score: 0.
|
127
|
+
Test Score: 0.14 RMSE
|
144
128
|
Epoch 1/2
|
145
|
-
119/119 - 5s - loss: 0.
|
129
|
+
119/119 - 5s - loss: 0.0259 - 5s/epoch - 39ms/step
|
146
130
|
Epoch 2/2
|
147
|
-
119/119 -
|
131
|
+
119/119 - 3s - loss: 0.0089 - 3s/epoch - 22ms/step
|
148
|
-
[
|
132
|
+
[0.47482297 0.47502875 0.47521576 ... 0.7998894 0.79979026 0.7996928 ]
|
149
|
-
-92.32716536]
|
150
|
-
[
|
133
|
+
[0.47482297 0.47502875 0.47521576 ... 0.79988939 0.79979026 0.79969281]
|
151
|
-
-92.32716536]
|
152
|
-
Train Score: 0.
|
134
|
+
Train Score: 0.08 RMSE
|
153
|
-
Test Score: 0.
|
135
|
+
Test Score: 0.14 RMSE
|
154
|
-
cross rmse2 = 0.
|
136
|
+
cross rmse2 = 0.11922512266093292
|
155
137
|
```
|
156
138
|
というような出力結果となります.
|
157
139
|
5回LSTMを回すことはできているのですが, 訓練とテストの結果が一致してしまっています. おそらく訓練とテストの分割に問題があるのかと思うのですが, どのように変更すればよいのでしょうか.
|
3
タイトルと本文の修正
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
LSTMを多変量で行いたいが,
|
1
|
+
LSTMを多変量で行いたいが, 正規化の戻し方が分からない
|
body
CHANGED
@@ -10,6 +10,7 @@
|
|
10
10
|
1列目から64列目までを入力して, 64列目の系列の予測をLSTMを使って行い, RMSEで評価する.
|
11
11
|
#発生している問題
|
12
12
|
訓練とテストの結果が全くの同値となっているためRMSEが0となってしまう.
|
13
|
+
これはLSTMで予測した配列の正規化を元に戻すことが出来ていない為と考えられる.
|
13
14
|
#以下プログラム
|
14
15
|
```python
|
15
16
|
#データの分割数
|
2
タイトルと本文の修正
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
LSTMを多変量で行
|
1
|
+
LSTMを多変量で行いたいが, 実行結果が失敗している
|
body
CHANGED
@@ -8,6 +8,8 @@
|
|
8
8
|
|
9
9
|
#やりたいこと
|
10
10
|
1列目から64列目までを入力して, 64列目の系列の予測をLSTMを使って行い, RMSEで評価する.
|
11
|
+
#発生している問題
|
12
|
+
訓練とテストの結果が全くの同値となっているためRMSEが0となってしまう.
|
11
13
|
#以下プログラム
|
12
14
|
```python
|
13
15
|
#データの分割数
|
@@ -87,8 +89,8 @@
|
|
87
89
|
trainY = scaler.inverse_transform(pad_array(trainY))
|
88
90
|
testPredict = scaler.inverse_transform(pad_array(testPredict))
|
89
91
|
testY = scaler.inverse_transform(pad_array(testY))
|
90
|
-
print(trainY[0:63])
|
92
|
+
print(trainY[0:,63])
|
91
|
-
print(trainPredict[0:63])
|
93
|
+
print(trainPredict[0:,63])
|
92
94
|
trainScore = math.sqrt(mean_squared_error(trainY[:,63], trainPredict[:,63]))
|
93
95
|
print('Train Score: %.2f RMSE' % (trainScore))
|
94
96
|
testScore = math.sqrt(mean_squared_error(testY[:,63], testPredict[:,63]))
|
1
タイトルの修正
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
LSTMを多変量で行
|
1
|
+
LSTMを多変量で行ったが, 予測結果が元データと同値になり予測が行えていない
|
body
CHANGED
@@ -98,8 +98,6 @@
|
|
98
98
|
```
|
99
99
|
#実行結果
|
100
100
|
```python
|
101
|
-
(3910, 468)
|
102
|
-
cross rmse = 67.88924394292339
|
103
101
|
Epoch 1/2
|
104
102
|
107/107 - 4s - loss: 0.3512 - 4s/epoch - 39ms/step
|
105
103
|
Epoch 2/2
|