如何在 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的主要内容,如果未能解决你的问题,请参考以下文章

R语言中也可以使用TensorFlow了 |神经网络案例

在 keras(tensorflow 后端)中计算梯度时出错

TensorFlow2深度学习实战(十七):目标检测算法 Faster R-CNN 实战

TensorFlow2深度学习实战(十七):目标检测算法 Faster R-CNN 实战

如何在 TensorFlow 中计算 CNN 的准确度

Tensorflow:如何替换或修改渐变?