【问题标题】:MSE, is it correct to use evaluate with unscaled data in Tensorflow Keras?MSE,在 Tensorflow Keras 中对未缩放的数据使用评估是否正确?
【发布时间】:2021-02-23 19:34:21
【问题描述】:

假设您有数字时间序列数据,并且您设法将其拆分为:

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,我们可以使用缩放的测试数据并通过 2 种“不同”的方式计算它:

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() 没有考虑到这一点,并且正在做一些我不知道的事情,所以它不会返回正确的数字?

【问题讨论】:

    标签: python tensorflow keras mse


    【解决方案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 
    

    【讨论】:

      猜你喜欢
      • 2019-07-29
      • 1970-01-01
      • 2018-08-01
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 2021-01-17
      • 2018-02-18
      相关资源
      最近更新 更多