如何解释和调查不平衡数据中的完美准确度、精确度、召回率、F1 和 AUC(我不信任)

Posted

技术标签:

【中文标题】如何解释和调查不平衡数据中的完美准确度、精确度、召回率、F1 和 AUC(我不信任)【英文标题】:How to interpret and investigate the perfect accuracy, precision, recall, F1, and AUC (which I don't trust) in unbalanced data 【发布时间】:2018-11-25 13:20:00 【问题描述】:

我有一个很大程度上不平衡的多标签数据集。

结果中出现了一些意想不到的情况。正如预期的那样,使用逻辑回归分类器,具有较高频率的标签获得了合理的 f1-score 和 auc-score(即:0.6-0.7),而那些在数据中具有小于 10% 表示的标签预期在 f-1 和 0.5 中得到 0用于 auc 分数。

但是当我使用 SVC 和朴素贝叶斯分类器运行相同的事情时,其中一些低频标签(例如:在 7000 个样本中,一个次要类别可能有 10 个样本)显示 100% 准确率,f-1 ,精确度,召回率和auc-score,我不明白。鉴于可用的训练样本如此之低,我不相信这些完美的结果。我还尝试了不同的随机种子来分割训练集和测试集,并得到了相同的结果。

分类器

Logistic regression classifier
Pipeline(memory=None,
     steps=[('tfidf', TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',
        dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
        lowercase=True, max_df=1.0, max_features=None, min_df=1,
        ngram_range=(1, 1), norm='l2', preprocessor=None, smooth_idf=True,
 ..._state=None, solver='sag', tol=0.0001,
          verbose=0, warm_start=False),
          n_jobs=1))])

Naive Bayes classifier
Pipeline(memory=None,
     steps=[('tfidf', TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',
        dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
        lowercase=True, max_df=1.0, max_features=None, min_df=1,
        ngram_range=(1, 1), norm='l2', preprocessor=None, smooth_idf=True,
 ...assifier(estimator=MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True),
          n_jobs=1))])

SVC classifier
Pipeline(memory=None,
     steps=[('tfidf', TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',
        dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
        lowercase=True, max_df=1.0, max_features=None, min_df=1,
        ngram_range=(1, 1), norm='l2', preprocessor=None, smooth_idf=True,
 ...lti_class='ovr', penalty='l2', random_state=None, tol=0.0001,
     verbose=0),
          n_jobs=1))])

【问题讨论】:

【参考方案1】:

在我看来,你的结果至少是可信的。逻辑回归倾向于对数据进行中值表征,找到一个单一的方程来表征类别之间的差异。给定大量数据,它会寻找适合该方程的最小误差。

SVC 和贝叶斯对可辨别的边界更加敏感,即使远离“数据的主流”。这些算法更适用于每个类别的“我们对抗世界”(也称为“一对多”)视图。因此,他们可以找到一种合理的方法来区分一组十个元素和“其他所有元素”,这并不让我感到惊讶。

你能找到一个有用的可视化工具来显示每种方法找到的边界吗?如果没有,你至少可以用颜色编码观察数据集吗?如果您可以看到一组十个点的明显分离,那么我会期望 SVC 或朴素贝叶斯找到可比较的东西。

【讨论】:

我之前没有在数据集级别进行可视化,有什么建议可以在哪里学习这些技术吗?谢谢。 这对 SO 来说是题外话;您必须研究适合您需求的可视化工具,尤其是包括使用教程。也许graph-tool 会有所帮助?【参考方案2】:

您是否检查了计算这些指标的样本数量?如果有,例如只有两个样本进行 100% 测试,这并不奇怪,因为测试样本的数量很少。

此外,由于您拥有不平衡的数据,您是否考虑过平衡准确度或 Mathews 相关系数 (MCC) 等措施来深入了解预测性能?模型可以具有非常高的 AUC,同时完全忽略少数类。如果这也与例如测试集中的大多数类样本相吻合,也可能导致这些意外结果。

【讨论】:

以上是关于如何解释和调查不平衡数据中的完美准确度、精确度、召回率、F1 和 AUC(我不信任)的主要内容,如果未能解决你的问题,请参考以下文章

如何评估/提高来自具有不平衡数据集的神经网络的预测的准确性?

推荐系统实践

怎么提高PDA扫描健康云二维码的准确度

问卷调查样本量如何确定?

如何在交叉验证时获得AUC-ROC而不是准确度?

如何解释模型学习曲线(训练和验证数据的时代准确率和损失曲线)?