AUC ROC (площадь под кривой ошибок)

Площадь под ROC-кривой – один из самых популярных функционалов качества в задачах бинарной классификации. На мой взгляд, простых и полных источников информации «что же это такое» нет. Как правило, объяснение начинают с введения разных терминов (FPR, TPR), которые нормальный человек тут же забывает. Также нет разборов каких-то конкретных задач по AUC ROC. В этом посте описано, как я объясняю эту тему студентам и своим сотрудникам…

wallpaper

Допустим, решается задача классификации с двумя классами {0, 1}. Алгоритм выдаёт некоторую оценку (может, но не обязательно, вероятность) принадлежности объекта к классу 1. Можно считать, что оценка принадлежит отрезку [0, 1].

Часто результат работы алгоритма на фиксированной тестовой выборке визуализируют с помощью ROC-кривой (ROC = receiver operating characteristic, иногда говорят «кривая ошибок»), а качество оценивают как площадь под этой кривой – AUC (AUC = area under the curve). Покажем на конкретном примере, как строится кривая.

Пусть алгоритм выдал оценки, как показано в табл. 1. Упорядочим строки табл. 1 по убыванию ответов алгоритма – получим табл. 2. Ясно, что в идеале её столбец «класс» тоже станет упорядочен (сначала идут 1, потом 0); в самом худшем случае – порядок будет обратный (сначала 0, потом 1); в случае «слепого угадывания» будет случайное распределение 0 и 1.

table

Чтобы нарисовать ROC-кривую, надо взять единичный квадрат на координатной плоскости, см. рис. 1, разбить его на m равных частей горизонтальными линиями и на n – вертикальными, где m – число 1 среди правильных меток теста (в нашем примере m=3), n – число нулей (n=4). В результате квадрат разбивается сеткой на m×n блоков.

Теперь будем просматривать строки табл. 2 сверху вниз и прорисовывать на сетке линии, переходя их одного узла в другой. Стартуем из точки (0, 0). Если значение метки класса в просматриваемой строке 1, то делаем шаг вверх; если 0, то делаем шаг вправо. Ясно, что в итоге мы попадём в точку (1, 1), т.к. сделаем в сумме m шагов вверх и n шагов вправо.

pic1
Рис.1. Построение ROC-кривой.

На рис. 1 (справа) показан путь для нашего примера – это и является ROC-кривой. Важный момент: если у нескольких объектов значения оценок равны, то мы делаем шаг в точку, которая на a блоков выше и b блоков правее, где a – число единиц в группе объектов с одним значением метки, b – число нулей в ней. В частности, если все объекты имеют одинаковую метку, то мы сразу шагаем из точки (0, 0) в точку (1, 1).

AUC ROC – площадь под ROC-кривой – часто используют для оценивания качества упорядочивания алгоритмом объектов двух классов. Ясно, что это значение лежит на отрезке [0, 1]. В нашем примере AUC ROC = 9.5 / 12 ~ 0.79.

Выше мы описали случаи идеального, наихудшего и случайного следования меток в упорядоченной таблице. Идеальному соответствует ROC-кривая, проходящая через точку (0, 1), площадь под ней равна 1. Наихудшему – ROC-кривая, проходящая через точку (1, 0), площадь под ней – 0. Случайному – что-то похожее на диагональ квадрата, площадь примерно равна 0.5.

pic2
Рис. 2. ROC-кривые для наилучшего (AUC=1), случайного (AUC=0.5) и наихудшего (AUC=0) алгоритма.

Замечание. ROC-кривая считается неопределённой для тестовой выборки целиком состоящей из объектов только одного класса. Большинство современных реализаций выдают ошибку при попытки построить её в этом случае

Смысл AUC ROC

Сетка на рис. 1 разбила квадрат на m×n блоков. Ровно столько же пар вида (объект класса 1, объект класса 0), составленных из объектов тестовой выборки. Каждый закрашенный блок на рис. 1 соответствует паре (объект класса 1, объект класса 0), для которой наш алгоритм правильно предсказал порядок (объект класса 1 получил оценку выше, чем объект класса 0), незакрашенный блок – паре, на которой ошибся.

pic3.png
Рис. 3. Каждый блок соответствует паре объектов.

Таким образом, AUC ROC равен доле пар объектов вида (объект класса 1, объект класса 0), которые алгоритм верно упорядочил, т.е. первый объект идёт в упорядоченном списке раньше. Численно это можно записать так:

eq.png

Замечание. В формуле (*) все постоянно ошибаются, забывая случай равенства ответов алгоритма на нескольких объектах. Также эту формулу все постоянно переоткрывают. Она хороша тем, что легко обобщается и на другие задачи обучения с учителем.

Принятие решений на основе ROC-кривой

Пока наш алгоритм выдавал оценки принадлежности к классу 1. Ясно, что на практике нам часто надо будет решить: какие объекты отнести к классу 1, а какие к классу 0. Для этого нужно будет выбрать некоторый порог (объекты с оценками выше порога считаем принадлежащими классу 1, остальные – 0).

Выбору порога соответствует выбор точки на ROC-кривой. Например, для порога 0.25 и нашего примера – точка указана на рис. 4 (1/4, 2/3). см. табл. 3

