手动计算与调用函数得到的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)
残差的方差计算:
方差的定义是每个数据点与均值的差的平方的平均值。对于常数数组,所有数据点等于均值(残差均值为-5),因此每个数据点与均值的差为0,残差的方差为0。代入公式:
无论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
相关产品推荐
相关产品推荐

