You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法复现torcheval.metrics.r2_score总平方和计算,求差异解释

手动计算R²与torcheval.metrics.R2Score结果不一致的原因

核心结论:两种TSS计算方式在数学上是等价的,数值不匹配源于张量维度处理或对torcheval公式的误解。

数学等价性验证

手动计算的TSS公式:

ss_total = torch.sum((var1 - torch.mean(var1)) ** 2)

torcheval的TSS计算公式:

tss = sum_squared_obs - torch.square(sum_obs) / num_obs

其中sum_squared_obs = torch.sum(var1 ** 2),sum_obs = torch.sum(var1),num_obs = len(var1)。

通过代数推导可证明两者完全等价:

sum((x - μ)²) = sum(x²) - 2μsum(x) + Nμ²
= sum(x²) - 2*(sumx/N)*sumx + N*(sumx/N)²
= sum(x²) - (sumx²)/N
= sum_squared_obs - (sum_obs)²/num_obs

你的数值差异分析

从你提供的输出看:

  • 手动计算的ss_total=3.7081,但按torcheval的sum_squared_obs=22.2245、sum_obs=-29.9617、num_obs=64计算,TSS应为:
    22.2245 - (897.7044)/64 ≈ 8.1979
    
  • 两者的ss_residual一致(均为8.9471),说明var1和var2的取值是相同的,差异出在TSS的计算维度上。

可能的原因

  1. 多维张量的维度处理差异
    如果var1是多维张量(比如形状为(64, k),k为特征数):

    • torcheval的R2Score默认(multioutput='uniform_average')会对每个特征单独计算TSS和R²,再取平均值;
    • 你的手动计算是对所有元素计算全局均值和TSS,导致结果完全不同。
      解决:手动计算时按特征维度拆分计算,或设置R2Score(multioutput='raw_values')查看每个特征的R²结果。
  2. 对torcheval公式的误解
    你贴出的官方文档中sum_squared_obs = torch.sum((actual - torch.mean(actual)) ** 2)是错误的,实际torcheval中sum_squared_obs是torch.sum(actual ** 2)。如果按照错误的文档实现torcheval的公式,会导致TSS计算错误。

验证方法

检查var1的形状:

print(var1.shape)

如果是多维,尝试手动按特征维度计算R²再平均:

ss_total_per_feature = torch.sum((var1 - torch.mean(var1, dim=0)) ** 2, dim=0)
ss_residual_per_feature = torch.sum((var1 - var2) ** 2, dim=0)
r2_per_feature = 1 - (ss_residual_per_feature / ss_total_per_feature)
r2_manual_average = torch.mean(r2_per_feature)

这个结果应该和torcheval的输出一致。

内容的提问来源于stack exchange,提问作者Sergio Solorzano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 00:20:54