使用sklearn的precision_recall_fscore_support计算微查准率与微查全率值相同问题咨询
为什么多分类任务中Micro-Precision和Micro-Recall完全相同?
这完全不是问题——这是单标签多分类任务中使用硬预测时,micro平均指标的正常表现,甚至连F1值也会和它们相等,就像你输出里显示的那样。
背后的原因拆解
先明确micro平均的核心计算逻辑:
我们把所有类别的二分类混淆矩阵(TP、FP、FN)全部加总,得到全局的总TP、总FP、总FN,再计算:
micro-precision = 总TP / (总TP + 总FP)micro-recall = 总TP / (总TP + 总FN)micro-F1 = 2*(P*R)/(P+R)
当你用classifier.predict(x_test)做单标签多分类时,每个样本只会被分配到唯一的一个类别,这时候会发生三个关键等价关系:
- 总TP + 总FP = 测试集总样本数:每个样本都被预测了一个类别,要么是该类的正确预测(TP),要么是其他类的错误预测(FP)。
- 总TP + 总FN = 测试集总样本数:每个样本都有唯一的真实类别,要么被正确命中(TP),要么被错误遗漏(FN)。
- 总FP = 总FN:每一个错误预测,对应一个「被错误归为某类的FP」和一个「真实类别未被命中的FN」,两者数量完全相等。
这三个关系直接导致micro-precision和micro-recall的分母相同、分子相同,因此结果必然一致。同时,这个值也和**分类准确率(accuracy)**完全相等,因为accuracy = 总TP / 总样本数,而根据上面的等价关系,它和micro-P/R的计算结果是一样的。
举个极简例子验证
假设测试集有3个样本:
- 真实标签:
[0, 1, 2] - 预测标签:
[0, 0, 0]
计算全局指标:
- 总TP = 1(只有第一个样本预测正确)
- 总FP = 2(后两个样本被错误预测为0类,属于0类的FP)
- 总FN = 2(真实1类和2类的样本未被正确预测,属于它们的FN)
代入公式:
- micro-precision = 1/(1+2) = 0.333...
- micro-recall = 1/(1+2) = 0.333...
- micro-F1 = 2*(0.333*0.333)/(0.333+0.333) = 0.333...
和你的输出完全匹配,这就说明一切正常。
什么时候它们会不同?
只有在多标签分类任务(一个样本可以属于多个类别),或者你使用概率预测(比如predict_proba)并设置不同阈值来生成多类别预测时,micro-precision和micro-recall才可能出现差异——因为这时候总FP和总FN不再相等,分母也就不一样了。
内容的提问来源于stack exchange,提问作者Wanderer
相关产品推荐
相关产品推荐

