python - scikit-learn 和 scipy 库之间的确定系数不同。为什么?
问题描述
我有一个来自论文的数据集,我很难验证他们报告的决定系数 R 平方。我使用了 sklearn 和 scipy 库,我得到了不同的答案。为什么?哪个更可靠?ps 当我使用 Excel 作为另一种选择时,我得到了与 scipy 相同的答案。
下面是我用来比较 SKlearn 和 Scipy 的结果的代码:
import pandas as pd
from scipy import stats
from sklearn.metrics import r2_score
data = pd.read_csv("output.csv", header=None)
y_measured = data.iloc[0, :].values
y_predicted = data.iloc[1, :].values
print(r2_score(y_measured, y_predicted)) # prints 0.708717556205
slope, intercept, r_value, p_value, std_err = stats.linregress(y_measured, y_predicted)
print(r_value**2) # prints 0.731889173485
解决方案
r2_score
根据给定的y值和线性回归线预测的 y 值计算其值,而不是根据给定的x和y值。
这是一个例子。一、进口:
In [59]: import numpy as np
In [60]: from scipy import stats
In [61]: from sklearn.metrics import r2_score
一些需要处理的数据:
In [62]: x = np.array([0, 1, 2, 3, 5, 8, 13])
In [63]: y = np.array([1.2, 1.4, 1.6, 1.7, 2.0, 4.1, 6.6])
使用 进行线性回归scipy.stats.linregress
,并检查r 2:
In [64]: slope, intercept, rvalue, pvalue, stderr = stats.linregress(x, y)
In [65]: rvalue**2
Out[65]: 0.9485915175891462
对于给定的x
值,计算y
回归线预测的值:
In [66]: ypred = slope*x + intercept
再次计算r 2,使用r2_score
:
In [67]: r2_score(y, ypred)
Out[67]: 0.9485915175891464
正如预期的那样,我们得到了相同的值。
我们也可以用 来计算这个值scipy.stats.pearsonr
:
In [68]: pearson_r, pearson_p = stats.pearsonr(x, y)
In [69]: pearson_r**2
Out[69]: 0.9485915175891464
推荐阅读
- google-cloud-platform - Removing allUsers default acl on Google Cloud Storage (GCS)
- ubuntu-18.04 - Ubuntu 18.04 上的黄色显示
- regex - Search and replace with Notepad++ keeping after defined string
- laravel - 使用 API 调用登录 Laravel 用户以进行 Web 应用程序
- wordpress - 将搜索结果页面更改为自定义帖子类型的单页
- c# - 如何在鼠标单击 ogameobject 时禁用/启用 LineRenderer?
- java - How to calculate the sum of total items
- laravel-5.6 - Change the icon for incoming notification in Laravel
- c# - C# 数组如何处理内存?
- unix - 将文件名添加到计数数据