Matlab 如何用对角线以下的点固定ROC曲线?

Matlab 如何用对角线以下的点固定ROC曲线?,matlab,machine-learning,classification,statistics,roc,Matlab,Machine Learning,Classification,Statistics,Roc,我正在构建接收器操作特征(ROC)曲线,以使用曲线下面积(AUC)评估分类器(更多细节见下文)。不幸的是,曲线上的点经常低于对角线。例如,我最终得到的图形与这里的图形类似(蓝色的ROC曲线,灰色的标识线): 第三点(0.3,0.2)位于对角线下方。为了计算AUC,我想修正这些难以解决的问题 对于曲线上的点(fp,tp),执行此操作的标准方法是将其替换为点(1-fp,1-tp),这相当于交换分类器的预测。例如,在我们的示例中,麻烦的点A(0.3,0.2)变成了点B(0.7,0.8),我在上面链接

我正在构建接收器操作特征(ROC)曲线,以使用曲线下面积(AUC)评估分类器(更多细节见下文)。不幸的是,曲线上的点经常低于对角线。例如,我最终得到的图形与这里的图形类似(蓝色的ROC曲线,灰色的标识线):

第三点(0.3,0.2)位于对角线下方。为了计算AUC,我想修正这些难以解决的问题

对于曲线上的点(fp,tp),执行此操作的标准方法是将其替换为点(1-fp,1-tp),这相当于交换分类器的预测。例如,在我们的示例中,麻烦的点A(0.3,0.2)变成了点B(0.7,0.8),我在上面链接的图像中用红色表示了点B

在处理这个问题上,这差不多是我们所能做的。问题是,如果将新点添加到新ROC中(并删除坏点),最终会得到非单调ROC曲线,如图所示(红色是新ROC曲线,蓝色虚线是旧ROC曲线):

我被困在这里了。如何修正ROC曲线

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

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


是的,从理论上讲,用一个点替换(1-fp,1-tp)是有效的,但增加样本量也是安全的

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


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

注意:根据撰写上述文章和讨论的人发来的一些非常有用的电子邮件,正确的答案似乎是:不要试图“修复”ROC曲线中的各个点,除非您构建了一个全新的分类器,然后一定要省去一些测试数据,看看这样做是否合理


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

我在大量数据集中看到过这一点,因此我认为这不是样本大小的问题。我的例子只是一幅漫画来说明这个问题。我认为,核心问题是,有一个分类器不能最佳利用数据中的信息。我提到的“技巧”之所以有效,是因为它通过在给定阈值下交换原始分类器的预测来有效地构建新分类器。问题是,在一个阈值上执行此简单修复不会更新在算法原始运行中已计算的所有其他fp和tp估计。我不知道怎么做。谢谢你对数字的澄清。我已经更新了我的答案,加入了一个带有帕累托前沿的方法。这似乎是一个有趣的方法,也是我正在考虑的方法。我之所以谨慎,是因为它似乎有效地为新变换点B左侧的点创建了次优分类器。然而,这可能是我们能做的最好的了。我也在想,一定有一些标准的解决方案,在这里的人知道使用。就ROC的“弯曲规则”而言,我认为这不太令人担忧,因为对角线下方的点表明您的分类器行为怪异,需要调整:理论上,任何点都不应低于对角线。在某些情况下,系统的ROC很差。对角线下方的曲线显示分类器比抛硬币更糟糕。在我关于其中一个ROC的论文中,结果是完全低于对角线。我们没有试图修复ROC,因为我们知道该系统是一个糟糕的探测器。谢谢。是的,也许这不值得,这通常只发生在功能分类不好的情况下。然而,如果您最终得到的ROC完全低于该线,那么解决方法很简单:只需反转原始分类器的所有预测。然而,线下的一些点,这里和那里,可能是我不太应该担心的。你使用交叉验证吗?你知道曲线上的置信区间吗?根据构建分类器的位置,这可能不需要担心。形状取决于测试用例,当你结合交叉验证的估计时会变得平滑。我计划建立一组ROC曲线,但我现在只关注个体,从人工神经网络的个体运行中构建(从技术上讲,我用k-fold交叉验证分类法训练的k个神经网络构建ROC)。我想我可以运行100次,看看ROC曲线的分布(或者,ROC下的面积,如果面积小于0.5,我可以将其替换为1-AUC).你认为这合理吗?它肯定会更简单!那么一个能做三件事的算法呢:第一,如果AUCI在