MSE, правильно ли использовать оценку с немасштабированными данными в Tensorflow Keras?

Предположим, у вас есть числовые данные временных рядов, и вам удалось разделить их следующим образом:

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() об этом не думал и делает что-то под капотом, о чем я не знаю, поэтому он не вернет правильный номер?


person Gabriel    schedule 11.11.2020    source источник


Ответы (1)


Когда вы делаете linear.evaluate(,), вы используете модель linear, которая уже была оснащена масштабированными данными. Таким образом, оценка с использованием немасштабированных данных похожа на введение диапазона данных, которые эта конкретная модель не видит.

Путь в псевдокоде:

y_pred_scaled = linear.predict(y_test_scaled) 
inverse_transform y_pred_scaled with your scaler 
mse in original scale comparing y_test to y_pred 
person Mariana Costa    schedule 28.04.2021