【问题标题】:Interpreting AUC, accuracy and f1-score on the unbalanced dataset在不平衡数据集上解释 AUC、准确性和 f1 分数
【发布时间】:2020-10-09 15:43:20
【问题描述】:

我试图了解在数据集不平衡的情况下,AUC 是比分类准确度更好的指标。
假设一个数据集包含 3 个类的 1000 个示例,如下所示:

a = [[1.0, 0, 0]]*950 + [[0, 1.0, 0]]*30 + [[0, 0, 1.0]]*20

显然,这些数据是不平衡的。
一个天真的策略是预测属于第一类的每个点。
假设我们有一个具有以下预测的分类器:

b = [[0.7, 0.1, 0.2]]*1000

使用列表a中的真实标签和列表b中的预测,分类准确率为0.95。
所以人们会认为模型在分类任务上确实做得很好,但这并不是因为模型预测了一个类中的每个点。
因此,建议使用 AUC 指标来评估不平衡的数据集。
如果我们使用 TF Keras AUC 度量来预测 AUC,我们会得到 ~0.96。
如果我们通过设置b=[[1,0,0]]*1000 使用sklearn f1-score 度量来预测f1-score,我们得到0.95。

现在我有点困惑,因为所有指标(准确率、AUC 和 f1 分数)都显示出很高的值,这意味着该模型非常擅长预测任务(这里不是这种情况)。

我在这里遗漏了哪一点以及我们应该如何解释这些值?
谢谢。

【问题讨论】:

    标签: python scikit-learn tensorflow2.0 multiclass-classification auc


    【解决方案1】:

    您很可能使用average='micro' 参数来计算F1 分数。根据docs,将'micro' 指定为平均启动将:

    通过计算真阳性、假阴性和假阳性的总数来全局计算指标。

    在保证每个测试用例都被分配到一个类的分类任务中,计算微 F1 分数等同于计算准确度分数。看看吧:

    from sklearn.metrics import accuracy_score, f1_score
    
    y_true = [[1, 0, 0]]*950 + [[0, 1, 0]]*30 + [[0, 0, 1]]*20
    y_pred = [[1, 0, 0]]*1000
    
    print(accuracy_score(y_true, y_pred)) # 0.95
    
    print(f1_score(y_true, y_pred, average='micro')) # 0.9500000000000001
    

    您基本上计算了两次相同的指标。通过指定 average='macro' 代替,将首先独立计算每个标签的 F1 分数,然后取平均值:

    print(f1_score(y_true, y_pred, average='macro')) # 0.3247863247863248
    

    如您所见,整体 F1-score 取决于平均策略,小于 0.33 的宏观 F1-score 是模型在预测任务中存在缺陷的明确指标。


    编辑:

    由于OP询问何时选择哪种策略,并且我认为这对其他人也可能有用,因此我将尝试详细说明此问题。

    scikit-learn 实际上为支持多类和多标签分类任务的平均值的指标实现了四种不同的策略。方便的是,classification_report 将返回所有为 PrecisionRecallF1-score 申请给定分类任务的人: p>

    from sklearn.metrics import classification_report
    
    # The same example but without nested lists. This avoids sklearn to interpret this as a multilabel problem.
    y_true = [0 for i in range(950)] + [1 for i in range(30)] + [2 for i in range(20)]
    y_pred = [0 for i in range(1000)]
    
    print(classification_report(y_true, y_pred, zero_division=0))
    
    ######################### output ####################
    
                  precision    recall  f1-score   support
    
               0       0.95      1.00      0.97       950
               1       0.00      0.00      0.00        30
               2       0.00      0.00      0.00        20
    
        accuracy                           0.95      1000
       macro avg       0.32      0.33      0.32      1000
    weighted avg       0.90      0.95      0.93      1000
    

    根据一个人对班级分布的重视程度,它们都提供了不同的视角。

    1. microaverage 是一种全局策略,基本上忽略了类之间的区别。如果某人真的只对真阳性、假阴性和假阳性方面的整体分歧感兴趣,并且不关心班级内的差异,这可能是有用或合理的。如前所述,如果潜在问题不是多标签分类任务,这实际上等于准确度得分。 (这也是classification_report 函数返回accuracy 而不是micro avg 的原因。

    2. macro average 作为一种策略,将分别计算每个标签的每个指标并返回它们的未加权平均值。如果每个类都具有同等重要性并且结果不应偏向于数据集中的任何类,则这是合适的。

    3. weighted average 也将首先分别计算每个标签的每个指标。但平均值是根据班级的支持度加权的。如果类的重要性与其重要性成正比,则这是可取的,即代表性不足的类被认为不太重要。

    4. samples average 仅对多标签分类有意义,因此在此示例中classification_report 不会返回,此处也不讨论;)

    因此,平均策略的选择和结果信任的数量实际上取决于类的重要性。我是否关心类差异(如果没有--> 微观平均),如果是,所有类都同样重要(如果是--> 宏观平均)还是具有更高支持的类更重要(--> 加权平均) .

    【讨论】:

    • 那么我们如何决定计算 AUC 和 f1-score 的平均技术,因为这些结果暗示了对模型性能的非常不同的解释?
    • 对于大量样本的预测也是正确的,因此使用宏平均的 f1 分数没有考虑到这一点。
    • 您对宏观平均值的看法是正确的。它旨在平等地加权所有单独的指标,并忽略数据集中类的支持。这就是为什么大多数类别的大量正确分类样本被边缘化的原因。如果你也想考虑这个方面,你可以例如使用加权平均值,这也将说明类的支持。
    • 另请参阅我更新了我的答案,以便让您和其他人了解何时适合哪种策略。我希望这可以澄清事情。
    猜你喜欢
    • 2018-11-25
    • 2020-06-19
    • 1970-01-01
    • 2016-04-14
    • 2023-02-10
    • 2021-06-29
    • 2021-04-09
    • 2017-10-25
    • 2021-08-12
    相关资源
    最近更新 更多