【问题标题】:Micro F1 score in Scikit-Learn with Class imbalance类不平衡的 Scikit-Learn 中的 Micro F1 分数
【发布时间】:2019-04-23 00:20:26
【问题描述】:

我有一些类不平衡和一个简单的基线分类器,它将多数类分配给每个样本:

from sklearn.metrics import precision_score, recall_score, confusion_matrix

y_true = [0,0,0,1]
y_pred = [0,0,0,0]
confusion_matrix(y_true, y_pred)

这会产生

[[3, 0],

[1, 0]]

这意味着 TP=3,FP=1,FN=0。

到目前为止,一切都很好。现在我想计算精度和召回率的微观平均值。

precision_score(y_true, y_pred, average='micro') # yields 0.75
recall_score(y_true, y_pred, average='micro') # yields 0.75

我对精度没问题,但为什么召回率不是 1.0?考虑到 FP > 0 和 FN == 0,在这个例子中它们怎么可能是一样的呢?我知道这一定与微平均有关,但我无法理解这一点。

【问题讨论】:

    标签: scikit-learn precision-recall


    【解决方案1】:

    是的,这是因为微平均。请参阅documentation here 了解其计算方式:

    请注意,如果包含所有标签,则“微”-平均 多类设置将产生准确率、召回率和 f-score 与准确性相同

    正如您在上面的链接页面中看到的,精度和召回率都定义为:

    其中 R(y, y-hat) 是:

    因此,在您的情况下,Recall-micro 将计算为

    R = number of correct predictions / total predictions = 3/4 = 0.75
    

    【讨论】:

    • 谢谢。您链接的段落很奇怪。句子“请注意,如果包括所有标签,多类设置中的“微”平均将产生精确度、召回率,并且都与准确度相同”这句话与您所说的一致,但该段并没有说明 A 和B 实际上是,奇怪的是,它将 y-hat 定义为真实标签的集合,将 y 定义为预测标签的集合,这是非常规的,不是吗?我的结论是不使用微平均进行二元分类,并对此进行更多思考。
    • 啊,忘了我说的关于 A、B 没有定义的事情,我明白了。但为时已晚,无法编辑我的评论。谢谢!
    • @Toby 是的,这是非常规的。但是以下所有内容都与此匹配,所以不用担心。如果您愿意,您可以在 scikit-learn github page 上提出有关此用法的问题
    猜你喜欢
    • 2013-02-10
    • 2021-04-09
    • 2020-06-19
    • 2016-01-24
    • 2015-02-16
    • 2019-09-28
    • 2014-06-20
    • 1970-01-01
    • 2014-06-13
    相关资源
    最近更新 更多