標準化・正規化の仕方が分からない
解決したいこと
以下のRNNに用いるデータを標準化・正規化をしたいのだがうまくできない。どこを改善すればよいか。
発生している問題・エラー
batch_size = 15 # バッチサイズ
n_in = 12 # 入力層のニューロン数
n_mid = 20 # 中間層のニューロン数
n_out = 1 # 出力層のニューロン数
target = 0
dataset= np.column_stack((y_2t,y_1t,y_8t,y_9t,y_10t,y_11t,y_12t,y_13t,y_14t,y_15t,y_16t,y_17t)).reshape(-1,n_in)
# 標準化のクラスを定義
scaler = StandardScaler()
train_x = dataset[0:-42,:]
test_x = dataset[-42:-18,:]
train_X = scaler.fit_transform(train_x)
test_X = scaler.fit_transform(test_x)
n_rnn = 12 # 時系列の数
n_sample = len(train_x)-n_rnn # サンプル数
i_data = np.zeros((n_sample, n_rnn,n_in)) # 入力
c_data = np.zeros((n_sample, n_rnn,1)) # 正解
for i in range(0,n_sample):
i_data[i] = train_x[i:i+n_rnn,:]
c_data[i] = train_x[i+1:i+n_rnn+1,target].reshape(-1, 1) # 時系列を入力よりも一つ後にずらす
n_sample2 = len(test_x)-n_rnn
i_data2 = np.zeros((n_sample2, n_rnn,n_in))
c_data2 =np.zeros((n_sample2, n_rnn,1))
for i in range(0,n_sample2):
i_data2[i] = test_x[i:i+n_rnn,:]
c_data2[i] = test_x[i+1:i+n_rnn+1,target].reshape(-1, 1)
i_data = i_data.reshape(n_sample, n_rnn, n_in) # KerasにおけるRNNでは、入力を(サンプル数、時系列の数、入力層のニューロン数)にする
c_data = c_data.reshape(n_sample, n_rnn, 1) # 今回は入力と同じ形状
# モデルの設計
model = keras.Sequential()
# SimpleRNN層の追加。return_sequenceをTrueにすると、時系列の全てのRNN層が出力を返す。
# return_sequenceをTrueをFalseにすると、最後のRNN層のみが出力を返す。
model.add(SimpleRNN(n_mid, input_shape=(n_rnn, n_in), return_sequences=True))
model.add(Dense(n_out, activation="linear"))
model.compile(loss="mean_squared_error", optimizer="sgd") # 誤差は二乗誤差、最適化アルゴリズムはSGD
history = model.fit(i_data, c_data, epochs=100, batch_size=batch_size)
predictions = model.predict(i_data2)
#predictions = ms.inverse_transform(predictions_o).reshape(-1,n_rnn,1)
# 日付の抽出(観測値と計算値の数に一致する部分のみ使用)
date_labels_train = dates[1:-42]
date_labels_test = dates[-42+n_rnn:-18]
# 予測結果と実測値のプロット
plt.plot(date_labels_test, y_1t[-42+n_rnn:-18,:], label='kansoku')
plt.plot(date_labels_test, predictions[:,-1,0].flatten(), label='Predictions')
#plt.plot(date_labels_test, y_15[-42:-18], label='keisan')
plt.title('True Values vs Predictions')
plt.legend()
plt.xticks(rotation=45) # 日付ラベルを回転して表示
plt.tight_layout()
plt.ylabel('(μgC/l)')
plt.show()
0