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