Задачки про AUC (ROC)

Среди читателей блога много тех, кто только учит машинное обучение, и меня часто спрашивают про разные задачи и упражнения, поэтому начинаю рубрику задача.

Для начала два упражнения, которые мы недавно разбирали с магистрами ВМК МГУ.

Задача 1. Рассматривается задача классификации на два класса. На рис. 1 показаны объекты в пространстве ответов двух алгоритмов (ответы вещественные — до бинаризации по порогу). Вычислить AUC (ROC) для алгоритмов.

Рис. 1.
Рис. 1.1.

Задача 2. Какие значения F1-меры могут быть у классификатора в задаче с двумя непересекающимися классами (положительным и отрицательным) и тремя объектами?

Решение см. под катом… но сначала попробуйте сами, если интересно.

Решение 1. 
1.1. Сначала рассмотрим проекции на оси (т.е. ответы первого и второго алгоритма), см. рис. 1.2.

pic2
Рис. 1.2.

1.2. Построим ROC-кривые, см. рис 1.2 (по осям — False Positive Rate и True Positive Rate).

1.3. Вычислим площади под кривыми: 0.64 и 0.7, см. рис. 1.3.

pic3
Рис. 1.3.

Решение 2. Можно честно рассмотреть все возможные случаи, см. рис. 2.1  — выписаны все значения полноты (то же, что и True Positive Rate) и точности (то же, что и Positive Predictive Value):

Рис. 2.1.
Рис. 2.1.

F1-мера – среднее гармоническое точности и полноты, т.е. чисел из пар (1, 1), (1/2, 1), (2/3, 1), (1/3, 1), (1/2, 1/2), (0, 0). Поэтому все возможные значения F1-меры: 1, 0.8, 2/3, 0.5, 0.

Но до ответа можно догадаться и быстрее;)

Замечание 1. ROC = receiver operating characteristicAUC = area under the curveКогда имеют в виду «площадь под ROC» пишут AUROC или AUC ROC, я написал AUC (ROC). Иногда говорят «ROC-кривая», что тоже не совсем корректно, т.к. C — это как раз первая буква CURVE, но зато звучит хорошо.

Замечание 2. Как правило, студенты очень плохо понимают, что такое AUC, как вычислять это значение, как оно может меняться при изменении параметров алгоритмов. Поэтому я и составлял подобные задачки…

Да, кстати, вот интересная интерактивная визуализация (чтобы лучше понять AUC).

Задачки про AUC (ROC): 19 комментариев

  1. Александр, подскажите, пожалуйста, решая первую задачу возникли такие вопросы:
    1) не совсем понятно каким образом были выбраны точки TPR=4/5 FPR=2/5 и TPR=4/5 FPR=3/5 ?
    2) есть ли метод посчитать порог для бинаризации значений алгоритма при выборе точки на ROC кривой ?
    Спасибо

    • Здравствуйте!

      1) Да, собственно, они не выбраны… они никак не влияют на решение и ответ. Это просто иллюстрация, что при каком-то одном взятом пороге ROC-кривая проходит через нужную точку.
      Подробнее, как строить кривую —
      https://alexanderdyakonov.wordpress.com/2017/07/28/auc-roc-%d0%bf%d0%bb%d0%be%d1%89%d0%b0%d0%b4%d1%8c-%d0%bf%d0%be%d0%b4-%d0%ba%d1%80%d0%b8%d0%b2%d0%be%d0%b9-%d0%be%d1%88%d0%b8%d0%b1%d0%be%d0%ba/

      2) Если отвечать на вопрос, как Вы его поставили…
      при построении ROC-кривой Вы знаете, какая точка, какому порогу соответсвует.

      Если Вам просто дали ROC-кривую (кем-то построенную) — то определить порог в общем случае невозможно.
      Вы даже не знаете, в каких пределах варьируются ответы алгоритма (из кривой это никак не выводится).

      2б) Если отвечать на вопрос: «как по кривой выбрать бинаризацию?…»
      Зависит от того, какая бинаризация Вам нужна.
      Построив ROC-кривую, Вы получили зависимость TPR от FPR — теперь можно выбрать пару этих значений, которая Вас устроит.
      Как вариант, можно выбрать порог, который соответствует точке на ROC-кривой, которая максимально близка к точке (0, 1).

  2. Добрый день, я правильно понял, что мы зафиксировали количество объектов равны 5 с конца (всего объектов 7) и далее строим roc кривую по алгоритму.

  3. 1. «ROC = receiver operating characteristic»

    2. «Иногда говорят «ROC-кривая», что тоже не совсем корректно, т.к. C — это как раз первая буква CURVE»

    Не понятно, почему это не совсем корректно (C stands for characteristic).

  4. Критерий F1 можна преобразовать к виду: F1=TP/(TP+0.5*(FP+FN)). Получается отношение истинно_положительных к сумме истинно_положительных и усредненого числа ошибок первого и второго родов. Выходит какая-то страноватая свертка с неясной содержательной интерпретацией. Возможно ли для несбалансированой выбоки данных оценивать качество классификации не через F1, а по средней частоте безошибочной классификации каждого класса: 0.5*(TP/(TP+FP) + TN/(TN+FN)) ? В чем недостатки такого критерия, по сравнению с F1?

  5. Спасибо за термин. Жду Вашу новую статью о метриках качества классификации.

  6. Александр, спасибо за труд. Хороший у вас блог. Ниже код для проверки второй задачки, может быть кому-то будет интересно)

    def precision(tp,fp):
    return tp/(tp+fp) if (tp+fp) != 0 else None

    def recall(tp, fn):
    return tp/(tp + fn) if (tp + fn) != 0 else None

    def F(p, r, b = 1.0):
    if p == None or r == None:
    return None
    if (b**2)*p + r == 0:
    return 0
    return (b**2 + 1)*p*r/((b**2)*p + r)

    def uniq_f1_values(count):
    varicanceF = set()
    for i in range(count + 1):#все вариации фактического распределения гипотез
    factH0 = i
    factH1 = count — i
    for k in range(factH0 + 1):#результаты применения критерия по фактическим H0
    tn = k
    fp = factH0 — k
    for z in range(factH1 + 1):#результаты применения критерия по фактическим H1
    fn = z
    tp = factH1 — fn
    curP = precision(tp, fp)
    curR = recall(tp, fn)
    curF = F(curP, curR)
    if curF!=None:
    varicanceF.add(curF)
    return varicanceF

    c = 3
    uf1v = uniq_f1_values(c)
    print(sorted(uf1v))

Оставьте комментарий