scikit-learn中r2_score的variance_weighted参数计算逻辑咨询
scikit-learn r2_score中
variance_weighted选项的计算逻辑 首先明确:variance_weighted的加权逻辑里,权重是每个输出维度真实标签(y_true)的方差,和预测值(y_pred)无关,最终得分是各维度单独计算的R²值,以对应维度y_true的方差为权重的加权平均值。
针对你给出的例子:
y_true = [[0.5, 1], [-1, 1], [7, -6]] y_pred = [[0, 2], [-1, 2], [8, -5]]
这里有两个独立输出维度:
- 第一个维度的真实标签是
[0.5, -1, 7],它的方差才是该维度的权重计算依据,不是你说的[0.5, 1, 0, 2](这个是把真实值和预测值混在一起了,完全错误) - 第二个维度的真实标签是
[1, 1, -6],它的方差是第二个维度的权重
手动验证步骤(近似值):
- 计算各维度单独的R²
- 第一个维度:
残差平方和(SS_res)= (0.5-0)² + (-1+1)² + (7-8)² = 0.25 + 0 + 1 = 1.25
总平方和(SS_tot)= (0.5-2.1667)² + (-1-2.1667)² + (7-2.1667)² ≈ 36.1667
R²₁ = 1 - 1.25/36.1667 ≈ 0.9654 - 第二个维度:
残差平方和(SS_res)= (1-2)² + (1-2)² + (-6+5)² = 1 + 1 + 1 = 3
总平方和(SS_tot)= (1+1.3333)² + (1+1.3333)² + (-6+1.3333)² ≈ 32.6666
R²₂ = 1 - 3/32.6666 ≈ 0.9081
- 第一个维度:
- 计算各维度y_true的方差
- 第一个维度方差 = SS_tot/(n-1) = 36.1667/(3-1) = 18.0833
- 第二个维度方差 = 32.6666/(3-1) = 16.3333
- 加权平均得到最终得分
最终得分 = (0.9654×18.0833 + 0.9081×16.3333) / (18.0833+16.3333) ≈ 0.9382
你直接调用r2_score(y_true, y_pred, multioutput='variance_weighted')得到的结果会和这个近似值一致。
内容的提问来源于stack exchange,提问作者LearningAlgorithm
相关产品推荐
相关产品推荐

