所以我不知道我的代码中是否存在错误或问题,但我正在尝试了解发生了什么。 当我运行模型并使用平均相对误差估计精度时。我知道在我的验证数据中我有0,所以我期待得到一些错误或一些inf。然而,这种情况并非如此。 这是我的代码:
X_test_norm = preprocessing.scale(X_test)
predictions = sess.run(pred, feed_dict={x: X_test_norm})
prediction = tf.convert_to_tensor(predictions)
expectation = tf.cast(Y_test, tf.float32)
MANUAL_MRE = tf.reduce_mean(tf.abs((Y_test - tf.transpose(predictions)) / Y_test))
MAE_op, MAE = tf.metrics.mean_absolute_error(expectation, prediction)
MRE_op, MRE = tf.metrics.mean_relative_error(expectation, prediction, expectation)
tf.local_variables_initializer().run()
print("MANUAL_MRE: %4f" % sess.run(MANUAL_MRE))
print("MRE: %4f" % sess.run(MRE))
print("MAE: %4f" % sess.run(MAE))
这是输出:
MANUAL_MRE: inf
MRE: 1.603528
MAE: 76.489990
当我在值大于0的数据上运行时,我的MANUAL_MRE
和MRE值应该是相同的。我检查了TF的文档,第一个案例没有意义。
有人可以告诉我哪里错了,或者我发现了一个错误/新功能。
答案 0 :(得分:0)
我想我知道发生了什么,因为MRE是每个平均相对误差的平均值,因此我认为tf.metrics.mean_relative_error
只是添加了类似于完全与预测不匹配的值。我相信这就是为什么当我用数据集计算MRE时我知道它具有负值,因为标签给了我如此高的MRE值。
你可以从下面的代码中了解更好的原因:
MANUAL_MRE = tf.reduce_mean(tf.abs((Y_test + 100) - (tf.transpose(predictions) + 100)) / (Y_test + 100))
MANUAL_TF_MRE = tf.reduce_mean(tf.divide(tf.abs(Y_test - tf.transpose(predictions)), Y_test))
MRE_op, MRE = tf.metrics.mean_relative_error(exp, predTF, exp)
tf.initialize_local_variables().run()
print("MANUAL_TF_MRE: %4f" % sess.run(MANUAL_TF_MRE))
print("MANUAL_MRE: %4f" % sess.run(MANUAL_MRE))
print("MRE: %4f" % sess.run(MRE))
MANUAL_TF_MRE: inf
MANUAL_MRE: 0.084013
MRE: 4.255613