在Python中计算决定系数

3 投票
4 回答
5340 浏览
提问于 2025-04-16 02:38

我正在尝试在Python中计算决定系数(R^2),但在某些情况下得到的是负值。这是不是说明我的计算有错误?我原以为R^2应该在0到1之间。

这是我用来进行计算的Python代码,直接从维基百科的文章中改编过来的:

>>> yi_list = [1, 1, 63, 63, 5, 5, 124, 124]
>>> fi_list = [1.7438055421354988, 2.3153069186947639, 1002.7093097555808, 63.097699219524706, 6.2635465467410842, 7.2275532522971364, 17.55393551900103, 40.8570]
>>> y_mean = sum(yi_list)/float(len(yi_list))
>>> ss_tot = sum((yi-y_mean)**2 for yi in yi_list)
>>> ss_err = sum((yi-fi)**2 for yi,fi in zip(yi_list,fi_list))
>>> r2 = 1 - (ss_err/ss_tot)
>>> r2
-43.802085810924964

4 个回答

1

看了这篇文章,我觉得根据输入的数据,这种情况是可以理解的。在引言中提到:

在一些重要的情况下,R2的计算定义可能会得到负值,这取决于使用的定义。这种情况发生在比较的预测结果并不是通过使用这些数据的模型拟合程序得出的。

我在公式中没有看到任何东西能说明它的值一定会在0到1之间。

3

这里有一个用Python编写的函数,用来计算决定系数:

import numpy as np

def rSquare(estimations, measureds):
    """ Compute the coefficient of determination of random data. 
    This metric gives the level of confidence about the model used to model data"""
    SEE =  ((np.array(measureds) - np.array(estimations))**2).sum()
    mMean = (np.array(measureds)).sum() / float(len(measureds))
    dErr = ((mMean - measureds)**2).sum()
    
    return 1 - (SEE / dErr)
4

你在维基百科上展示的计算方法看起来没问题。

根据维基百科的内容:

R2的值如果在0到1以外,可能是因为它用来衡量实际值和模型值之间的吻合度,而这些“模型值”并不是通过线性回归得到的,具体还要看使用了哪种R2的计算方式。

从你的数据来看,63和1002.7093097555808这对预期和模型值,可能是导致大差异的主要原因。

撰写回答