如何在 Tensorflow 中计算 R^2
How to Calculate R^2 in Tensorflow
我正在尝试在 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)))
你计算的“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))
其实rhs上应该是相反的。无法解释的方差除以总方差
我觉得应该是这样的:
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))
函数给出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。
所有其他解决方案都不会为多维 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 片段的结果与 sklearn 的结果完全匹配:
from sklearn.metrics import r2_score
R2 = r2_score(labels, predictions, multioutput='variance_weighted')
我强烈建议不要使用配方来计算!我发现的示例不会产生一致的结果,尤其是只有一个目标变量时。这让我很头疼!
正确的做法是使用tensorflow_addons.metrics.RQsquare()
. Tensorflow Add Ons is on PyPi here and the documentation is a part of Tensorflow here。您所要做的就是将 y_shape
设置为输出的形状,对于单个输出变量通常是 (1,)
。
我正在尝试在 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)))
你计算的“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))
其实rhs上应该是相反的。无法解释的方差除以总方差
我觉得应该是这样的:
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))
函数给出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。
所有其他解决方案都不会为多维 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 片段的结果与 sklearn 的结果完全匹配:
from sklearn.metrics import r2_score R2 = r2_score(labels, predictions, multioutput='variance_weighted')
我强烈建议不要使用配方来计算!我发现的示例不会产生一致的结果,尤其是只有一个目标变量时。这让我很头疼!
正确的做法是使用tensorflow_addons.metrics.RQsquare()
. Tensorflow Add Ons is on PyPi here and the documentation is a part of Tensorflow here。您所要做的就是将 y_shape
设置为输出的形状,对于单个输出变量通常是 (1,)
。