pic4.png
Рис. 4. Выбор порога для бинаризации.

Заметим, что 1/4 – это процент точек класса 0, которые неверно классифицированы нашим алгоритмом (это называется FPR = False Positive Rate), 2/3 – процент точек класса 1, которые верно классифицированы нашим алгоритмом (это называется TPR = True Positive Rate). Именно в этих координатах (FPR, TPR) построена ROC-кривая. Часто в литературе её определяют как кривую зависимости TPR от FPR при варьировании порога для бинаризации.

Кстати, для бинарных ответов алгоритма тоже можно вычислить AUC ROC, правда это практически никогда не делают, поскольку ROC-кривая состоит из трёх точек, соединёнными линиями: (0,0), (FPR, TPR), (1, 1), где FPR и TPR соответствуют любому порогу из интервала (0, 1). На рис. 4 (зелёным) показана ROC-кривая бинаризованного решения, заметим, что AUC после бинаризации уменьшился и стал равным 8.5/12 ~ 0.71.

pic5.png
Рис. 5. Вычисление AUC ROC в случае бинарных ответов.

В общем случае, как видно из рис. 5 AUC ROC для бинарного решения равна

eq2.png

(как сумма площадей двух треугольников и квадрата). Это выражение имеет самостоятельную ценность и является «честной точностью» в задаче с дисбалансом классов (но об этом надо писать отдельный пост).

Задача

На ответах алгоритма a(x) объекты класса 0 распределены с плотностью p(a)=2-2a, а объекты класса 1 – с плотностью p(a)=2a, см. рис. 6. Интуитивно понятно, что алгоритм обладает некоторой разделяющей способностью (большинство объектов класса 0 имеют оценку меньше 0.5, а большинство объектов класса 1 – больше). Попробуйте угадать, чему здесь равен AUC ROC, а мы покажем как построить ROC-кривую и вычислить площадь под ней. Отметим, что здесь мы не работаем с конкретной тестовой выборкой, а считаем, что знаем распределения объектов всех классов. Такое может быть, например, в модельной задаче, когда объекты лежат в единичном квадрате, объекты выше одной из диагоналей принадлежат классу 0, ниже – классу 1, для решения используется логистическая регрессия (см. рис. 7). В случае, когда решение зависит только от одного признака (при втором коэффициент равен нулю), получаем как раз ситуацию, описанную в нашей задаче.

pic6.png
Рис. 6. Распределения в модельной задаче.
problem_ed.png
Рис. 7. Модельная задача (показана лишь подвыборка).

Значение TPR при выборе порога бинаризации равно площади, изображённой на рис. 6 (центр), а FPR – площади, изображённой на рис. 6 (справа), т.е.

eq3.png
Параметрическое уравнение для ROC-кривой получено, можно уже сразу вычислить площадь под ней:
eq4.png
Но если Вы не любите параметрическую запись, легко получить:

eq5.png
Заметим, что максимальная точность достигается при пороге бинаризации 0.5 (почему?), и она равна 3/4 = 0.75 (что не кажется очень большой). Это частая ситуация: AUC ROC существенно выше максимальной достижимой точности (accuracy)!

Кстати, AUC ROC бинаризованного решения (при пороге бинаризации 0.5) равна 0.75! Подумайте, почему это значение совпало с точностью?

В такой «непрерывной» постановке задачи (когда объекты двух классов описываются плотностями) AUC ROC имеет вероятностный смысл: это вероятность того, что случайно взятый объект класса 1 имеет оценку принадлежности к классу 1 выше, чем случайно взятый объект класса 0.

eq6.png

Для нашей модельной задачи можно провести несколько экспериментов: взять конечные выборки разной мощности с указанными распределениями. На рис. 8 показаны значения AUC ROC в таких экспериментах: все они распределены около теоретического значения 5/6, но разброс достаточно велик для небольших выборок. Запомните: для оценки AUC ROC выборка в несколько сотен объектов мала!

auc2
Рис. 8. Варьирование AUC ROC в экспериментах.

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

auc3.png
Рис. 9. ROC-кривые в экспериментах.

Замечание
Интересно, что в рассмотренной задаче исходные данные линейны (например, плотности – линейные функции), а ответ (ROC-кривая) нелинейная (и даже неполиномиальная) функция!

Замечание
Почему-то многие считают, что ROC-кривая всегда является ступенчатой функцией – лишь при построении её для конечной выборки, в которой нет объектов с одинаковыми оценками. Полезно посмотреть на интерактивную визуализацию ROC-кривых для нормально распределённых классов.

Максимизация AUC ROC на практике

Оптимизировать AUC ROC напрямую затруднительно по нескольким причинам:

  • эта функция недифференцируема по параметрам алгоритма,
  • она в явном виде не разбивается на отдельные слагаемые, которые зависят от ответа только на одном объекте (как происходит в случае log_loss).

