You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何recall_score与混淆矩阵手动计算的召回率结果不一致?

问题原因与解决方案

核心问题

你遇到的不一致是因为**recall_score默认以pos_label=1作为正类计算召回率,但你手动计算的是另一类别(0)的召回率(即特异性),或者你实际想计算的类别与默认设置不符**。

从你的混淆矩阵和结果来看:

  • recall_score返回的数值正好是你计算的特异性(负类的召回率),说明它在计算类别0的召回率,而你手动计算的是类别1的召回率。

解决方案

明确指定pos_label参数,告诉recall_score你要计算哪个类别的召回率:

  1. 如果你想计算类别1的召回率(和你手动计算的manual_recall一致):
recall = recall_score(y, y_pred, pos_label=1)
  1. 如果你想计算类别0的召回率(即当前recall_score返回的结果):
recall = recall_score(y, y_pred, pos_label=0)

验证示例

用你提供的第一个混淆矩阵测试:

[[34  6]
 [20 20]]
  • 调用recall_score(y, y_pred, pos_label=1),结果为20/(20+20)=0.5,与手动计算结果一致;
  • 调用recall_score(y, y_pred, pos_label=0),结果为34/(34+6)=0.85,与你得到的Scikit-learn结果一致。

第二个混淆矩阵:

[[29 11]
 [ 9 31]]
  • recall_score(y, y_pred, pos_label=1) → 31/(31+9)=0.775(手动计算结果);
  • recall_score(y, y_pred, pos_label=0) → 29/(29+11)=0.725(Scikit-learn返回结果)。

额外说明

  • Scikit-learn的confusion_matrix行对应真实标签,列对应预测标签,你对tn, fp, fn, tp的拆解是正确的;
  • 二分类问题中,recall_score默认average='binary',仅计算pos_label指定类别的召回率,默认pos_label=1;
  • 如果你的正类定义不是1,必须显式指定pos_label参数,避免类别混淆。

内容的提问来源于stack exchange,提问作者moonwindsailing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:53:10