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

手动计算与调用函数得到的explained_variance_score结果为何不同?

为何手动计算与sklearn的解释方差得分(EVS)结果不一致?

核心结论

sklearn计算结果为1是正确的,你的手动计算错误源于对残差方差的定义理解偏差。

原因分析

给定数据集:

  • y_true = [1, 2, 3, 4, 5]
  • y_pred = [6, 7, 8, 9, 10]

可以发现y_pred是y_true的线性平移(y_pred = y_true + 5),因此残差y_true - y_pred = [-5, -5, -5, -5, -5]是一个常数数组。

根据解释方差得分的公式:

EVS = 1 - Var(y_true - y_pred) / Var(y_true)
  1. 残差的方差计算:
    方差的定义是每个数据点与均值的差的平方的平均值。对于常数数组,所有数据点等于均值(残差均值为-5),因此每个数据点与均值的差为0,残差的方差为0。

  2. 代入公式:
    无论Var(y_true)取总体方差(2)还是样本方差(2.5),0 / Var(y_true)的结果都是0,因此EVS = 1 - 0 = 1,与sklearn的计算结果一致。

你的手动计算错误点

你得到-11.5是因为错误地将残差的平方均值(((-5)^2 * 5)/5 = 25)当作了残差的方差,而没有按照方差定义减去残差的均值。正确的残差方差应为0,而非25。

验证代码

from sklearn.metrics import explained_variance_score
import numpy as np

y_true = [1, 2, 3, 4, 5]
y_pred = [6, 7, 8, 9, 10]

# sklearn计算结果
evs_sklearn = explained_variance_score(y_true, y_pred)
print(f"sklearn计算的EVS: {evs_sklearn}")

# 手动正确计算
residuals = np.array(y_true) - np.array(y_pred)
var_residuals = np.var(residuals, ddof=0)  # 总体方差
var_y_true = np.var(y_true, ddof=0)
evs_manual = 1 - var_residuals / var_y_true
print(f"手动正确计算的EVS: {evs_manual}")

运行结果会输出两个1,验证了结论的正确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:07:39