scikit-learn分类报告 - 精确度和F分数定义不明确,设置为0.0

时间:2018-04-18 22:18:23

标签: python machine-learning scikit-learn precision-recall

我正在使用scikit-learn来计算分类记录,当我尝试打印时,它会发出警告:

print classification_report(original,predicted)

警告:

Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples.

所以我想通过微观平均来报告精确度和召回率。如何使用分类报告,以便产生不明确的精确度和召回?提前谢谢。

1 个答案:

答案 0 :(得分:0)

这不是分类报告本身的问题;仔细阅读,警告实际上告诉你,你的预测中没有一些类(即你的分类器预测没有样本属于某些类)。

调整CGPoint.applying(TR)中的示例有助于证明这一点:

from sklearn.metrics import classification_report
y_true = [0, 1, 2, 2, 0]
y_pred = [0, 0, 2, 2, 0] # no 1's predicted
target_names = ['class 0', 'class 1', 'class 2']

print classification_report(y_true, y_pred, target_names=target_names)

结果如下:

             precision    recall  f1-score   support

    class 0       0.67      1.00      0.80         2
    class 1       0.00      0.00      0.00         1
    class 2       1.00      1.00      1.00         2

avg / total       0.67      0.80      0.72         5

/home/ctsats/.local/lib/python2.7/site-packages/sklearn/metrics/classification.py:1135: 
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples.

所以,问题在于你的分类器和/或训练数据......

更新(评论后):通过定义,只有宏观平均值为每个类(标签)提供分数;来自docs

  

<强>&#39;微&#39;

     

通过计算总真阳性,假阴性和误报来全球计算指标。

     

<强>&#39;宏&#39;

     

计算每个标签的指标,找出未加权的均值。这不会考虑标签不平衡。

这就是为什么在classification_report报告的F1得分是通过宏观平均值的原因。确实,使用微观平均值,您不会收到警告(因为它会计算总计真正的正数,因此如果预测中没有表示某些类,则它并不关心),但你不能获得每个班级的 - 你只得到一个单一的总数:

f1_score(y_true, y_pred, average='micro')
# 0.8000000000000002

,不能在classification_report中使用,其中所有报告的指标均为每个类。