Closed. This question needs to be more focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
6个月前关闭。
我从经过训练的模型中得出预测,并且可以很容易地为数据生成精确调用曲线,从而也可以生成精确调用曲线(AUPRC)下的区域。但是,我也试图为数据生成95%的置信区间,但我很难为之寻找东西。我已经在sklearn中找到了用于R的python和pROC包(确实有一些PR的用法,只是没有AUPRC),但是除了一些相当高级的学术论文之外,我什么都找不到。
有谁知道一个好的图书馆,或者可以帮助我找到用于计算AUPRC 95%置信区间的代码?
谢谢任何能提供帮助的人!
上面的选项1是对p进行累加并将其取反。正如我提到的,这很乏味(但并非不可能。
方法2是使用Central Limit Theorem,它基本上表示随机变量的总和紧随正态分布。
假设伯努利分布的方差是
最后,实现:
UPD2:计算AUC CI
如果没有sklearn,可以这样近似:
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
6个月前关闭。
我从经过训练的模型中得出预测,并且可以很容易地为数据生成精确调用曲线,从而也可以生成精确调用曲线(AUPRC)下的区域。但是,我也试图为数据生成95%的置信区间,但我很难为之寻找东西。我已经在sklearn中找到了用于R的python和pROC包(确实有一些PR的用法,只是没有AUPRC),但是除了一些相当高级的学术论文之外,我什么都找不到。
有谁知道一个好的图书馆,或者可以帮助我找到用于计算AUPRC 95%置信区间的代码?
谢谢任何能提供帮助的人!
最佳答案
我还没有看到现有的库在这样做,所以我认为您需要自己实现它。不用担心,这并不难。
我看到三种可能的方法:
确切的置信区间:将FN / FP解释为从二项式分布中以概率Precision或Recall进行采样。使用二项式CDF估计确切间隔。这是最繁琐的,但即使是较小的样本也可以使用。
使用法线近似值:与以前基本相同,但使用法线分位数而不是二项式。如果有100个以上的数据点,将产生与(1)几乎相同的结果
对1000个随机坚持集进行重复分类,使用经验精度并针对置信区间使用召回分布。这是最容易实现的方法,但是将需要更多的计算。
UPD:有关实施的一些提示:
精度是TP /(TP + FP),即对于肯定的预测而言,地面事实为正的概率
回忆是TP /(TP + FN),即对地面真实为阳性的阳性预测的概率。
由于下面的文字涉及多个概率,因此我将这两个称为PR(用于Precision或Recall)
获取两者的置信区间的任务是完全相同的。我们基本上是在尝试估计Bernoulli变量的p(就像硬币抛掷时有正面的机会)。在这两种情况下,一系列翻转的积极结果数是相同的(TP)。唯一的区别是尝试次数(分母,我将在以后进一步称为n)。
因此,我们需要将PR的值与观察到的结果的概率相关联。
我们想要找到一些PR值间隔,以使观察到的结果的概率高于某些alpha值。
使用伯努利分布,我们可以根据阳性翻转PR(p)的机会来估计观察到的结果的概率(P):
P = (n! / (tp! * (n-tp)!)) * (p ** tp) * ((1-p) ** (n-tp))
上面的选项1是对p进行累加并将其取反。正如我提到的,这很乏味(但并非不可能。
方法2是使用Central Limit Theorem,它基本上表示随机变量的总和紧随正态分布。
假设伯努利分布的方差是
p * (1-p)
,并且和的方差与n成反比,我们可以找到和的标准差。现在,以1-alpha的概率,p应该在p_hat +/- z_score * standard_deviation_of_sum
范围内。最后,实现:
# 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
需要两个向量,x
和y
值。在这里,精度和召回率可以互换使用。即x
是估计精度值的向量,y
是召回率的上限/下限,反之亦然-x
是估计召回率值,而y
是精度的上限或下限。如果没有sklearn,可以这样近似:
# 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
关于python - 生成精确召回曲线的置信区间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57482356/
10-12 18:53