Несколько классов означают расчет ROC - PullRequest
0 голосов
/ 05 марта 2019

Предположим, у меня есть (для простоты) детектор объектов 3 класса, и я хотел бы построить среднюю ROC-кривую.Я могу успешно построить ROC для каждого класса, как показано ниже.

ROC

Значения верны и кривые тоже.Проблема в том, что у меня (как вы можете видеть на графике) различное количество образцов для каждого класса.

Например (случайные данные):

Class 31
FPR :['0.00', '0.20', '0.30']
TPR :['0.00', '0.20', '0.30']

Class 39
FPR :['0.00', '0.20', '0.30', '0.40', '0.50']
TPR :['0.00', '0.20', '0.30', '0.40', '0.50']

Class 42
FPR :['0.00', '0.20', '0.30', '0.40', '0.50', '0.60', '0.70', '0.80']
TPR :['0.00', '0.20', '0.30', '0.40', '0.50', '0.60', '0.70', '0.80']

IЯ использую этот сценарий для оценки (отзыв / чувствительность уже рассчитаны, как вы можете видеть в строке 647 ), и я немного изменил его, чтобы вычислить также FPR (1-специфичность)следующим образом:

fpr = tp[:]
for idx, val in enumerate(tp):
    fpr[idx] = float(fp[idx]) / (fp[idx] + (gt_counter_per_class[class_name] - tp[idx]))

и нанесение ROC (напомним, против 1-специфичности) следующим образом:

plt.plot(fpr, rec, label='ROC curve of the class {0} (AUC = {1:0.2f})'
         ''.format(class_name, auc(fpr, rec)))

Я уже потратил часы на это, но не могу понять, какрассчитать среднее значение ROC по нескольким кривым ROC (для каждого класса), если для каждого класса имеется различное количество образцов.Спасибо за любую помощь.

1 Ответ

0 голосов
/ 05 марта 2019

Мне удалось решить эту проблему с помощью интерполяции для каждого класса отдельно

mean_fpr = np.linspace(0, 1, 100)
tprs.append(interp(mean_fpr, fpr, tps))

и затем вычислите средние значения

mean_tpr = np.mean(tprs, axis=0)

plt.plot(mean_fpr, mean_tpr, color='k',
     label='Mean ROC (AUC = {0:0.2f})'.format(mean_auc))

и результат выглядит так

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...