【问题标题】:Scikit Learn: Skewed Average Precision ReportScikit Learn:偏斜的平均精度报告
【发布时间】:2015-01-04 08:49:05
【问题描述】:

我正在使用 scikit-learn 执行二进制分类,但是标签在整个数据集中分布不均。对于我对预测少数类感兴趣的情况,我对metrics.average_precision_score 提供的平均精度指标有些担忧。当我运行实验并打印分类报告时,我看到总体精度上表现良好,但这显然是因为模型在预测多数类方面做得很好,如下所示:

                     precision    recall    f1-score    support
label of interest    0.24         0.67      0.35        30
non-label            0.97         0.81      0.88        300

average precision 然后报告为0.9752 附近的某个位置。这个平均精度分数显然是针对大多数类别报告的,这并不是我真正感兴趣的类别。是否有某种方法可以修改metrics.average_precision_score 函数以报告与少数感兴趣类别相关的指标?任何见解将不胜感激 - 感谢阅读。

【问题讨论】:

    标签: scikit-learn classification metrics average-precision


    【解决方案1】:

    经过多次修改后想出了一个解决方案。我一直在使用预处理工具LabelEncoder() 来自动编码训练集和测试集的标签。我正在执行二进制分类,因此标签只需要0 或1 的编码。但是,执行此操作时,该函数会自动将多数类编码为1,将少数类编码为0。对于我有兴趣预测少数类(通常是)的情况,这会使average precision 函数的报告偏向于无论多数类是什么,我是否有兴趣预测不管是不是。

    这让我问了另一个问题here,关于“翻转”我的标签分配到的数组中的0 和1 值,你瞧,它正在工作。因此,最重要的是更加有意识地确保我有兴趣预测的类总是编码为1,并确保其他类编码为0 .

    【讨论】:

      【解决方案2】:

      您可以设置average=None 以获取每个班级的平均精度分数 (docs)。但请记住,平均精度分数考虑了所有可能的阈值,而分类报告仅显示一个阈值,这可能偏向于多数类别。

      【讨论】:

      • 感谢您的关注,@Andreas。一个问题:如果我正确地实现了这一点,那么我应该为我执行的每次验证获得两个平均精度分数,对吗?当我目前运行我的脚本时,我仍然只看到一个平均精度分数。我只是在我当前的脚本中将这部分作为print metrics.average_precision_score(test_labels, predicted_labels, average=None) 运行。感谢阅读。
      • 嗯,对不起,我刚刚意识到我的原始答案具有误导性。只有当你给它一个大小为(n_samples, 2) 的决策函数时,它才有效。哎呀。不过,您可以翻转这两个类(将1-y_true 和-decision_function 传递给average_precision_score)。
      猜你喜欢
      • 2018-07-03
      • 1970-01-01
      • 2012-11-30
      • 2020-02-14
      • 1970-01-01
      • 2013-02-21
      • 2018-05-28
      • 2016-01-16
      • 2015-03-27
      相关资源
      最近更新 更多