質問編集履歴

1

分かりやすく書き直し

2020/01/12 00:34

投稿

airi5151
airi5151

スコア5

test CHANGED
@@ -1 +1 @@
1
- 学習した結果train lossとtest lossがnanになる問題。ぜひご指導よろしくお願い致します。
1
+ 予測値y_predの中身がnanになる問題。ぜひご指導よろしくお願い致します。
test CHANGED
@@ -1,208 +1,4 @@
1
1
  ```ここに言語を入力
2
-
3
- x_cols = ["TEMP_okym","TEMP_hrsm"] + df.columns.tolist()[14:]
4
-
5
-
6
-
7
- X = df[x_cols]
8
-
9
- y = df["MW"]
10
-
11
-
12
-
13
- # ラベル付きデータをトレーニングセット (X_train, y_train)とテストセット (X_test,y_test)に分割
14
-
15
- from sklearn import model_selection
16
-
17
-
18
-
19
- X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=.2, random_state=42)
20
-
21
-
22
-
23
- # 正規化
24
-
25
- from sklearn.preprocessing import StandardScaler
26
-
27
-
28
-
29
- scaler = StandardScaler()
30
-
31
- scaler.fit(X_train)
32
-
33
-
34
-
35
- X_train = scaler.transform(X_train)
36
-
37
- X_test = scaler.transform(X_test)
38
-
39
-
40
-
41
- # Chainer読込
42
-
43
- from chainer import Chain, optimizers, Variable
44
-
45
- import chainer.functions as F
46
-
47
- import chainer.links as L
48
-
49
-
50
-
51
- # ニューラルネットワークのモデル生成用クラス
52
-
53
- class MyChain(Chain):
54
-
55
-
56
-
57
- def __init__(self, n_units=10):
58
-
59
- super(MyChain, self).__init__(
60
-
61
- l1=L.Linear(len(x_cols), n_units),
62
-
63
- l2=L.Linear(n_units, n_units),
64
-
65
- l3=L.Linear(n_units, 1))
66
-
67
-
68
-
69
- def __call__(self, X_data, y_data):
70
-
71
-
72
-
73
- X = Variable(X_data.astype(np.float32).reshape(len(X_data),len(x_cols))) # Variableオブジェクトに変換
74
-
75
- y = Variable(y_data.values.astype(np.float32).reshape(len(y_data),1)) # Variableオブジェクトに変換
76
-
77
- #print(x)
78
-
79
-
80
-
81
- #AttributeError: 'Series' object has no attribute 'reshape'とエラーを吐く。values.を追加して解決
82
-
83
- # 元のサンプルコードから他の変更点:x_data→X_data。x→X
84
-
85
-
86
-
87
- #Chainerのお作法で、データは配列からChainerのVariableという型(クラス)のオブジェクトに変換して使う
88
-
89
- #astype(np.float32):小数へ型変換(cast)?
90
-
91
- #reshape():NumPyの配列数と大きさの形状変換をする。配列の次元変更。例えばreshape(5,5)は5行5列
92
-
93
- #組み込み関数len()を使うと、リストや文字列など様々な型のオブジェクトのサイズ(要素数や文字数)を取得できる
94
-
95
- #B = reshape(A,sz) は、A の形状をサイズ ベクトル sz で定義される size(B) に変更する意味
96
-
97
-
98
-
99
- pred = self.predict(X)
100
-
101
- #print(pred)
102
-
103
- return F.mean_squared_error(pred, y)
104
-
105
-
106
-
107
- def predict(self, X):
108
-
109
- h1 = F.relu(self.l1(X))
110
-
111
- h2 = F.relu(self.l2(h1))
112
-
113
- h3 = self.l3(h2)
114
-
115
- return h3
116
-
117
-
118
-
119
- def get_predata(self, X):
120
-
121
- return self.predict(Variable(X.astype(np.float32).reshape(len(X),1))).data
122
-
123
-
124
-
125
- # パラメータ初期化
126
-
127
- batchsize = 16
128
-
129
- n_epoch = 50
130
-
131
- n_units = 10
132
-
133
-
134
-
135
- # モデル生成
136
-
137
- model = MyChain(n_units)
138
-
139
- optimizer = optimizers.Adam()
140
-
141
- optimizer.setup(model)
142
-
143
-
144
-
145
- # 学習
146
-
147
- train_losses =[]
148
-
149
- test_losses =[]
150
-
151
-
152
-
153
- N = len(X_train)
154
-
155
-
156
-
157
- for epoch in range(1, n_epoch + 1):
158
-
159
-
160
-
161
- perm = np.random.permutation(N)
162
-
163
-
164
-
165
- sum_loss = 0
166
-
167
- for i in range(0, N, batchsize):
168
-
169
- x_batch = X_train[perm[i:i + batchsize]]
170
-
171
- y_batch = y_train[perm[i:i + batchsize]]
172
-
173
-
174
-
175
- model.zerograds()
176
-
177
- loss = model(x_batch,y_batch)
178
-
179
- sum_loss += loss.data * batchsize
180
-
181
- loss.backward()
182
-
183
- optimizer.update()
184
-
185
-
186
-
187
- average_loss = sum_loss / N
188
-
189
- train_losses.append(average_loss)
190
-
191
-
192
-
193
- loss = model(X_test,y_test)
194
-
195
- test_losses.append(loss.data)
196
-
197
-
198
-
199
- # 学習過程を出力
200
-
201
- if epoch % 10 == 0:
202
-
203
- print("epoch: {}/{} train loss: {} test loss: {}".format(epoch, n_epoch, average_loss, loss.data))
204
-
205
-
206
2
 
207
3
  # 検証
208
4
 
@@ -218,4 +14,24 @@
218
14
 
219
15
  ```
220
16
 
17
+ # 質問:一つ教えていただけますか?
18
+
19
+ Chainerで電気需要予測モデルを作っているのですが、
20
+
221
- # 質問:上を実行するとtrain lossとtest lossがnanになり、X_test中身はマイナス数になります。また、検証でグラフを表示るとy_pred.arrayのグラフのみ表示されません。どなたか教えいただけますか?
21
+ 学習モデルを作成後下記の予測取得コード&グラフ作成でエラーメッセージは出ないでが、なぜか「y_predグラフのみ表示されません。調べみるとy_predの中身が
22
+
23
+ array([[nan],
24
+
25
+ [nan],
26
+
27
+ [nan],
28
+
29
+ ...,
30
+
31
+ [nan],
32
+
33
+ [nan],
34
+
35
+ [nan]], dtype=float32)
36
+
37
+ になっています。原因はどこにあると思いますか?