Я пытаюсь предсказать данные об осадках для одной станции по входу 5 соседних станций, используя искусственную нейронную сеть в API Keras (тензорный поток). В качестве исходных данных я использовал данные за последние 3, 5, 10, 20 и 30 лет. Я пытаюсь найти архитектуру, которая хорошо работает все эти годы в качестве обучающего материала, поэтому я начал пробовать разные параметры и другую архитектуру.
Я масштабировал свои данные с помощью MinMaxScaler из sklearn. В целом моя сеть работает хорошо, но по какой-то причине, если я пробую разные годы в качестве входных данных для обучения, иногда сеть предсказывает все нули, и потери не уменьшаются. Также для некоторых комбинаций узлов в моих скрытых слоях сеть, похоже, не обучается.
Я преимущественно заметил проблему, возникающую при увеличении количества данных, которые я загружаю в модель для обучения.
Моя модель выглядит как это:
a_h = 'tanh'
loss = 'mean_squared_error'
node_1 = 5 # number of nodes for 1. hidden layer
NN_model = Sequential([
Dense(node_1, activation=a_h, input_shape=(X_train.shape[1], )),
Dense(1, activation='relu')])
opt = keras.optimizers.Adam(learning_rate=0.001)
NN_model.compile(optimizer=opt,
loss=loss, metrics=['accuracy'])
early_stop = EarlyStopping(monitor='loss', patience=2, verbose=1)
history = NN_model.fit(X_train_scaled, y_train_scaled, epochs=150, batch_size=1, verbose=2,
callbacks=[early_stop], shuffle=True)
y_train_pred_nn = NN_model.predict(X_train_scaled)
y_train_pred_nn = y_scaler.inverse_transform(y_train_pred_nn.reshape(-1, 1)) # rescale data to original raw data format
y_pred_nn = NN_model.predict(X_pred_scaled, verbose=1)
y_pred_nn = y_scaler.inverse_transform(y_pred_nn.reshape(-1, 1))
если я использую 5 лет в качестве входных данных для обучения, модель работает нормально:
Epoch 1/150
180/180 - 0s - loss: 0.0446 - accuracy: 0.5167
Epoch 2/150
180/180 - 0s - loss: 0.0283 - accuracy: 0.5167
Epoch 3/150
180/180 - 0s - loss: 0.0173 - accuracy: 0.5167
Epoch 4/150
180/180 - 0s - loss: 0.0143 - accuracy: 0.5222
Epoch 5/150
180/180 - 0s - loss: 0.0135 - accuracy: 0.5222
Epoch 6/150
180/180 - 0s - loss: 0.0128 - accuracy: 0.5222
Epoch 7/150
180/180 - 0s - loss: 0.0125 - accuracy: 0.5222
Epoch 8/150
180/180 - 0s - loss: 0.0122 - accuracy: 0.5222
Epoch 9/150
180/180 - 0s - loss: 0.0115 - accuracy: 0.5222
Epoch 10/150
180/180 - 0s - loss: 0.0115 - accuracy: 0.5222
Epoch 11/150
180/180 - 0s - loss: 0.0108 - accuracy: 0.5222
Epoch 12/150
180/180 - 0s - loss: 0.0110 - accuracy: 0.5222
Epoch 13/150
180/180 - 0s - loss: 0.0103 - accuracy: 0.5222
Epoch 14/150
180/180 - 0s - loss: 0.0103 - accuracy: 0.5222
Epoch 15/150
180/180 - 0s - loss: 0.0098 - accuracy: 0.5222
Epoch 16/150
180/180 - 0s - loss: 0.0096 - accuracy: 0.5222
Epoch 17/150
180/180 - 0s - loss: 0.0094 - accuracy: 0.5222
Epoch 18/150
180/180 - 0s - loss: 0.0094 - accuracy: 0.5222
Epoch 19/150
180/180 - 0s - loss: 0.0090 - accuracy: 0.5222
Epoch 20/150
180/180 - 0s - loss: 0.0086 - accuracy: 0.5222
Epoch 21/150
180/180 - 0s - loss: 0.0084 - accuracy: 0.5222
Epoch 22/150
180/180 - 0s - loss: 0.0086 - accuracy: 0.5222
Epoch 23/150
180/180 - 0s - loss: 0.0082 - accuracy: 0.5222
Epoch 24/150
180/180 - 0s - loss: 0.0081 - accuracy: 0.5222
Epoch 25/150
180/180 - 0s - loss: 0.0080 - accuracy: 0.5222
Epoch 26/150
180/180 - 0s - loss: 0.0078 - accuracy: 0.5222
Epoch 27/150
180/180 - 0s - loss: 0.0076 - accuracy: 0.5222
Epoch 28/150
180/180 - 0s - loss: 0.0077 - accuracy: 0.5222
Epoch 29/150
180/180 - 0s - loss: 0.0072 - accuracy: 0.5222
Epoch 30/150
180/180 - 0s - loss: 0.0076 - accuracy: 0.5222
Epoch 31/150
180/180 - 0s - loss: 0.0074 - accuracy: 0.5222
Epoch 00031: early stopping
1/1 [==============================] - 0s 0s/step
Mean Squared Error: 0.43
Mean Absolute Error: 0.31
Root Mean Squared Error: 0.65
The R2 score on the Train set is: 0.812
The R2 score on the Test set is: 0.793
Но как только я использую 10 или 20 лет в качестве входных данных для обучения, я получите это:
Epoch 1/150
630/630 - 0s - loss: 0.0165 - accuracy: 0.5095
Epoch 2/150
630/630 - 0s - loss: 0.0165 - accuracy: 0.5095
Epoch 3/150
630/630 - 0s - loss: 0.0165 - accuracy: 0.5095
Epoch 00003: early stopping
1/1 [==============================] - 0s 0s/step
Mean Squared Error: 2.41
Mean Absolute Error: 0.59
Root Mean Squared Error: 1.55
The R2 score on the Train set is: -0.267
The R2 score on the Test set is: -0.169
Я пробовал много разных вещей; изменив скорость обучения, тип оптимизатора, функцию активации, я проверил, правильно ли масштабированы входные данные, увеличило терпение для ранней остановки и т. д. Все дали мне тот же результат.
Использование 30 лет в качестве ввода снова работает нормально. И то же самое произойдет, если я потрачу 5 лет на обучение с разными комбинациями скрытых слоев и количества узлов.
В чем может быть моя ошибка? почему модель больше не может учиться, когда я изменяю количество обучающих данных или количество моих узлов в скрытом слое?