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 fp
或 tn
,所以 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%。
这个问题是关于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 fp
或 tn
,所以 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%。