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

scikit-learn classification report - Precision and F-score are ill-defined and being set to 0.0

我正在使用 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.

所以我想通过微平均来报告准确率和召回率。我怎样才能使用分类报告,使其不会导致定义不明确的精度和召回率?提前致谢。

这不是 class化验报告本身的问题;仔细阅读,警告实际上告诉您某些 classes 在您的预测中不存在(即您的 classifier 预测没有样本属于某些 classes)。

改编 docs 中的示例有助于证明这一点:

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.
  

那么,问题出在您的 classifier and/or 训练数据上...

UPDATE(评论后):根据定义,只有宏观平均值给出 F1 分数 class(标签);来自 docs:

'micro':

Calculate metrics globally by counting the total true positives, false negatives and false positives.

'macro':

Calculate metrics for each label, and find their unweighted mean. This does not take label imbalance into account.

这就是为什么在 classification_report 中报告的 F1 分数是通过宏观平均的原因。确实,使用微平均你不会收到警告(因为它计算 真阳性,因此它不关心是否有一些 classes代表在预测中),但你也没有得到 F1 分数 per class - 你只得到一个单一的总数:

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

不能在 classification_report 中使用,其中所有报告的指标均符合 class。