如何在 Tensorflow 中计算 R^2
Posted
技术标签:
【中文标题】如何在 Tensorflow 中计算 R^2【英文标题】:How to Calculate R^2 in Tensorflow 【发布时间】:2017-07-10 02:57:26 【问题描述】:我正在尝试在 Tensorflow 中进行回归。我不确定我是否正确计算了 R^2,因为 Tensorflow 给我的答案与sklearn.metrics.r2_score
不同,有人可以看看我下面的代码,如果我正确地实现了图示的方程,请告诉我。谢谢
total_error = tf.square(tf.sub(y, tf.reduce_mean(y)))
unexplained_error = tf.square(tf.sub(y, prediction))
R_squared = tf.reduce_mean(tf.sub(tf.div(unexplained_error, total_error), 1.0))
R = tf.mul(tf.sign(R_squared),tf.sqrt(tf.abs(R_squared)))
【问题讨论】:
【参考方案1】:你正在计算的“R^2”是
与给定的表达式相比,您在错误的位置计算平均值。在进行除法之前,您应该在计算误差时取平均值。
unexplained_error = tf.reduce_sum(tf.square(tf.sub(y, prediction)))
total_error = tf.reduce_sum(tf.square(tf.sub(y, tf.reduce_mean(y))))
R_squared = tf.sub(1, tf.div(unexplained_error, total_error))
【讨论】:
在第三行的tf.div中,你的unexplained_error和total_error位置不对,需要切换一下。 在你的公式中,(yi - mu) 应该是平方的。它反映在代码中,但它可能会意外地混淆某些人(比如我)。【参考方案2】:函数给出here:
def R_squared(y, y_pred):
residual = tf.reduce_sum(tf.square(tf.subtract(y, y_pred)))
total = tf.reduce_sum(tf.square(tf.subtract(y, tf.reduce_mean(y))))
r2 = tf.subtract(1.0, tf.div(residual, total))
return r2
概念解释here。
【讨论】:
【参考方案3】:我强烈建议不要使用配方来计算这个!我发现的例子并没有产生一致的结果,尤其是只有一个目标变量。这让我非常头疼!
正确的做法是使用tensorflow_addons.metrics.RQsquare()
。 Tensorflow Add Ons 是 on PyPi here,文档是 part of Tensorflow here。您所要做的就是将y_shape
设置为输出的形状,通常是(1,)
用于单个输出变量。
【讨论】:
我同意使用插件。对于使用 Colab 的任何人,您需要在导入之前安装插件,因为默认情况下它们不包括在内:!pip install tensorflow_addons
后跟导入列表 import tensorflow_addons as tfa
【参考方案4】:
所有其他解决方案都不会为多维 y 生成正确的 R 平方分数。在TensorFlow中计算R2(方差加权)的正确方法是:
unexplained_error = tf.reduce_sum(tf.square(labels - predictions)) total_error = tf.reduce_sum(tf.square(labels - tf.reduce_mean(labels, axis=0))) R2 = 1. - tf.div(unexplained_error, total_error)这个 TF sn-p 的结果与 sklearn 的结果完全匹配:
从 sklearn.metrics 导入 r2_score R2 = r2_score(标签,预测,多输出='variance_weighted')【讨论】:
【参考方案5】:它实际上应该是相反的。无法解释的方差除以总方差
【讨论】:
您能否添加代码以帮助获得完整的答案?【参考方案6】:我觉得应该是这样的:
total_error = tf.reduce_sum(tf.square(tf.sub(y, tf.reduce_mean(y))))
unexplained_error = tf.reduce_sum(tf.square(tf.sub(y, prediction)))
R_squared = tf.sub(1, tf.div(unexplained_error, total_error))
【讨论】:
以上是关于如何在 Tensorflow 中计算 R^2的主要内容,如果未能解决你的问题,请参考以下文章
在 keras(tensorflow 后端)中计算梯度时出错
TensorFlow2深度学习实战(十七):目标检测算法 Faster R-CNN 实战