ROC 和 Precision-Recall 中的零分母?

zero denominator in ROC and Precision-Recall?

这个问题是关于ROC曲线的,但是可以推广到Precision-Recall曲线。

如您所知,行曲线是使用误报率 (FPR) 和真阳性率 (TPR) 绘制的,其中:

TPR = tp / (tp + fn ) // tp= true positives, fn = false negatives
FPR = fp / (fp + tn ) // fp = false positives, tn = true negatives

但是如果其中一个分母是0呢? TPR的最优值为1,而FPR为0(实际上ROCspace中的最优值为(0,1))。

如果我们使用 ROC 曲线计算分类系统中的最佳阈值,这一点尤为重要。

例如,在我的例子中,我的特定配置的系统从来没有 returns fptn,所以 FPR 总是 0 作为分母

更新说明:

我正在使用 T-F/P-N 和 ROC 曲线来确定我的分类器的阈值。特别是,我针对数据集 w.r.t 中顶部 k 最相似元素的给定截止值计算了这些值。给定的查询。所以碰巧如果我们只考虑 top-1 元素,T-F/P-N 只在非常相似的对象上计算,所以分类器不会 return 否定是非常现实的。结果,阈值非常严格,但分类器非常精确。像 "I don't know what to answer many times, but when I do, I give the correct answer almost 100% of the times".

当然,如果我们增加 k 底片出现并且阈值增加。结果,分类器回答的次数更多,但错误结果的概率更高。

所以我想我会保留 k 作为调整参数,这取决于所考虑的应用:如果我们想要一个非常精确的分类器,我们将设置一个小的 k,否则如果我们考虑误报我们可以选择更大的k.

我的申请:

我的应用程序是图像的相似性缓存:当收到查询时,系统检查是否有 "enough similar" 缓存图像。如果是,return结果相同,否则查询后台系统。 "similar enough" 是阈值。为了确定一个好的阈值,我们 select 数据集图像的一个子集,在这个问题中称为 "queries"。为了确定阈值,正如我上面所解释的,作为第一种方法,我 select top-1 元素,即最相似的图像 w.r.t。整个数据集中的查询(设置图像之一)。这是为每个查询完成的。从那里,我使用 ROC 曲线计算阈值,如上所述。因此,如果我们使用 n 个查询,我们将获得 n 个预测。

如果我们使用这种方法,得到的阈值非常严格,因为我们考虑了 top-1 元素,平均距离非常小(而且非常精确)所以我们得到了一个严格的阈值.

如果我们使用 top-k 方法(比如 k=10),我们会 select 最相似的 k 图像,我们采用与上述相同的方法.阈值变大,我们有更多的缓存命中,但误报的概率也更高。在这种情况下,我们获得 k*n 个预测。如果我们将 k 设置为大小为 m 的整个数据集,我们将获得 k*m 个预测。

我希望这能澄清我之前的 UPDATE

您应该在计算比率之前检查分子是否等于 0。例如

if (fp == 0):
  return 0.0
return fp/(fp + tn)

你没有 FP 也没有 TN 的事实表明你没有负面例子,只有正面例子。因此,您无法计算其中有多少比例会被您的 class 错误地 class 化为阳性。可能是0,也可能是100%,没法知道。

您需要收集一些 "gold" 底片,看看您的 classifier 对它们的表现如何。如果不这样做,您可能会 select 一个 "dummy" class 分配正 class 给所有观察结果的分配器,准确度为 100%。