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_true
和 y_pred
size() 必须保持相同,以确保准确率和召回率。 y_true[i]
和 y_pred[i]
的大小可能不同。检查precision_score()
和recall_score()
的文档。请注意,您需要在这些方法中将有效值传递给 average
参数。
还可以查看this page,了解有关多标签分类评分技术的更多信息。
编辑:添加了一些从评论中获取示例数据的代码。
首先,您需要为数据中的所有可用标签对 y_true
和 y_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 训练模型