【问题标题】:How to fix ROC curve with points below diagonal?如何修复对角线以下点的ROC曲线?
【发布时间】:2012-11-26 21:30:04
【问题描述】:

我正在构建接收器操作特征 (ROC) 曲线,以使用曲线下面积 (AUC) 来评估分类器(有关帖子末尾的更多详细信息)。不幸的是,曲线上的点经常低于对角线。例如,我最终得到的图表看起来像这里的图表(ROC 曲线为蓝色,标识线为灰色):

第三个点 (0.3, 0.2) 位于对角线下方。为了计算 AUC,我想修复这些顽固点。

对于曲线上的点 (fp, tp),标准的做法是用一个点 (1-fp, 1-tp) 代替它,相当于交换分类器的预测。例如,在我们的示例中,我们的麻烦点 A (0.3, 0.2) 变成了点 B (0.7, 0.8),我在上面链接的图片中用红色表示。

这大约是my references 处理此问题的时间。问题是,如果将新点添加到新 ROC 中(并删除坏点),最终会得到如图所示的非单调 ROC 曲线(红色是新的 ROC 曲线,蓝色虚线是旧的):

我在这里卡住了。如何修复此 ROC 曲线?

我是否需要使用经过某种方式转换的数据或类重新运行我的分类器以考虑这种奇怪的行为?我查看了relevant paper,但如果我没记错的话,它似乎正在解决一个与此稍有不同的问题。

在一些细节方面:我仍然拥有所有原始阈值、fp 值和 tp 值(以及每个数据点的原始分类器的输出,输出只是从 0 到 1 的标量,即类成员的概率估计)。我在 Matlab 中从 perfcurve 函数开始执行此操作。


【问题讨论】:

  • 您是否使用交叉验证,您对曲线上的置信区间有任何了解吗?根据您在构建分类器时所处的位置,这可能无需担心。形状取决于测试用例,并在您结合交叉验证的估计值时进行平滑处理。
  • 我计划构建一组 ROC 曲线,但我现在只关注个体,由人工神经网络的个体运行构建(嗯,从技术上讲,我从 k 个神经网络构建 ROC我使用 ANN 使用 k 折交叉验证分类进行训练)。我想我可以只运行 100 次,然后查看 ROC 曲线的分布(或者,ROC 下的面积,如果面积小于 0.5,我可以将其换成 1-AUC)。你认为这合理吗?肯定会更简单!
  • 那么做三件事的算法怎么样:首先,如果 AUC<.5 auc="1-AUC)。其次,一旦进行了这种粗校正,对于那些" tp>
  • 除非您对 ROC 曲线有更好的估计,否则我不会担心丑陋。一种方法是添加一个外部交叉验证过程,将数据分成测试和训练,训练数据进入您当前的过程。从外部过程中获取 ROC 曲线的平均值和不确定性。此平均 ROC 曲线应该是更平滑、更可靠的性能估计。
  • 嗯,我不认为这是一种优化算法,它只是对性能的无偏见测试。嵌套交叉验证的主要缺点通常被认为是计算时间,而不是数据使用。我认为这里有两个问题。一是你对业绩的估计过于乐观。经典论文是 Varma 和 Simon ncbi.nlm.nih.gov/pmc/articles/PMC1397873,但有大量文献。第二个问题是 ROC 曲线(甚至是 AUC)对测试数据很敏感,例如类成员的平衡。

标签: matlab machine-learning classification statistics roc


【解决方案1】:

根据撰写上述文章的人的一些非常有用的电子邮件以及上面的讨论,请注意,正确的答案似乎是:除非您构建,否则不要尝试“修复” ROC 曲线中的各个点一个全新的分类器,然后一定要遗漏一些测试数据,看看这是否合理。

在身份线以下获得分数是很容易发生的事情。这就像让一个单独的分类器得到 45% 的正确率,即使最佳理论最小值是 50%。这只是真实数据集可变性的一部分,除非它明显低于基于偶然性的预期,否则您不必过分担心。例如,如果你的分类器有 20% 的正确率,那么显然有问题,你可能会调查具体原因并修复你的分类器。

【讨论】:

    【解决方案2】:

    是的,将一个点换成 (1-fp, 1-tp) 在理论上是有效的,但增加样本量也是一个安全的选择。

    您的系统似乎确实具有非单调响应特性,因此请注意不要过度弯曲 ROC 的规则,否则会影响 AUC 的稳健性。

    也就是说,您可以尝试使用Pareto Frontier Curve (Pareto Front)。如果这符合“修复凹面”的要求,那么您基本上会对点进行排序,使 ROC 曲线变得单调。

    【讨论】:

    • 我已经在庞大的数据集上看到了这一点,所以我认为这不是样本量的问题。我的例子只是一个显示问题的卡通片。我认为,核心问题是分类器没有充分利用数据中的信息。我提到的“技巧”之所以有效,是因为它通过在给定阈值处交换原始分类器的预测来有效地构建一个新分类器。问题是在一个阈值上进行这个简单的修复不会更新在算法的原始运行中已经计算的所有其他 fp 和 tp 估计值。我不知道该怎么做。
    • 感谢您对数字的澄清。我已经更新了我的答案,以包含一种使用 Pareto Front 的方法。
    • 这似乎是一种有趣的方法,也是我正在考虑的一种方法。我谨慎的原因是它似乎有效地为新转换点 B 左侧的点创建了一个次优分类器。然而,这可能是我们能做的最好的事情。我还认为必须在这里有一些标准解决方案供知情人士使用。就 ROC 的“改变规则”而言,我认为这并不过分担心,因为对角线下方的点表明您的分类器表现得很奇怪,需要进行调整:理论上,对角线下方不应有任何点。
    • 在某些情况下,系统的 ROC 很差。对角线下方的曲线表明分类器比掷硬币更糟糕。在我关于 Detection of unintended electromagnetic emissions from super-regenerative receivers 的论文中,其中一个 ROC 被证明完全位于对角线下方。我们没有尝试修复 ROC,因为我们知道系统检测器性能不佳。
    • 谢谢。是的,也许这不值得,这通常只发生在功能分类不太好的情况下。但是,如果您最终得到一个完全低于该线的 ROC,那么解决方法很简单:只需反转原始分类器的所有预测即可。不过,这里和那里的一些点可能是我不应该太担心的。
    猜你喜欢
    • 2015-01-21
    • 1970-01-01
    • 2021-03-05
    • 2012-10-10
    • 2019-06-21
    • 2021-05-25
    • 2018-01-03
    • 2019-12-26
    • 2019-02-27
    相关资源
    最近更新 更多