Есть несколько подходов к оптимизации

  • замена в (*) индикаторной функции на похожую дифференцируемую функцию,
  • использование смысла функционала (если это вероятность верного упорядочивания пары объектов, то можно перейти к новой выборке, состоящей из пар),
  • ансамблирование нескольких алгоритмов с преобразованием их оценок в ранги (логика здесь простая: AUC ROC зависит только от порядка объектов, поэтому конкретные оценки не должны существенно влиять на ответ).

Замечания

  • AUC ROC не зависит от строго возрастающего преобразования ответов алгоритма (например, возведения в квадрат), поскольку зависит не от самих ответов, а от меток классов объектов при упорядочивании по этим ответам.
  • Часто используют критерий качества Gini, он принимает значение на отрезке [–1, +1] и линейно выражается через площадь под кривой ошибок:

Gini = 2 ×AUC_ROC – 1

  • AUC ROC можно использовать для оценки качества признаков. Считаем, что значения признака — это ответы нашего алгоритма (не обязательно они должны быть нормированы на отрезок [0, 1], ведь нам важен порядок). Тогда выражение 2×|AUC_ROC — 0.5| вполне подойдёт для оценки качества признака: оно максимально, если по этому признаку 2 класса строго разделяются и минимально, если они «перемешаны».
  • Практически во всех источниках приводится неверный алгоритм построения ROC-кривой и вычисления AUC ROC. По нашему описанию легко эти алгоритмы исправить…
  • Часто утверждается, что AUC ROC не годится для задач с сильным дисбалансом классов. При этом приводятся совершенно некорректные обоснования этого. Рассмотрим одно из них. Пусть в задаче 1 000 000 объектов, при этом только 10 объектов из первого класса. Допустим, что объекты это сайты интернета, а первый класс – сайты, релевантные некоторому запросу. Рассмотрим алгоритм, ранжирующий все сайты в соответствии в эти запросом. Пусть он в начало списка поставил 100 объектов класса 0, потом 10 – класса 1, потом – все остальные класса 0. AUC ROC будет довольно высоким: 0.9999. При этом ответ алгоритма (если, например, это выдача поисковика) нельзя считать хорошей: в верхней части выдачи 100 нерелевантных сайтов. Разумеется, нам не хватит терпения пролистать выдачу и добраться до 10 тех самых релевантных.
    В чём некорректность этого примера?! Главное: в том, что он никак не использует дисбаланс классов. С таким же успехом объектов класса 1 могло быть 500 000 – ровно половина, тогда AUC ROC чуть поменьше: 0.9998, но суть остаётся прежней. Таким образом, этот пример не показывает неприменимость AUC ROC в задачах с дисбалансом классов, а лишь в задачах поиска! Для таких задач есть другие функционалы качества, кроме того, есть специальные вариации AUC, например AUC@k.
  • В банковском скоринге AUC_ROC очень популярный функционал, хотя очевидно, что он также здесь не очень подходит. Банк может выдать ограниченное число кредитов, поэтому главное требование к алгоритму – чтобы среди объектов, которые получили наименьшие оценки были только представители класса 0 («вернёт кредит», если мы считаем, что класс 1 – «не вернёт» и алгоритм оценивает вероятность невозврата). Об этом можно судить по форме ROC-кривой (см. рис. 10).
pic10
Рис. 10. Форма ROC-кривой, которая соответствует случаю, когда группа объектов с самыми низкими оценками имеет метки 0.

П.С.

Если Вы дочитали до конца — можете попробовать пройти тест по AUC ROC (авторский, публикуется впервые). Задачи теста можно обсуждать в комментариях. Любые замечание по тексту — смело пишите!

Что можно ещё почитать…

 

 

Реклама

