【问题标题】:sklearn's precision_recall_curve incorrect on small examplesklearn 的precision_recall_curve 在小例子中不正确
【发布时间】:2020-07-18 13:30:52
【问题描述】:

这是一个使用precision_recall_curve()的非常小的例子:

from sklearn.metrics import precision_recall_curve, precision_score, recall_score
y_true = [0, 1]
y_predict_proba = [0.25,0.75]
precision, recall, thresholds = precision_recall_curve(y_true, y_predict_proba)
precision, recall

导致:

(array([1., 1.]), array([1., 0.]))

以上与后面的“手动”计算不符。

根据阈值存在三种可能的类向量:[0,0](当阈值 > 0.75 时)、[0,1](当阈值在 0.25 和 0.75 之间时)和 [1,1](当阈值

y_predict_class=[0,1]
precision_score(y_true, y_predict_class), recall_score(y_true, y_predict_class)

给出:

(1.0, 1.0)

y_predict_class=[1,1]
precision_score(y_true, y_predict_class), recall_score(y_true, y_predict_class)

给了

(0.5, 1.0)

这似乎与precision_recall_curve() 的输出不匹配(例如,它没有产生0.5 的精度值)。

我错过了什么吗?

【问题讨论】:

    标签: scikit-learn precision-recall


    【解决方案1】:

    我知道我迟到了,但我有同样的疑问,我最终解决了。 这里的重点是precision_recall_curve()在第一次得到fullrecall后不再输出precision和recall值;此外,它将一个 0 连接到 recall 数组,将一个 1 连接到 precision 数组,以便让曲线从 y 轴对应开始。

    在您的具体示例中,您将像这样有效地完成两个数组(由于sklearn 的特定实现,它们的顺序相反):

    precision, recall
    (array([1., 0.5]), array([1., 1.]))
    

    然后,省略与第二次完全召回相对应的两个数组的值,并将 1 和 0 值(分别用于精度和召回)连接起来,如上所述:

    precision, recall
    (array([1., 1.]), array([1., 0.]))
    

    我已尝试详细解释here;另一个有用的链接当然是this one

    【讨论】:

      猜你喜欢
      • 2019-04-25
      • 2017-10-20
      • 2016-08-22
      • 2016-05-22
      • 2014-08-12
      • 2019-07-26
      • 2019-08-12
      • 1970-01-01
      • 2020-04-15
      相关资源
      最近更新 更多