我正在尝试在 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))
我强烈建议不要使用食谱来计算这个!我发现的示例并不能产生一致的结果,尤其是只有一个目标变量时。这让我非常头疼!
tf.keras.metrics.R2Score
。 Tensorflow 附加组件位于 PyPi ,文档是 Tensorflow 的一部分。您所要做的就是将 y_shape
设置为输出的形状,通常对于单个输出变量来说是 (1,)
。
此外...我完全推荐使用 R 平方。它不应该与深度网络一起使用。
R2 倾向于乐观地估计线性回归的拟合度。它总是随着模型中包含的效应数量而增加。调整后的 R2 试图纠正这种高估。如果特定效果不能改善模型,则调整后的 R2 可能会降低。
所有其他解决方案都不会为多维 y 生成正确的 R 平方分数。在 TensorFlow 中计算 R2(方差加权)的正确方法是:
unexplained_error = tf.reduce_sum(tf.square(标签 - 预测)) Total_error = tf.reduce_sum(tf.square(labels - tf.reduce_mean(labels, axis=0))) R2 = 1。- tf.div(无法解释的错误,总错误)
此 TF 片段的结果与 sklearn 的结果完全匹配:
从 sklearn.metrics 导入 r2_score R2 = r2_score(标签、预测、多输出='variance_weighted')
实际上应该与右侧相反。无法解释的方差除以总方差
我觉得应该是这样的:
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))