AUC ROC (площадь под кривой ошибок): 88 комментариев

  1. >Алгоритм выдаёт некоторую оценку (может, но не обязательно, вероятность) принадлежности объекта к классу 1.

    Александр, можно попросить подробнее описать этот момент? При каких условиях допустимо трактовать эти оценки именно как вероятности?

    Например, если в RandomForest Classifier в случае сильного дисбаланса классов мы выставляем class_weight =balanced, то на выходе получаем оценки достаточно далёкие от вероятностей по смыслу?
    Спасибо!

    • В контексте данной статьи (когда мы ориентируемся на функционал AUC ROC), нас вообще не интересует «что именно выдаёт алгоритм», главное, чтобы объекты правильно упорядочивались.

      Если Вам надо, чтобы алгоритм выдавал именно вероятность принадлежности к классу, тогда надо
      1) ориентироваься на другой функционал качества, например, log_loss,
      2) соответствующим образом обрабатывать ответы алгоритма, см. например http://scikit-learn.org/stable/modules/calibration.html

      • Подскажите, пжл, как можно красиво (если вообще можно) расширить использование д. метода для оценки совокупности признаков (речь об обзаце «AUC ROC можно использовать для оценки качества признаков….»), т.е. если нужно оценить результат по матрице N*5 (5 признаков).
        Понятно, что, например, можно посчитать 5 таких оценок, соответственно взять ср., макс. и .т.д.
        (И тут, имхо, еще важно учесть, чтобы все 5 были «в одну сторону», т.к. по всем 5 могут быть высокие оценки, но по 2 с «одним знаком», а по 3 с другим)
        Но м.б. существуют более красивые решения?

      • Здравствуйте! Извините, что поздно отвечаю… всё не доходили руки (хотя Ваш вопрос видел). Если я правильно понял, то вы хотите оценивать важность некоторого подмножества признаков, а не признаков по отдельности. Если при этом хотите использовать AUC ROC, то лучше делать так.

        Рассмотрим задачу классификации на два класса: 0 и 1.

        1) Выберите какую-нибудь ПРОСТУЮ модель классификации/ регрессии (если классификации, то она должна получать также вероятности принадлежности к классу 1)

        В зависимости от природы данных подойдёт линейная модель или RF с небольшой глубиной деревьев

        2) Обучите модель используя только подмножество признаков

        3) AUC ROC ответов модели (вероятностей или регрессионных меток) и будет качеством признакового подпространства

        Тут тонкий вопрос, где его считать: на отложенном контроле или на обучении. Во многих случаях можно и на обучении (у нас простая модель, нас интересует только возможность настройки на данном подмножестве признаков и т.п.).

  2. Александр, добрый день! У меня возник вопрос по первому заданию в тесте: «в тестовой выборке 10 объектов…». Не очень понятно, почему максимальный auc_roc тот, что указан в ответе?
    Я рассуждал вот как: у нас 10 объектов, значит вопрос, как сделать площадь квадрата максимальной, если мы можем двигаться вверх и вправо на единички (движение вверх -> класс 1, движение вправо -> класс 0).
    Максимум, который можно получить — это пять шагов вверх, пять вправо, площадь квадрата 25. Ошиблись один раз в самом конце -> max auc_roc = 24/25.

    Где же ошибка?

    И спасибо огромное за этот пост, я теперь понимаю гораздо лучше, что такое auc_roc.

    • Здравствуйте! Еще раз перечитайте пост. ROC-кривая не обязательно ступенчатая, она может на некоторых участках идти «по диагонали’ и ошибаться мы можем «на половину»… Такой подсказки достаточно?

  3. «…Практически во всех источниках приводится неверный алгоритм построения ROC-кривой и вычисления AUC ROC…»
    Пжл, приведите примеры верных и неверных на Ваш взгляд реализаций алогитмов со ссылкой на библиотеки или гитхаб.
    sklearn.metrics.roc_auc_score — в числе каких?

    • Я писал не про реализации, а про описания алгоритма. Почти все — неверные. Например, я набираю в гугле «AUC ROC», иду по первой же ссылке
      http://www.machinelearning.ru/wiki/index.php?title=ROC-%D0%BA%D1%80%D0%B8%D0%B2%D0%B0%D1%8F
      и там алгоритм неверный. Почему — читайте пост.

      Алгоритм здесь
      https://basegroup.ru/community/articles/logistic
      тоже не совсем хороший — он даёт правильный результат лишь при удачном выборе шага.

      Что касается sklearn.metrics.roc_auc_score, то там всё в порядке. В библиотеке, которой пользуется такое огромное сообщество, иначе и быть не может. Для проверки можно использовать пример из поста:

      from sklearn.metrics import roc_auc_score
      roc_auc_score([0, 0, 0, 1, 1, 1, 0], [0.5, 0.1, 0.2, 0.6, 0.2, 0.3, 0.0]) # 0.79166666666666663

  4. Здравствуйте! Кажется, у вас опечатка «Интуитивно понятно, что алгоритм обладает некоторой разделяющей способностью (большинство объектов класса 1 имеют оценку меньше 0.5, а большинство объектов класса 1 – больше).»
    Наверное все же большинство объектов класса 0 имеют оценку меньше 0.5

  5. Спасибо за статью!
    Возможно, для лучшего понимая можно заменить «Важный момент: если у нескольких объектов значения МЕТОК -> ОЦЕНОК (2-я колонка) равны …»

  6. […] Для понимания доказательства необходимо базовое понимание метрики ROC-AUC — что это вообще такое, как строится график и в каких осях. Рекомендую статью из блога Александра Дьяконова «AUC ROC (площадь под кривой ошибок)» […]

  7. […] Для понимания доказательства необходимо базовое понимание метрики ROC-AUC — что это вообще такое, как строится график и в каких осях. Рекомендую статью из блога Александра Дьяконова «AUC ROC (площадь под кривой ошибок)» […]

  8. Можно ли сказать, AUC ROC=1-sum(penalty), где penalty — это массив штрафов за ошибочную классификацию каждого объекта. penalty(i) — зависит от уверености в результатах классификатора. Штрафы объектов с соседними уверенностями (соседними рангами) отличаются на одинаковую величину. Штрафы за ошибки 1->0 возрастают слева направо, а штрафы за ошибки 0->1 — справа налево. В окрестности пороговой точки штрафы минимальные.

    • Вроде нет… Можете привести на примере, как строится массив штрафов penalty, например,
      1) когда правильные ответы = [1, 0], ответы алгоритма = [0.5, 0.5]
      2) по = [1 0 1] оа = [0.7, 0.5, 0.1]
      3) по = [1 0 1 0] оа = [0.9, 0.8, 0.4, 0.0]

  9. Отличная статья, она очень многое по поводу AUC ROC ставит на свои места. Хочется только сделать небольшое замечание по поводу применимости этого функционала качества для задач с сильным дисбалансом классов. Обоснование некорректности AUC ROC для подобных задач, которое было приведено в статье, может и некорректное, но это не опровергает само утверждение, что AUC ROC не всегда адекватно для задач с дисбалансом классов.
    Приведу такой пример: предположим у нас есть 20+N объектов (N — натуральное число), из которых только 10 — это объекты первого класса. За каждый угаданный объект первого класса вам платят к примеру $100, а за каждый не угаданный объект нулевого класса — вы платите $100, за каждый угаданный объект нулевого класса и НЕ угаданный объект первого класса вы не получаете и не платите ничего. Допустим у вас есть алгоритм, который позволяет угадывать к какому классу принадлежит объект, но ранжирует объекты он особым образом:
    вероятность p1 он выдает для какого-то объекта из класса 0,
    вероятность p2 — для объекта класса 1,
    p3 — для объекта класса 0,
    p4 — объект класса 1,
    p5 — объект класса 0,
    ….
    p19 — объект класса 0,
    p20 — объект класса 1
    причем p(i)>p(i-1)
    для всех остальных N объектов (они будут соответствовать нулевому классу) вероятность, которую выдает алгоритм , будет составлять менее p20, то есть p1>p2>p3>p4>….>p19>p20>pn.
    Очевидно, что если использовать описанный алгоритм, то при любом выбранном пороге и вне зависимости от N ваш выигрыш не привысит $0. Однако чем больше N — тем больше дисбаланс классов и при этом тем больше AUC ROC. Так при N=1, AUC ROC=0.5, и классы почти не разбалансированные (10 объектов класса №1 и 11 объектов класса №0). Однако если N=10 (10 объектов первого класс и 20 — нулевого), то AUC ROC=0.725, хотя по-прежнему с использованием этого алгоритма наш результат не превысит $0 при любом пороге. Более того: при N стремящимся к бесконечности, AUC ROC будет стремиться к 1 !!! Согласитесь, что подобные показатели рассмотренной метрики могут ввести в заблуждение.

    • Здравствуйте, Александр!

      Согласен!
      Отличный пример. Кстати, он Ваш? Сразу захотелось его где-нибудь использовать при случае…

      Но смотрите, при всей корректности примера Вы попадаете в ловушку, которую сами же построили для AUC… Вы придумали задачу, в которой есть цель — заработать как можно больше денег. А потом показали, что AUC Вам в этом не помогает. Ну так, естественно, надо было брать функционал напрямую связанный с Вашей целью! В этом примере AUC страдает не сколько из-за дисбаланса, сколько из-за «игры», которую Вы придумали. Классы-то наш алгоритм при стемлении N к бесконечности нормально «растаскивает». Я бы хотел, что бы во многих задачах, где очень мало объектов 1 класса, он работал, как Вы описали. Например, если мы обнаруживаем возгорания по показаниям датчиков, то среди самых сильных 20 сигналов 10 соответствовали бы реальным пожарам (и мы бы не пропустили ни одно возгорание). Но Вы умело придумали игру, в которой именно такой алгоритм плох (собственно, как и я слукавил, придумав случай, где он хорош).

      Т.е. здесь AUC плох не из-за дисбаланса,
      а из-за дисбаланса + правил игры!

      Хотя, конечно, я понимаю, что в любой задаче есть контекст, именно он и придаёт ей смысл. И так или иначе, оценивая функционал, мы именно опираемся на то, помогает он нам решить задачу или нет. В этом смысле Ваш пример корректен, поскольку Вы фиксируете контекст и варьируете дисбаланс — при этом наблюдая «неадекватное поведение» функционала.

      Тут только один вывод и правильный ответ. Каждый функционал качества подходит ровно для тех задач, для которых он соответствует смыслу решения. Если есть чётко определённый смысл (бизнес-цель, цель игры и т.п.) надо его и формализовать в виде функционала, а не требовать от какого-нибудь «стандартного», чтобы он был хорош и для нашей задачи.

      Спасибо большое за внимание и замечание!

      • Спасибо за подробный и довольно оперативный ответ. Пример придуман по мотивам тех «грабель», на которые мне пришлось «наступить» самому. Если этот пример поможет избежать подобных проблем кому-то ещё, я буду только рад. Думаю, в качестве резюме можно сказать, что в мире метрик качества нет «волшебной пули», позволяющей всесторонне оценить качество любого алгоритма и AUC ROC здесь не исключение. В этой связи, думаю, было бы полезно попытаться классифицировать различные задачи и каждому классу поставить в соответствие наиболее подходящую метрику оценки качества. Может быть вы могли бы рекомендовать какие-нибудь публикации на эту тему?

      • Так сходу ничего в голову не приходит… я сам сейчас пытаюсь написать небольшую книжку, в частности, описать там все метрики. Поэтому смотрю, что в принципе есть… пока не нашёл какой-то хорошей их классификации.

        Я думаю, задачи классифицировать не стоит. Постоянно появляются какие-то новые или какие-то новые особенности в старых. Грубое разграничение в обучении с учителем есть: классификация, регрессия, ранговая регрессия, рекомендации (последние 2 типа часто даже не выделяют). А дальше начинается разнообразие метрик — вот их-то, возможно, и следует классифицировать. Но оно тоже условное, поскольку все базовые библиотеки ML, как правило, ориентированы на несколько стандартных (и никто в сообществе не ворчит по этому поводу).

    • Добрый день, у меня была задача классификации с несбалансированными классами, оптимизировать хотелось по ROC AUC, использовал sklearn и сразу заметил, что со scorer=’roc_auc’ решётчатый поиск находит решения, где точность миноритарного класса равна нулю. Переключился на кастомный скорер roc_auc_weighted = make_scorer(roc_auc_score, average=’weighted’), это изменило вещи в лучшую сторону. Может, кому-то поможет… )

  10. Алексадр, добрый день!
    Подскажите, пжл, красивое решение для такой хотелки:
    from sklearn.metrics import roc_auc_score
    y_true = np.array([0, 0, 1, 1])
    y_scores = np.array([0.1, 0.4, 0.35, 0.8])
    вызвали roc_auc_score(y_true, y_scores) , получили оценку-скаляр

    а хотелось бы получить «за один проход» еще и (в порядке убывания хотения):
    — значение точки разделение на классы — 1 if y >= ??? else 0 — это же фактич. бинарное дерево, правильно?
    — коэф-ты сигмоиды, которая наиболее оптимально вписывается в этот y_scores

    Есть ли пример кода как это сделать красиво и быстро?
    Заранее спасибо.

    • Ну не совсем за один проход… но можно просто настроить логистическую регрессию на данных y_scores с ответами y_true. Отсюда получите коэффициенты сигмоиды и точку разделения… но по поводу точки — ту вопрос, а какая Вам нужна? ROC-кривая как раз и показывает все возможные пары TPR, FPR для разных порогов (можно выбрать подходящий порог для отсечения).

      • Спасибо за правильный вопрос, подумаю )))

  11. […] Полный текст задачи доступен по → ссылке. Вкратце: есть 10 гб данных, где каждая строка содержит три json’а вида «ключ: счетчик», некая категория, некая временная метка и идентификатор пользователя. Одному пользователю может соответствовать множество записей. Требуется определить к какому классу относится пользователь, первому или второму. Метрикой качества для модели является ROC-AUC, о котором отлично написано в блоге Александра Дьяконова[1]. […]

  12. СПАСИБО за пост и блог !
    Вопрос: чем аук так хорош в задачах классификации ? Почему именно он ?

    Например, взглянем на формулу для коэффициента корреляции Кендалла — она крайне похожа, на формулу аука, приведенную выше — разница «лишь» в знаменателе. http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BE%D1%8D%D1%84%D1%84%D0%B8%D1%86%D0%B8%D0%B5%D0%BD%D1%82_%D0%BA%D0%BE%D1%80%D1%80%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%B8_%D0%9A%D0%B5%D0%BD%D0%B4%D0%B5%D0%BB%D0%BB%D0%B0

    Но на практике оказывается Кендалл дает что-то совсем другого боя — он частенько почти совпадает с обычным (Пирсоновским) коэффициентом корреляции (и не только для нормальных данных, где это обосновано теорией).

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

      Чем хорош: обобщается на различные случаи, понятная вероятностная интерпретация.

      Если присмотреться, у него не так много альтернатив…

      По Вашей ссылке, если посмотреть на «степень согласия Кенделла», то это «почти» АУК РОК. Различие, действительно, в нормировке
      1) оно не на [0,1], а на [-1,+1]
      2) оно именно для сравнения двух векторов и в применении к классификации не учитывает дисбаланс классов.

  13. Здравейте, а как се борави с ROC ако имаме повече от един клас, например 5 класа? Благодаря предварително.

  14. Добрый день, в Вашем тесте вопрос 2 — Объекты нулевого класса получили оценки 0.1, 0.4, 0.5, а первого – 0.2, 0.8.
    Как нам оценить пороговое значение, чтобы m и n — объекты класса 1 и 0 среди правильным меток, если мы не можем сказать где порог и следовательно не можем сказать какие правильны?

    • Не понял вопрос. Для вычисления AUC ROC не надо знать никаких пороговых значений. Читайте пост — там всё написано.

      • Спасибо, я понял где была ошибка. Можно вопрос:
        если нам, например, дана выборка из 3 объектов, где имеется правильный ответ примера и предсказание этого примера (0.5; 0) (0.5; 1) (2; 0.5). Как для него найти AUC ROC?

      • AUC ROC в задачах бинарной классификации вычисляется так, как написано в этом посте. В Ваш пример немного странный если первый элемент пары вероятность класса 1, то тогда некорректна пара (2; 0.5), если это на самом деле (0.5, 2), то тогда у Вас три класса с метками 0, 1, 2, но тогда должно быть и три вероятности в ответах: принадлежность к классу 0, 1 и 2.

      • Запись примера корректна. Привожу описание входных и выходных данных:

        В первой строке указано одно число N — число объектов в выборке ( ). В каждой из следующих N строк указаны два вещественных числа (с точностью не более 6 цифр после десятичной точки): правильный ответ примера ti и предсказание модели yi для этого примера.
        Гарантируется, что существуют два таких номера i и j, что ti ≠ tj.
        Пример 1
        Ввод Вывод
        2
        0 0
        1 1 1.000000
        Пример 2
        Ввод Вывод
        2
        0 1
        1 0 0.000000
        Пример 3
        Ввод Вывод
        3
        0.5 0 0.500000
        0.5 1
        2 0.5
        Необходимо посчитать обобщённый AUC.

      • Если бы было:
        Пример 3
        Ввод Вывод
        3
        0 0.5
        1 0.5
        2 0.5

        Я согласен, что ответ 0.500000.
        А в таком виде — запись некорректна. Правильный ответ в задаче классификации (т.е. метка объекта) вряд ли будет равным 0.5 (мы, конечно, можем так метку назвать, но это вряд ли).

  15. Это задача с яндекс контеста https://contest.yandex.ru/contest/8470/messages/. Чтобы понять общий алгоритм, я вначале попытался решить частные примеры. Для этого я построил Confusion matrix и далее нашел TPR, FPR. Для первых двух примеров все сошлось, но третий… Элементы confusion matrix будут нулевыми.
    В любом случае, спасибо за ответы! У Вас интересный блог

    • Ну… там же они вводят свой функционал качества, который назвали «обощённый AUC ROC»! Подставьте просто в формулу-определение и всё получится.

  16. На рисунке 1 неоткуда взяться диагональной черточке если следовать, как и предлагается, таблице два.

  17. Добрый день! Александр, рисунок 1 строится по таблице 2. Почему в какой-то момент линия идет по диагонали? ROC AUC должен быть 9/12, а не 9,5/12 или я ошибаюсь? Заранее благодарю.
    Статья — супер!

    • Здравствуйте! Посмотрите предыдущий вопрос к этому посту. Посмотрите также текст после выделенного жирным «Важный момент» в посте.

    • Здравствуйте! Я об этой знаю, хотя плотно её никогда не вычитывал — но там в целом всё по делу. Есть ещё на эту тему: Ferri C, Hernández-Orallo J, Flach PA. A coherent interpretation of AUCas a measure of aggregated classification performance. In: Proceedingsof ICML 2011 – the 28th International Conference on Machine Learning.Norristown: Omnipress; 2011. p. 657–64

  18. Александр, спасибо за статью, помогла разобраться в теме.
    Но есть вопрос — мне непонятно, почему на рис.2 алгоритм правой кривой вы назвали наихудшим. Ведь наихудшим следует назвать алгоритм угадывания, т.е. имеющий среднюю кривую. А алгоритм с правой кривой отработал отлично — просто его оценку надо ранжировать по возрастанию, а не по убыванию (как в табл. 2 рисунок выше). Тогда алгоритм даст результат 100%.
    Чем больше площадь между кривой и диагональю — тем меньше угадывания. Если, конечно, эта площадь лежит с одной стороны диагонали.
    Разве нет?

    • И да и нет. Вы немного переобучились (в смысле, overfitting). Представьте, что я задаю вопросы студенту на экзамене, например, сколько будет 2 + 2 — 4 или 5? Он отвечает 5. Потом следующий вопрос. И так 10 раз — он дал 10 неверных ответов. Я хочу поставить «неуд», а он возражает: надо было просто инвертировать мои ответы, тогда всё правильно. Прав ли студент?

      Если алгоритм показывает стабильно AUCROC=0, тогда конечно он полезен. Но всё равно он не хороший — хороша его инверсия. В случае однократной проверки, мы смотрим на ответы и сравниваем их с истиной. В этом случае самое плохое, что может быть — полное несоответствие.

  19. Здравствуйте! Спасибо большое за статью! Подскажите, пожалуйста, а то я совсем потерялась, как построить ROC-кривую по модели бинарной логистической регрессии (в модели 3 фактора сразу)? По каким переменным? У меня есть 1/0 — болен/здоров и вероятность наступления события (болен), рассчитанное по формуле логистической регрессии для каждого пациента. ROC-кривую строить по этим двум столбцам переменных или нет? Я выполняю анализ в SPSS statistic. Заранее благодарю за ответ!

    • Вот в статье выше есть «Пусть алгоритм выдал оценки, как показано в табл. 1.» — в Вашем случае оценки — ответы (вероятности) логистической регрессии.

  20. Алексадр, прекрасная статья. Возник вопрос по интерпретации Джини.
    Как я понимаю — Джини лучше ловит дисбаланс классов. Но все равно не могу придумать адекватный для себя ответ — почему в тех или иных задачах классификации используют именно Джини, а не ROC-AUC? Не поможете ли вы небольшим пояснением?

    • Здравствуйте!
      Неправильно понимаете. Джини и ROCAUC линейно выражаются друг через друга. Нет такого, что в какой-то задаче один функционал предпочтительнее другого.

  21. Добрый день. А можно ли использовать эту метрику в задачах поиска выбросов, например. И если я хочу в качестве Baseline использовать вариант, когда выбросы не находятся. Так как данных много, а выбросов мало и удалять лишние данные совсем не хочется, получается FPR = 0 и TPR = 0. Можно ли построить для такого варианта ROC-кривую или это будет наихудший вариант, потому что он не определил ни одного выброса, но как например его сравнивать тогда с вариантом который определил несколько выбросов и но при этом удалил половину хороших данных?

    • Честно говоря, не понял Вашу идею — как Вы собрались использовать эту метрику для поиска выбросов. Но обращаю внимание, что эта метрика не очень чувствительна к одиночным ошибкам в таргете.

  22. […] Первый подход, который мы использовали для решения поставленной задачи основан на существующем алгоритме разработанным нами ранее. Алгоритм из каждого изображения позволяет извлечь фиксированный набор различных количественных признаков. Например, длина колоса, площадь остей и т.д. Подробное описание алгоритма есть в статье Genaev et al., Morphometry of the Wheat Spike by Analyzing 2D Images, 2019. Используя данный алгоритм и методы машинного обучения, нами были обучены несколько моделей для предсказания типов плоидности. Мы использовали методы логистической регрессии, случайный лес и градиентный бустинг. Данные были предварительно нормированы. В качестве меры точности мы выбрали AUC. […]

  23. Спасибо за статью, самое обстоятельное, что удалось найти!

    В формуле AUC-ROC= P(a(xi) > a(xj) | yi = 1, yj = 0) никак не могу понять следующее:

    В случае бинаризованного решения при пороге 0.5, если воспользоваться этой формулой и найти вероятность графически на основе рисунка 7, то получим что наша вероятность — это вероятность кинуть первую точку под диагональ (yi=1) справа от вертикали x = 0.5 (a(xi) = 1) !И! вторую точку над диагональю (yj=0) слева от серединной вертикали (a(xj)=0). Площади соответствующих областей — по 3/4. Итого после перемножения (я догадываюсь, что где-то тут беда) получаем p=9/16

    Буду очень благодарен за указание на ошибку.

    Точность такой подход дает правильную — суммарная площадь над диагональю слева и под диагональю справа = 3/4

  24. Добрый день! Есть некоторые уточнения по статье.
    1. Цитирую: «Чтобы нарисовать ROC-кривую, надо взять единичный квадрат на координатной плоскости, см. рис. 1, разбить его на m равных частей горизонтальными линиями и на n – вертикальными, где m – число 1 среди правильных меток теста (в нашем примере m=3), n – число нулей (n=4). В результате квадрат разбивается сеткой на m×n блоков.»
    Однако у нас разбиение происходит на m-1 и n-1 линий, а количество блоков как раз получается mxn.
    2. «Сетка на рис. 1 разбила квадрат на m×n блоков. Ровно столько же пар вида (объект класса 1, объект класса 0), составленных из объектов тестовой выборки.»
    Итого получается по рисунку 12 объектов, но в таблице у нас 7 объектов, т.е пар должно было получиться 14? Или я ошибаюсь? Поправьте, если я не прав. Спс

  25. Здравствуйте. Подскажите пожалуйста, как сравнить площади многофакторных регрессионных моделей между собой, в которых заложено несколько факторов? В моем статтпакете только метод Делонга, просто для рок-кривых

  26. Александр, добрый день! Спасибо за статью! Возник вопрос к описанию подходов к оптимизации AUC ROC:
    «Есть несколько подходов к оптимизации… использование смысла функционала (если это вероятность верного упорядочивания пары объектов, то можно перейти к новой выборке, состоящей из пар)».
    Если решается задача бинарной классификации, то составляются пары (все возможные?), для каждой пары определяется признаковое описание (например комбинация признаков каждого из объектов), а как определяется таргет для пары?

    • Здравствуйте.
      Можно ограничиться только парами объектов из разных классов. Для пар с метками (0, 1) — новая метка=1, для пар с метками (1, 0) — новая метка=0.
      Т.е. теперь алгоритм будет определять, верно ли упорядочена пара.

  27. Важный момент: если у нескольких объектов значения оценок равны, то мы делаем шаг в точку, которая на a блоков выше и b блоков правее, где a – число единиц в группе объектов с одним значением метки, b – число нулей в ней.
    Я уже здесь НИЧЕГО не понял: почему идет не лесенка (1, 0, 1, 0, 1, 0, 0). Ведь только в конце горизонтальная линия идет (потому что два нуля). Почему перед ними идет «гипотенуза»???????????

    • Вот потому что Вы сами процитировали: здесь у двух объектов с разными классами одинаковая оценка, поэтому одновременно шагаем вверх и вправо.

  28. Александр, спасибо за статью. Меня интересует задача из вашего вопросника-

    Может ли сумма двух алгоритмов с AUC_ROC = 0.5 иметь AUC_ROC = 1 (имеется в виду, что мы суммируем оценки, полученные разными алгоритмами)?

    Правильный ответ, да. Хотя кажется, что если для каждого AUC_ROC = 0.5 — все веса признаков одинаковые, тогда линейная комбинация этих весов — не изменит никак ранжирования. (это просто линейная операция с каждым из алгоритмов, соответсвенно, ничего не изменится). Почему же правильный ответ — да в этом случае?

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s