【问题标题】:Scikit-learn R2 always zeroScikit-learn R2 始终为零
【发布时间】:2016-09-23 16:15:46
【问题描述】:

我正在尝试使用简单的 R^2 分数测试我的 Scikit-learn 机器学习算法,但由于某种原因它总是返回零。

import numpy
from sklearn.metrics import r2_score

prediction  = numpy.array([0.1567,  4.7528,  1.1260,  0.2294]).reshape(1, -1)
training    = numpy.array([0, 3, 1, 0]).reshape(1, -1)

r2          = r2_score(training, prediction, multioutput="raw_values")
print r2
[ 0.  0.  0.  0.]

这是一个由四部分组成的单个值,而不是四个单独的值。如何获得正确的 R^2 分数?

【问题讨论】:

  • 现在您正在为数组中的每个 pair 值计算 r2。从每个 numpy 数组中删除 .reshape 方法,r2_score 函数将为两个数组返回单个 r2 值
  • 我有.reshape(),因为这就是.fit().predict() 函数使用和返回数组的方式。 r2_score() 是否因某种原因而不同?

标签: scikit-learn regression


【解决方案1】:

如果你想计算两个向量之间的 r2 值,你应该只传递两个一维数组。见documentation

在您提供的示例中,第一项与第一项进行比较,但请注意,您在预测和训练中只有一个列表,因此它计算 R2 为 0.1567 到 0,即 0,然后计算它为 4.7528 到 3 这也是 0 等等......听起来你想要两个向量的 R2,如下所示:

prediction = numpy.array([0.1567,  4.7528,  1.1260,  0.2294])
training = numpy.array([0, 3, 1, 0])

print(r2_score(training, prediction))
0.472439485

如果您有多维数组,您可以使用multioutput 标志来确定输出应该是什么样子:

#modified from the scikit-learn example
y_true = [[0.5, 1], [-1, 1], [7, -6]]
y_pred = [[0, 2], [-1, 2], [8, -5]]
print(r2_score(y_true, y_pred, multioutput='raw_values'))
array([ 0.96543779,  0.90816327])

这里的输出是 y_true 中每个列表的第一项与 y_pred 的每个列表中的第一项进行比较,第二项与第二项进行比较,依此类推

【讨论】:

  • 但没有任何机器学习算法输出 (n,) 数组或 2D Python 列表;它们都输出 (1, n) 数组。我需要为r2_score() 转换它们,还是我做错了什么?
  • 听起来您遇到的问题是回归量的输出数组的形状与r2_score 所需的形状不匹配。你能提供一个例子,并说明什么没有按预期工作吗?我运行了一个回归器,并使用r2_score 将预测值与实际值进行了比较,没有任何问题
猜你喜欢
  • 2021-05-06
  • 2020-06-25
  • 2022-01-11
  • 2014-06-12
  • 2016-05-02
  • 2012-01-16
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多