我正在使用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.
所以我想通过微观平均来报告精确度和召回率。如何使用分类报告,以便产生不明确的精确度和召回?提前谢谢。
答案 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
中使用,其中所有报告的指标均为每个类。