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

为何classification_report与循环调用precision_recall_fscore_support的召回值不一致?

多分类模型召回值计算差异的原因及解决方法

核心原因

你遇到的差异几乎都是因为调用precision_recall_fscore_support时参数设置错误,导致计算逻辑和classification_report不一致:

  • classification_report默认会对每个类别独立计算召回:召回 = 该类正确预测数(TP) / 该类真实样本总数(TP+FN)
  • 循环调用时如果没指定labels参数,或误用pos_label的默认值,会让函数的计算逻辑偏离多分类下的单类别召回规则。

代码示例:重现差异+修正

1. 生成数据并训练模型

from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, precision_recall_fscore_support
from sklearn.model_selection import train_test_split

# 生成5分类数据集
X, y = make_classification(n_samples=1000, n_classes=5, n_informative=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 训练随机森林
clf = RandomForestClassifier(random_state=42)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)

2. 用classification_report获取召回

print("classification_report 各分类召回值:")
report = classification_report(y_test, y_pred, output_dict=True)
for cls in range(5):
    print(f"类别{cls}: {report[str(cls)]['recall']:.4f}")

3. 错误调用导致差异

下面的代码会得到和上面不一致的结果,因为pos_label默认是1,且未指定labels,函数会把其他所有类别当作负类,但返回的结果结构不符合单类别召回的提取逻辑:

print("\n错误循环计算的召回值:")
for cls in range(5):
    p, r, f, s = precision_recall_fscore_support(y_test, y_pred, pos_label=cls)
    print(f"类别{cls}: {r[0]:.4f}")

4. 正确的循环调用方式

指定labels=[cls],让函数只针对当前类别计算召回,结果会和classification_report完全一致:

print("\n正确循环计算的召回值:")
for cls in range(5):
    p, r, f, s = precision_recall_fscore_support(y_test, y_pred, labels=[cls])
    print(f"类别{cls}: {r[0]:.4f}")

5. 手动计算召回(最直观验证)

直接按召回的定义手动计算,结果和上述正确方法完全一致:

print("\n手动计算召回值:")
for cls in range(5):
    # 计算TP:真实为cls且预测为cls的样本数
    tp = sum((y_test == cls) & (y_pred == cls))
    # 计算FN:真实为cls但预测不为cls的样本数
    fn = sum((y_test == cls) & (y_pred != cls))
    # 避免除以0
    recall = tp / (tp + fn) if (tp + fn) != 0 else 0.0
    print(f"类别{cls}: {recall:.4f}")

关键总结

  • 多分类下,每个类别的召回本质是「该类样本被正确识别的比例」
  • 只要保证precision_recall_fscore_support的labels参数指定为当前单独类别,就能和classification_report的结果对齐
  • 手动计算是验证结果最可靠的方式,核心就是统计TP和FN的数量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:42:45