为何recall_score与混淆矩阵手动计算的召回率结果不一致?
问题原因与解决方案
核心问题
你遇到的不一致是因为**recall_score默认以pos_label=1作为正类计算召回率,但你手动计算的是另一类别(0)的召回率(即特异性),或者你实际想计算的类别与默认设置不符**。
从你的混淆矩阵和结果来看:
recall_score返回的数值正好是你计算的特异性(负类的召回率),说明它在计算类别0的召回率,而你手动计算的是类别1的召回率。
解决方案
明确指定pos_label参数,告诉recall_score你要计算哪个类别的召回率:
- 如果你想计算类别1的召回率(和你手动计算的
manual_recall一致):
recall = recall_score(y, y_pred, pos_label=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
相关产品推荐
相关产品推荐

