手动计算的评估指标与Sklearn函数计算结果不一致问题咨询
问题根因
你遇到的计算结果差异是两个核心配置不匹配导致的:
- 混淆矩阵返回值顺序理解错误
- scikit-learn评估函数默认正样本类别与你手动计算的目标类别不匹配
具体原因说明
- 混淆矩阵返回顺序错误
scikit-learn中confusion_matrix(y_true, y_pred).ravel()的返回顺序固定为tn, fp, fn, tp:行对应真实标签,列对应预测标签,默认按标签升序排列,[0,0]位为真负样本TN、[0,1]位为假正样本FP、[1,0]位为假负样本FN、[1,1]位为真正样本TP。你直接将返回值赋值给tp, fn, fp, tn,相当于把四个指标完全错位。 - 正样本类别不匹配
scikit-learn的precision_score、recall_score默认将1作为正类别计算指标,你手动计算时实际是把占绝大多数的0类当作了正类别,两者计算的目标类别完全不同。
验证与解决方法
你输出的混淆矩阵四个值3636933 34156 127 151对应的正确指标为:tn=3636933, fp=34156, fn=127, tp=151
按sklearn默认正类别为1的规则手动计算:
# 正类别为1的召回率:tp/(tp+fn) = 151/(151+127) ≈ 0.543165,与sklearn输出一致 # 正类别为1的精确率:tp/(tp+fp) =151/(151+34156)≈0.004401,与sklearn输出一致
如果你的业务场景中需要把0作为正类别计算指标,调用评估函数时指定pos_label参数即可:
precision = precision_score(y_test, y_test_pred, pos_label=0) recall = recall_score(y_test, y_test_pred, pos_label=0)
此时手动计算也需要对应调整为以0类为正样本的指标计算逻辑,结果就会和sklearn输出完全匹配。
内容的提问来源于stack exchange,提问作者ForestGump
相关产品推荐
相关产品推荐

