scitit-learn的分类指标中的classification_report vs f1_score

时间:2015-10-20 22:22:45

标签: machine-learning scikit-learn cross-validation

使用scikit-learn的评估指标评估二元分类器的正确方法是什么?

如果y_test和y_pred为黄金和预测标签,那么classification_report输出中的F1分数是否应该与f1_score产生的相同?

我是这样做的:

print(classification_reprot(y_test, y_pred)

给出下表:

         precision    recall  f1-score   support

      0       0.49      0.18      0.26       204
      1       0.83      0.96      0.89       877

avg / total       0.77      0.81      0.77      1081

然而,

print(f1_score(y_test, y_pred) 

给出F1得分= 0.89

现在,鉴于上述输出,这个模型的表现是F1得分= 0.89还是0.77?

1 个答案:

答案 0 :(得分:4)

简而言之,对于您的情况, f1-score 为0.89,加权平均f1-score 为0.77。

查看sklearn.metrics.f1_score的文档字符串:

The F1 score can be interpreted as a weighted average of the precision and
recall, where an F1 score reaches its best value at 1 and worst score at 0.
The relative contribution of precision and recall to the F1 score are
equal. The formula for the F1 score is::

    F1 = 2 * (precision * recall) / (precision + recall)

In the multi-class and multi-label case, this is the weighted average of
the F1 score of each class.

关键是这里的最后一句话。如果您正在寻找每个班级的加权平均f1分数,那么您不应该为该函数提供0/1二进制分类。所以,例如,你可以做到

f1_score(y_test + 1, y_pred + 1)
# 0.77

如果类标签不是0/1,那么它被视为多类度量(您关心所有精度/召回分数)而不是二进制度量(您只关心正样本的精度/召回) 。我同意这可能有点令人惊讶,但一般来说0/1类被视为二元分类的标记。

编辑:此处列出的某些行为因Scikit-learn 0.16而被弃用 - 特别是关于二进制与非二进制分类的混淆隐含假设。有关详细信息,请参阅this github thread