【问题标题】:precision , recall , f score when y_pred & y_true have different sizesy_pred 和 y_true 具有不同大小时的精度、召回率、f 分数
【发布时间】:2017-06-20 17:19:08
【问题描述】:

我有两个列表: “A”是一个列表列表,每个项目包含预测标签的列表 “B”是列表的列表,每个项目都包含真正的标签

我正在尝试在迭代中使用 scikit-learn 计算精度、召回率、f 分数,A[i] 与 B[i] 相比,但它说

ValueError: 发现样本数量不一致的输入变量:[3, 2]

我找到了一些类似的话题,但没有答案Computing precision and recall for two sets of keywords in NLTK and Scikit for sets of different sizes

【问题讨论】:

  • 您是否将precision_score()recall_score() 中的average 参数作为described here 传递给多标签分类?

标签: python python-2.7 scikit-learn precision precision-recall


【解决方案1】:

y_truey_pred size() 必须保持相同,以确保准确率和召回率。 y_true[i]y_pred[i] 的大小可能不同。检查precision_score()recall_score() 的文档。请注意,您需要在这些方法中将有效值传递给 average 参数。

还可以查看this page,了解有关多标签分类评分技术的更多信息。

编辑:添加了一些从评论中获取示例数据的代码。

首先,您需要为数据中的所有可用标签对 y_truey_pred 进行一次热编码。

from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.metrics import recall_score, precision_score

A=[['a','b','c'],['d','e','f','g']]
B=[['a','b'],['d','f','g']]

multibinarizer = MultiLabelBinarizer()

A_new = multi.fit(A).transform(A)
B_new = multi.transform(B)

#average = 'valid strategy for multilabel
precision_score(A_new,B_new,average='samples')
#output -> 1.0
recall_score(A_new, B_new, average='samples')
#output -> 0.70833333333333326

【讨论】:

    【解决方案2】:

    当我们计算这些指标时,我们会将实际值与预测值进行比较。因此,如果您的测试集有 10 个数据点,那么您的模型应该有 10 个预测。

    TL;DR A[i] 需要与 B[i] 尺寸一致。

    如果您包含数据外观示例,可以更准确地编辑我的答案!

    【讨论】:

    • 我的数据就像 A=[['a','b','c'],['d','e','f','g']] 和 B =[['a','b'],['d','f','g']] ,B项是A项的预测标签,精度,召回率和fscore公式使得它们甚至可以计算两组大小不一样
    • 据我所知,预测和基本事实具有 1:1 的映射关系......不确定您的用例是什么
    • 问答系统中的标签预测,不是我认为没有映射
    猜你喜欢
    • 2011-11-01
    • 2020-06-22
    • 1970-01-01
    • 2012-09-16
    • 2016-03-26
    • 2016-02-14
    • 2020-09-30
    • 2019-12-14
    • 1970-01-01
    相关资源
    最近更新 更多