У меня есть вопрос относительно того, как нормализовать и особенно о том, как денормализовать нейронные сети с несколькими входами и только одним выходом.
Нужно ли нормализовать входные переменные независимо друг от друга, а затем просто использовать шкалу переменной, которую я также хочу, в качестве выходного сигнала для изменения масштаба моих данных.
Например: у меня есть входные переменные a и b.
имеет шкалу 100-1000
b имеет шкалу 1-10
После нормализации обе переменные имеют шкалу 0-1.
Мои выходные данные теперь должны быть прогнозом на завтра a (a при t + 1) и, следовательно, снова иметь шкалу 100-1000 .
Поэтому я буду просто денормализовать в соответствии с тем, как я нормализовал a (нормализацию по обратному a? Или мне нужно рассмотреть что-то еще?
Для нормализации обеих переменных мой код выглядит следующим образом:
from pandas import Series
from sklearn.preprocessing import MinMaxScaler
series1 = Series(df["a"])
series2 = Series(df["b"])
values1 = series1.values
values1 = values1.reshape((len(values1), 1))
values2 = series2.values
values2 = values2.reshape((len(values2), 1))
scaler1 = MinMaxScaler(feature_range=(0, 1))
scaler1 = scaler1.fit(values1)
scaler2 = MinMaxScaler(feature_range=(0, 1))
scaler2 = scaler2.fit(values2)
normalized1 = scaler1.transform(values1)
df["Normalized_a"] = normalized1
normalized2 = scaler2.transform(values2)
df["Normalized_b"] = normalized2
closesnorm1 = df["Normalized_a"]
closesnorm2 = df["Normalized_b"]
### Combine two variables into one NumPy array
normalizeddata = df[["Normalized_a","Normalized_b"]].values
Затем я разделил данные:
### Split the data
X_train = []
y_train = []
for i in range (3, len(normalizeddata) - 3):
y_train.append(normalizeddata[i,0])
X_train.append(np.array((normalizeddata[i+1:i+4][::-1])))
X_train = np.array(X_train).reshape(-1,3,2)
y_train = np.array(y_train)
X_test = []
y_test = []
for i in range (0,3):
y_test.append(normalizeddata[i,0])
X_test.append(np.array((normalizeddata[i+1:i+4][::-1])))
X_test = np.array(X_test).reshape(-1,3,2)
y_test = np.array(y_test)
Сама модель выглядит следующим образом с учетом двух переменных (см. Форму ввода массива NumPy):
model = Sequential()
model.add(LSTM(100,activation="relu", input_shape = (3, 2), return_sequences = True))
model.add(Dropout(0.2))
model.add(LSTM(100,activation="relu", return_sequences = False))
model.add(Dropout(0.2))
model.add(LSTM(1,activation ="relu"))
model.compile(optimizer="adam", loss="mse")
model.fit(X_train, y_train, batch_size = 2, epochs = 10)
И последнее, но не менее важное: я денормализовал вывод, используя Scaler1:
### Predicting y_test data
y_pred = model.predict(X_test)
y_pred = y_pred.reshape(-1)
df_pred = df[:3]
df_pred["a_predicted"] = scaler1.inverse_transform(y_pred.reshape(-1, 1))
Большое спасибо!