y_pred 和 y_true 具有不同大小时的精度、召回率、f 分数

Posted

技术标签:

【中文标题】y_pred 和 y_true 具有不同大小时的精度、召回率、f 分数【英文标题】:precision , recall , f score when y_pred & y_true have different sizes 【发布时间】: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 传递给多标签分类? 【参考方案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 的映射关系......不确定您的用例是什么 问答系统中的标签预测,不是我认为没有映射

以上是关于y_pred 和 y_true 具有不同大小时的精度、召回率、f 分数的主要内容,如果未能解决你的问题,请参考以下文章

Keras 自定义损失函数,用于传递 y_true 和 y_pred 以外的参数

Keras - 使用 y_preds 和 y_true 而不是 X_train 训练模型

keras_API汇总积累(熟读手册)三损失函数

keras_API汇总积累(熟读手册)三损失函数

以 y_true 依赖于 y_pred 的方式自定义 Keras 的损失函数

我正在训练一个 keras 神经网络。我想要一个由 y_true*y_pred 给出的自定义损失函数。这是允许的吗?