16

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

from sklearn.metrics import roc_curve, auc

答案:

我想我自己实现了。

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)

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

可能有人可以帮助我验证。

4

6 回答 6

24

对于通过谷歌搜索到达这里的任何其他人。正如格哈德指出的那样,弗兰的答案是不正确的。正确的代码是:

import numpy as np
from sklearn.metrics import roc_curve

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)))]

因为这是一个近似值。

于 2017-09-03T19:08:43.140 回答
9

复制表格如何计算长江的 ROC 上的等错误率 (EER):

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”返回)。

于 2018-03-29T11:45:13.697 回答
1

相等错误率 (EER) 是您的错误定位率 (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]
于 2019-08-15T16:55:35.107 回答
1

在他们在 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可能会更好。

于 2021-06-12T09:11:42.110 回答
0

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

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

于 2018-01-09T12:44:31.237 回答
-2

要估计等错误率EER,您需要在 中寻找ROC使TPR值等于FPR值的点,即TPR-FPR=0。换句话说,你寻找 abs( TPR-FPR)的最小点

  1. 首先,您需要估计ROC曲线:

fpr, tpr, threshold = roc_curve(y, y_pred, pos_label=1)

  1. EER在 python 中计算,您只需要一行代码:

EER = threshold(np.argmin(abs(tpr-fpr)))

于 2017-03-13T10:23:45.433 回答