Нужна ли нормализация данных для Keras/LSTM сети?

Недавно начал изучать возможности LSTM сетей в Keras и не могу понять, нужна ли нормализация входных данных. Ниже интересующий меня скрипт: если подавать данные без обработки, то сеть работает хорошо (loss=0.0222); если использовать преобразование, то на выходе ахинея. Может быть я использую неправильный метод преобразования?

from numpy import array
from keras.models import Sequential
from keras.layers import LSTM, Dense
from sklearn.preprocessing import StandardScaler

#input data
X1 = np.array([1,2,3,4,5,6,7,8,9,10])
X2 = np.array([1000,2000,3000,4000,5000,6000,7000,8000,9000,10000])

#output data
Y=np.array([1001,2001,3001,4001,5001,6001,7001,8001,9001,10001])

X = np.column_stack((X1, X2))

#transformation
sc = StandardScaler()
X_fin = sc.fit_transform(X)

#merging
X_inp = array(X_fin).reshape(10, 1, 2)

#network model

model = Sequential()
model.add(LSTM(200, activation='relu', input_shape=(1,2)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
model.fit(X_inp, Y, epochs=2000,verbose=1)

Ответы (1 шт):

Автор решения: CrazyElf

Update: Похоже, основная проблема вообще в другом, чем я ниже написал. У вас целевая переменная не имеет нормальное распределение и это основная проблема. Если нормализовать Y, хотя бы вот так:

Y = sc.fit_transform(Y.reshape(-1,1))`

То гораздо лучше начинает сходиться и с нормализацией X и без неё.

Не забудьте только, что если будете делать предсказания этой моделью, то нужно будет делать для предсказанных значений обратное преобразование с помощью того же скейлера, натренированного на Y.


Первый принцип дата сайентиста: Know your data. Давайте посмотрим, что у вас на входе и на выходе без нормализации:

  X1    X2       Y
   1  1000    1001
   2  2000    2002
   3  3000    3003
   4  4000    4004
   5  5000 -> 5005
   6  6000    6006
   7  7000    7007
   8  8000    8008
   9  9000    9009
  10 10000   10010

Что тут должна сделать нейросеть, чтобы получить результат? Да сложить две переменных и всё.

А что у нас после нормализации на входе?

 X1          X2
-1.5666989  -1.5666989
-1.21854359 -1.21854359
-0.87038828 -0.87038828
-0.52223297 -0.52223297
-0.17407766 -0.17407766
 0.17407766  0.17407766
 0.52223297  0.52223297
 0.87038828  0.87038828
 1.21854359  1.21854359
 1.5666989   1.5666989

Хм, два абсолютно одинаковых столбца. Совершенно не похожие на целевую переменную. И как из них получить результат? Тут даже я бы задумался, а не то, что нейросеть. Результат получить сложнее и, похоже, ваша нейросеть имеет для этого не очень подходящую структуру.

P.S. Основополагающая для построения моделей Центральная предельная теорема требует нормального распределения только от целевой переменной. А факторы могут быть распределены как угодно, главное чтобы они хоть как-то были в принципе распределены. Нормализация факторов обычно требуется если мы используем какие-то уж совсем простые линейные модели, там просто "взорвутся градиенты" и прочие неприятности будут с большими значениями. Но современные хоть сколько-то сложные модели обычно уже не требуют нормализации факторов, они нормально справляются почти с любыми диапазонами значений.
А вот нормализация целевой переменной всё так же актуальна для любых регрессионных моделей.

→ Ссылка