Scikit-learn计算Precision与Recall结果异常,与手动计算不符
可能的原因及解决办法
正类别指定错误:Scikit-learn默认把标签中数值最大的类别当作正类,如果你手动计算时针对的是另一个类别,结果必然对不上。比如你算的是类别0的精确率,但sklearn默认计算类别1的指标,数值自然差异极大。解决方式很直接:在
precision_score或recall_score里显式指定pos_label参数,比如precision_score(y_test, y_pred, pos_label=0)。混淆矩阵行列对应关系搞反:sklearn的
confusion_matrix(y_true, y_pred)默认以真实标签为行、预测标签为列,二分类场景下格式为[[TN, FP], [FN, TP]]。如果你手动计算时把预测值当行、真实值当列,TP、FP这些核心计算值就会出错,结果肯定不对,先核对你的混淆矩阵行列对应关系。average参数理解偏差:
- 如果你手动算的是单个类别的精确率,用
'macro'或'weighted'完全是方向错误——这两个参数是计算所有类别的平均指标。比如你手动算出某一类的精确率是0.14,'macro'会把所有类别的精确率求和后除以类别数,'weighted'会按每个类别的真实样本数加权平均,结果自然和单个类别的数值差很远。这种情况应该用average=None返回所有类别的指标,再提取你需要的那个;二分类场景下也可以直接指定pos_label。 - 多分类场景下,别拿
'weighted'或'macro'的结果去对比单个类别的手动计算值,二者完全不是同一维度的指标。
- 如果你手动算的是单个类别的精确率,用
类别不平衡的拉偏作用:如果数据集里大部分是其他类别,只有你关注的目标类别样本极少,用
'weighted'参数时,大量其他类别的高指标会把整体结果拉偏。比如你关注的类精确率是0.14,但其他9个类的精确率都是1,加权后的整体结果会接近1,和你的手动计算值完全不符。
内容的提问来源于stack exchange,提问作者Natalia Ziemba-Jankowska
相关产品推荐
相关产品推荐

