python – `scikit-learn`的`r2_score`和R ^ 2计算之间的显着不
题
为什么 上下文 我正在使用Python 3.5来预测线性和二次模型,而我正在尝试的适合度的衡量标准之一是.但是,在测试时,scikit-learn中的r2_score指标与维基百科中提供的计算之间存在显着差异. 码 我在这里提供我的代码作为参考,它计算上面链接的维基百科页面中的示例. from sklearn.metrics import r2_score import numpy y = [1,2,3,4,5] f = [1.9,3.7,5.8,8.0,9.6] # Convert to numpy array and ensure double precision to avoid single precision errors observed = numpy.array(y,dtype=numpy.float64) predicted = numpy.array(f,dtype=numpy.float64) scipy_value = r2_score(observed,predicted) >>> scipy_value: 很明显,scipy计算值为-3.8699999999999992,而维基百科中的参考值为0.998. 谢谢! 更新:这与this question about how R^2 is calculated in scikit-learn的不同之处在于我正在努力理解并澄清两种结果之间的差异.这个问题表明scikit中使用的公式与维基百科的公式相同,不应该导致不同的值. 更新#2:事实证明我在阅读维基百科文章的例子时犯了一个错误.下面的答案和评论提到我提供的示例是针对示例中(x,y)值的线性,最小二乘拟合.为此,维基百科的文章中的答案是正确的.为此,提供的R ^ 2 calue为0.998.对于两个向量之间的R ^ 2,scikit的答案也是正确的.非常感谢你的帮助! 解决方法
引用的问题是正确的 – 如果您通过计算剩余的平方和和总平方和,则得到与sklearn相同的值:
In [85]: import numpy as np In [86]: y = [1,5] In [87]: f = [1.9,9.6] In [88]: SSres = sum(map(lambda x: (x[0]-x[1])**2,zip(y,f))) In [89]: SStot = sum([(x-np.mean(y))**2 for x in y]) In [90]: SSres,SStot Out[90]: (48.699999999999996,10.0) In [91]: 1-(SSres/SStot) Out[91]: -3.8699999999999992 负值背后的想法是,如果你每次只预测平均值(这对应于r2 = 0),你就更接近实际值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |