sklearn.metrics.r2_score计算结果异常及与Excel rsq、皮尔逊相关系数平方差异的技术咨询
sklearn.metrics.r2_score计算结果异常及与Excel rsq、皮尔逊相关系数平方差异的技术咨询
嘿,我来帮你理清楚这些问题,你遇到的情况其实是因为混淆了不同统计量的定义和适用场景,咱们一步步拆解:
1. 为什么交换y_true和y_pred结果不同,还出现了负数?
首先得明确sklearn.metrics.r2_score计算的是决定系数R²,它的公式是:
R² = 1 - (sum((y_true - y_pred)²) / sum((y_true - mean(y_true))²))
这里的分母是真实值围绕自身均值的波动平方和(SS_tot),分子是预测值和真实值的残差平方和(SS_res)。
- 当你交换y_true和y_pred的位置,分母会变成预测值围绕自身均值的波动平方和,分子则变成真实值和预测值的残差平方和(虽然残差的绝对值和原来一样,但分母变了),所以结果肯定不同。
- 至于负数结果,这是完全合理的:当你的预测效果比「直接用真实值的均值来预测」还要差时,SS_res会大于SS_tot,1减去一个大于1的数,结果就会是负数。这其实是在告诉你,这个预测模型的表现还不如最朴素的基准模型(直接输出均值)。
2. 为什么和Excel的RSQ结果不一样?
你提到Excel的rsq给出0.002,这是因为Excel的RSQ函数本质上计算的是皮尔逊相关系数的平方,而不是sklearn里的决定系数R²。这是两个完全不同的统计量:
- 决定系数R²是用来衡量模型对真实值变异的解释能力,必须基于「真实值+模型预测值」的配对;
- 皮尔逊相关系数的平方(也就是Excel RSQ)是衡量两个变量之间的线性相关程度,不管这两个变量是不是真实值和预测值的关系。
3. 为什么和皮尔逊相关系数平方不同?
你引用的那句话没错,但它有个关键前提:只有当y_pred是通过简单线性回归(最小二乘法)对y_true拟合得到的最优预测值时,决定系数R²才会等于皮尔逊相关系数的平方。
而你这里的y_pred是随便给定的一组数值,并不是通过拟合得到的最优结果,自然不满足这个前提,所以两者结果不同。
解决方法
如果你想要得到和Excel RSQ一致的结果,直接计算皮尔逊相关系数的平方即可,比如用scipy实现:
from scipy.stats import pearsonr y_true = [2,4,3,34,23] y_pred = [21,12,3,11,17] corr, _ = pearsonr(y_true, y_pred) rsq_like_excel = corr ** 2 # 结果就是你要的~0.002
如果你确实需要使用sklearn的决定系数R²,那要注意:必须保证y_true是真实观测值,y_pred是模型的预测输出,不要交换两者顺序;负数结果是合理的,说明你的预测效果不如直接用均值预测的基准线。
备注:内容来源于stack exchange,提问作者Yang Yang
相关产品推荐
相关产品推荐

