Равная частота ошибок в Python

Может ли кто-нибудь сказать мне, как я могу вычислить равную частоту ошибок (EER) из кривой ROC в python? В 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)

Итак, здесь одно значение - это частота ошибок, а другое - точность.

Может быть, кто-нибудь поможет мне проверить.


person thetna    schedule 05.02.2015    source источник
comment
Ваша интерпретация верна - вы ищете позицию, в которой TPR + FPR == 1. Однако ваш код не является надежным, потому что мы не гарантируем, что список координат действительно включает точку, лежащую точно на линии EER. . Другими словами, весьма вероятно, что иногда вы будете len(roc_EER)==0. Вам нужно будет интерполировать между двумя точками (по одной с каждой стороны линии EER), чтобы сделать это более надежно. Или для простоты вы можете выбрать настройку с наименьшим расстоянием до линии EER, если вам нужно выбрать одну из протестированных конфигураций.   -  person Dan Stowell    schedule 25.11.2015


Ответы (6)


Для всех, кто попадает сюда через поиск в Google. Как указывает Герхард, ответ Фрэн неверен. Правильный код будет:

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

так как это приближение.

person James S.    schedule 03.09.2017
comment
Для всех, кто читает этот ответ: вместо fpr(np.nanargmin(np.absolute((fnr - fpr)))) должно быть fpr[np.nanargmin(np.absolute((fnr - fpr)))], потому что fpr - массив numpy - person Colonder; 25.03.2018

Копирование формы Как вычислить равную частоту ошибок (EER) на ROC от Changjiang:

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 - Целевые баллы, могут быть либо оценками вероятности положительного класса, либо значениями достоверности, либо мерой решений без порогового значения (как возвращается функцией «solution_function »На некоторых классификаторах).

person Colonder    schedule 29.03.2018

Равная частота ошибок (EER) - это когда ваша ложная ставка (fpr) == false negrate (fnr) [чем меньше, тем лучше]

используя fpr, tpr и пороги, которые вы получаете от вычисления roc sklearn, вы можете использовать эту функцию для получения 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]
person Ehab AlBadawy    schedule 15.08.2019

В их официальном коде есть справочный код из довольно новой статьи AutoSpeech. на Github. Думаю, это один из самых надежных.

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 Может быть лучше.

person daisukelab    schedule 12.06.2021

EER определяется как FPR = 1 - PTR = FNR. Это не правильно.

Поскольку FPR = 1-TNR (True Negative Rate) и, следовательно, не равно FNR.

person Naor Kalbo    schedule 09.01.2018

Чтобы оценить равную частоту ошибок EER, вы ищите точку в ROC, которая делает значение TPR равным значению FPR, то есть TPR-FPR=0. Другими словами, вы ищите точку минимума абс (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)))

person Fran    schedule 13.03.2017
comment
Это неверно. Равная частота ошибок = частота ложноположительных результатов - частота ложноотрицательных результатов. НЕ истинно положительный рейтинг - ложный положительный результат! - person Gerhard Hagerer; 11.04.2017