首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >精确召回曲线置信区间的生成

精确召回曲线置信区间的生成
EN

Stack Overflow用户
提问于 2019-08-13 17:05:28
回答 1查看 3.3K关注 0票数 2

我有一个经过训练的模型的预测,我可以很容易地为数据生成一个精确召回曲线,因此,在精确召回曲线(AUPRC)下的区域也是如此。然而,我也试图为数据生成95%的置信区间,这是我很难找到的。我看过python的sklearn和R的pROC包(它确实有一些PR的用法,只是没有AUPRC),但是除了一些非常高水平的学术论文之外,我找不到任何东西,这些学术论文远远超出了我的头脑。

是否有人知道一个好的库,或能帮助我找到代码,以计算一个95%的置信区间为AUPRC?

谢谢任何能帮忙的人!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-13 18:01:59

我还没有见过一个现有的库在这样做,所以我假设您需要自己实现它。不用担心,没那么难。

我认为有三种可能的办法:

  1. 精确置信区间:将FN/FP解释为从二项分布中抽取的样本,具有精确的概率或召回率。使用二项式CDF来估计精确的间隔。这是最乏味的,但即使用较小的样本也能工作。
  2. 使用法线近似:基本上和以前一样,但用法分位数代替二项式。如果存在100+数据点,将产生与(1)几乎相同的结果
  3. 对1000个随机保留集进行重复分类,采用经验精度和召回分布作为置信区间。这是最容易实现的,但需要更多的计算。

UPD:关于实现的一些提示:

  • 精度为TP/(TP+FP) (正向预测的地面真实概率)
  • 回忆是TP/(TP+FN) (地面真理正向预测的概率)。

由于我们下面的文本将涉及多个概率,我将把这两种可能性重新定义为PR (精确性或召回性)

获得两者的置信区间的任务是完全相同的。我们基本上是在尝试估计一个Bernoulli变量的p(就像硬币翻转中头部的机会)。在这两种情况下,一系列翻转的积极结果的数量是相同的(TP)。唯一的区别是尝试的次数(分母,我将进一步提到它)。

因此,我们需要将PR值与观察结果的概率联系起来。我们希望找到一些PR值的区间,这样观察到的结果的概率要比某些α高。利用Bernoulli分布,我们可以根据正翻转概率PR (P)来估计观察结果(P)的概率:

代码语言:javascript
运行
复制
P = (n! / (tp! * (n-tp)!)) * (p ** tp) * ((1-p) ** (n-tp))

对p进行累积和反演是上面的选项1。正如我提到的,这是乏味的(但不是不可能的)。

方法2是使用中心极限定理,它基本上表示随机变量之和紧跟正态分布。在伯努利分布方差为p * (1-p),和方差与n成反比的情况下,我们可以求出和的标准差。现在,在概率为1-α的情况下,p应该在p_hat +/- z_score * standard_deviation_of_sum范围内.

最后,执行:

代码语言:javascript
运行
复制
# we'll need this for z-score
from scipy.stats import norm

def ci(tp, n, alpha=0.05):
    """ Estimates confidence interval for Bernoulli p
    Args:
      tp: number of positive outcomes, TP in this case
      n: number of attemps, TP+FP for Precision, TP+FN for Recall
      alpha: confidence level
    Returns:
      Tuple[float, float]: lower and upper bounds of the confidence interval
    """
    p_hat = float(tp) / n
    z_score = norm.isf(alpha * 0.5)  # two sides, so alpha/2 on each side
    variance_of_sum = p_hat * (1-p_hat) / n
    std = variance_of_sum ** 0.5
    return p_hat - z_score * std, p_hat + z_score * std

UPD2:计算AUC CI

sklearn.metrics.auc需要两个向量,xy值。在这里,精确性和召回可以互换使用。也就是说,x是估计精度值的向量,y是召回的上/下界,反之亦然- x是估计的召回值,y是精度的上、下界。

如果没有滑雪板,它可以大致近似如下:

代码语言:javascript
运行
复制
# assuming data is a list of (upper_precision, precision, lower precision, upper_recall, recall, lower_recall)

auc = 0
sort(data, key=lambda x: x[1])  # sort by precision
last_point = (0, 0)  # last values of x,y
for up, p, lp, ur, r, lr in data:
    # whatever was used to sort should come first
    new_point = (p, ur)  # or (r, up) for upper bound; (p, lr), (r, lp) for lower bound
    dx = new_point[0] - last_point[0]
    y = last_point[1]
    auc += dx * last_point[1] + dx * (new_point[1] - last_point[1]) * 0.5        
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57482356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档