Предположим, у вас есть числовые данные временных рядов, и вам удалось разделить их следующим образом:
X_train, y_train, X_val, y_val, X_test, y_test.
и вы правильно масштабировали все, что в итоге получилось:
X_train_scaled, y_train_scaled, X_val_scaled, y_val_scaled, X_test_scaled, y_test_scaled
И теперь вы запускаете следующий код:
linear = Sequential([
Dense(units=1,activation='linear',input_shape=[X_train_scaled.shape[1])
])
linear.compile(loss='mse',optimizer='adam')
history = linear.fit(X_train_scaled, y_train_scaled,
epochs=50, verbose=1, shuffle=False,
validation_data=(X_valid_scaled.values,y_valid_scaled.values))
Если наша идея состоит в том, чтобы рассчитать MSE, мы можем использовать масштабированные тестовые данные и рассчитать его двумя разными способами:
mse_linear_scaled_1 = linear.evaluate(X_test_scaled,y_test_scaled)
или используя автономную версию из https://www.tensorflow.org/api_docs/python/tf/keras/losses/MeanSquaredError
mse = keras.losses.MeanSquaredError()
mse_linear_scaled_2 = mse(y_test_scaled.values,y_pred_scaled).numpy()
если вы выполните это упражнение, mse_linear_scaled_1 = mse_linear_scaled_2 (как и ожидалось).
А теперь вопрос (спасибо, если вы дочитали до этого места ...). Если вы выполните ту же последнюю часть, но с исходным масштабом тестовых данных (последняя идея - получить значение RMSE, чтобы оно было в контексте реальных данных) результаты сильно отличаются друг от друга.
mse_linear_unscaled_1 = linear.evaluate(X_test,y_test)
дает совсем другое число, чем выполнение
mse_linear_unscaled_2 = mse(y_test,y_pred).numpy()
Если я хочу получить правильное число RMSE в масштабе исходных чисел временного ряда, могу ли я предположить, что это должен быть правильный способ сделать это?
np.sqrt(mse_linear_unscaled_2)
Может быть .evaluate()
об этом не думал и делает что-то под капотом, о чем я не знаю, поэтому он не вернет правильный номер?