Python中的等错误率

时间:2015-02-05 08:55:50

标签: python scipy scikit-learn metric

有人能告诉我如何在python中从ROC曲线计算等误差率(EER)?在scikit-learn中有计算roc曲线和auc的方法,但是找不到计算EER的方法。

from sklearn.metrics import roc_curve, auc

ANSRWER:

我想我实现了自己。

ROC EER的概念是直线连接之间的交叉点 (1,0)和(0,1)以及roc曲线。这是它相交的唯一点。对于a = 1且b = 1的直线,等式为 x+y =1 (x/a +y/b =1.0) 。因此交点将是真阳性率(tpr)和假阳性率(fpr)的值,其满足以下等式:

    x + y - 1.0 = 0.0

因此将方法实现为:

 def compute_roc_EER(fpr, tpr):
    roc_EER = []
    cords = zip(fpr, tpr)
    for item in cords:
        item_fpr, item_tpr = item
        if item_tpr + item_fpr == 1.0:
            roc_EER.append((item_fpr, item_tpr))
assert(len(roc_EER) == 1.0)
return np.array(roc_EER)

所以这里一个值是错误率,另一个值是准确度。

可能有人可以帮我验证。

6 个答案:

答案 0 :(得分:11)

对于通过Google搜索到达此处的任何其他人。格哈德指出,弗兰的答案是不正确的。正确的代码是:

fpr, tpr, threshold = roc_curve(y, y_pred, pos_label=1)
fnr = 1 - tpr
eer_threshold = threshold(np.nanargmin(np.absolute((fnr - fpr))))

请注意,这可以获得EER发生的阈值,即EER。 EER定义为FPR = 1 - PTR = FNR。因此,要获得EER(实际错误率),您可以使用以下内容:

EER = fpr(np.nanargmin(np.absolute((fnr - fpr))))

作为完整性检查,值应接近

EER = fnr(np.nanargmin(np.absolute((fnr - fpr))))

因为这是近似值。

答案 1 :(得分:4)

由长江复制表格How to compute Equal Error Rate (EER) on ROC

from scipy.optimize import brentq
from scipy.interpolate import interp1d
from sklearn.metrics import roc_curve

fpr, tpr, thresholds = roc_curve(y, y_score, pos_label=1)

eer = brentq(lambda x : 1. - x - interp1d(fpr, tpr)(x), 0., 1.)
thresh = interp1d(fpr, thresholds)(eer)

这给了我正确的EER值。还要记住,在文档中写的是y 真正的二进制标签,范围为{0,1}或{-1,1}。如果标签不是二进制的,则应明确指定pos_label y_score 目标得分,可以是正类的概率估计,置信度值,也可以是非阈值的决策度量(如在某些分类器上由“decision_function”返回。

答案 2 :(得分:0)

要估算等误差率EER,您需要在ROC中查找使TPR值等于FPR值的点,即{{1} }}。换句话说,你寻找abs的最小点(TPR-FPR=0

  1. 首先,您需要估算TPR-FPR曲线:
  2. ROC

    1. 要在python中计算fpr, tpr, threshold = roc_curve(y, y_pred, pos_label=1),您只需要一行代码:
    2. EER

答案 3 :(得分:0)

  

EER定义为FPR = 1 - PTR = FNR。    这是错误的。

由于FPR = 1-TNR(真负值),因此不等于FNR。

答案 4 :(得分:0)

相等错误率(EER)是您的错误pos率(fpr)==错误否定率(fnr)的地方[越小越好]

使用从roc sklearn计算中获得的fpr,tpr和阈值,可以使用此函数获取EER:

def compute_eer(fpr,tpr,thresholds):
    """ Returns equal error rate (EER) and the corresponding threshold. """
    fnr = 1-tpr
    abs_diffs = np.abs(fpr - fnr)
    min_index = np.argmin(abs_diffs)
    eer = np.mean((fpr[min_index], fnr[min_index]))
    return eer, thresholds[min_index]

答案 5 :(得分:0)

在他们在 Github 上的官方代码中有一个来自一篇相当新的论文 AutoSpeech 的参考代码。我想这是可靠的之一。

https://github.com/VITA-Group/AutoSpeech/blob/master/utils.py#L84

def compute_eer(distances, labels):
    # Calculate evaluation metrics
    fprs, tprs, _ = roc_curve(labels, distances)
    eer = fprs[np.nanargmin(np.absolute((1 - tprs) - fprs))]
    return eer

另一个选项是使用 VoxCeleb1 非官方基线,这是来自官方 VoxCeleb1 页面的链接:

https://github.com/clovaai/voxceleb_trainer/blob/master/tuneThreshold.py#L13

但是链接中的函数tuneThresholdfromScore不是简单的,那么AutoSpeech可能会更好。