Самый популярный показатель может быть не таким значимым, как вы думаете

Когда я начал работать специалистом по данным, я использовал ROC-кривую для измерения качества модели. Ведь это стандарт. Однажды более опытный коллега сказал мне:

«Вам следует прекратить использовать кривую ROC, вместо этого следует использовать среднюю точность».

Тут я не особо задумывался над этой фразой. Я просто последовал совету коллеги. В конце концов, он был очень опытным, а я был новичком. Конечно, он должен был знать лучше меня.

Однако через некоторое время я начал задаваться вопросом, существует ли убедительный способ доказать, лучше ли один показатель, чем другой, и почему.

Почему это актуально? Потому что, когда мы полагаемся на метрику, такую ​​как ROC-Area или Average-Precision - мы предполагаем, что многие аспекты производительности модели могут быть заключены в одно число . В конце концов, значение имеет только это число. По этой причине нам нужно убедиться, что мы делаем мудрый выбор.

Этот пост - история того, как я наконец нашел доказательства того, что мой коллега был прав.

0. Быстрое напоминание… ROC и средняя точность

Если вы уже знакомы с такими понятиями, как распространенность, кривая ROC и кривая точности-отзыва, вы можете пропустить этот абзац и смело перейти к пункту 1.

В этом посте мы сосредоточимся на задачах классификации 2-х классов. Это наиболее распространенные проблемы в машинном обучении и довольно общие, поскольку также проблемы регрессии и проблемы n -класса могут быть отнесены к этой категории, но не наоборот.

В задаче классификации с двумя классами у нас есть некоторые наблюдения, и мы хотим создать модель, способную отнести их к одному из двух классов (положительные и отрицательные). Например, при обнаружении мошенничества мы можем захотеть классифицировать некоторые финансовые транзакции на положительные (мошенничества) и отрицательные (не мошенничества).

Для продолжения нам понадобится глоссарий:

  • n: количество наблюдений;
  • n_positives: количество положительных результатов;
  • n_negatives: количество негативов;
  • prevalence: n_positives / n;
  • n_predicted_positives: количество наблюдений, которые модель классифицировала как положительные;
  • n_true_positives: количество наблюдений, которые модель правильно классифицировала как положительные;
  • n_false_positives: количество наблюдений, которые модель ошибочно классифицировала как положительные;
  • precision: n_true_positives / n_predicted_positives;
  • recall: n_true_positives / n_positives;
  • false_positive_rate: n_false_positives / n_negatives;
  • roc_curve: набор всех возможных пар (false_positive_rate, recall) для данной модели в зависимости от порогов вероятности;
  • precision_recall_curve: набор всех возможных пар (precision, recall) для данной модели в зависимости от порогов вероятности;
  • roc_area: область под roc_curve;
  • average_precision: область под precision_recall_curve.

Для данной модели вот как будут выглядеть ее кривая ROC и кривая Precision-Recall:

Площади этих кривых (т.е. интегралы), названные соответственно ROC-Area и Average-Precision, обладают некоторыми полезными свойствами:

  • Они ограничены диапазоном от 0 до 1.
  • 0 означает наихудшую возможную классификацию, 1 означает наилучшую возможную классификацию. Итак, чем выше, тем лучше.
  • Случайная классификация будет иметь оценку 0,5 для ROC-Area, в то время как она будет равна prevalence для средней точности.

По этим причинам ROC-площадь и средняя точность обычно используются как критерии качества модели.

Этот абзац был просто базовым CliffsNotes. Если вы хотите углубить эти концепции, вы можете прочитать эти статьи: Понимание кривой AUC-ROC от ​​Саранг Нархеде и За пределами точности: точность и отзыв »от Уилла Кёрсена .

1. Необходимость обобщения… (также известного как поиск пространства модели)

Пункты 1 и 2 немного теоретические. Так что, если вы захотите перейти к параграфу 3, вы будете прощены. Но если ты останешься со мной, ты получишь медаль ботаника.

Когда я решил, что хочу выяснить, чем отличаются ROC-Area и Average-Precision, я понял, что мне нужно сделать это общим. Фактически, было бы бесполезно сосредотачиваться на одной модели. Если бы я сделал это, у меня было бы просто два числа для сравнения: ROC-Area и Average-Precision. Понятно, что для выводов недостаточно.

Я имел в виду следующую процедуру:

  1. выбрать задачу классификации (задачу реального размера, а не игрушечную);
  2. генерировать n моделей с различным исполнением (где n достаточно велико, например тысячи), обеспечивая охват широкого диапазона характеристик;
  3. вычислить ROC-площадь и среднюю точность для каждой из этих n моделей,
  4. сравните n ROC-областей и n Average-Precisions, чтобы увидеть, могу ли я раз и навсегда оценить, предпочтительнее ли одна метрика по сравнению с другой.

Я уверен, что вы заметили заминку в моем плане. 2-й пункт. В самом деле, как вы создаете тысячи различных моделей? И - что важнее всего - как обеспечить, чтобы они действовали «достаточно» иным образом? Я застрял в этом. Пока я не начал экспериментировать с этой идеей:

Существует ли способ представить все возможные модели прогнозирования, связанные с проблемой, для данной проблемы? Другими словами, есть ли способ представить «модельное пространство», то есть набор всех возможных моделей для этой проблемы?

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

Если задуматься, фактические значения, предполагаемые предсказанными вероятностями, не имеют значения. В конце концов, результатом любой прогнозной модели является ранжирование наблюдений.

Например, предположим, что у нас есть 2 модели и следующие прогнозируемые вероятности:

  • Прогнозы модели 1: [.6, .1, .9, .4],
  • Прогнозы модели 2: [.99, .8, .999, .9].

Модель 1 и Модель 2 в основном эквивалентны (без учета калибровки). Фактически, в обеих моделях наблюдения ранжируются одинаково: третье наблюдение является более рискованным, за ним следует первое, затем четвертое и, наконец, второе.

Таким образом, после сортировки предсказанных вероятностей - независимо от их фактического значения - все возможные модели обязательно попадут в один из этих 6 случаев:

где белые и черные плитки представляют соответственно негатив и позитив.

Следовательно, количество всех возможных моделей - это просто количество всех возможных комбинаций положительных и отрицательных. В комбинаторике это называется «перестановки с повторениями».

Имея всего n элементов, n_positives из которых повторяются (потому что все они - единицы) и n_negatives из которых повторяются (потому что все они равны нулю), количество возможных перестановок равно n! / n_positives! / n_negatives!. Действительно, в нашем фиктивном примере у нас есть 4! / 2! / 2! = 6 возможных моделей. Если вы хотите понять, как я пришел к этой формуле, взгляните на это красивое объяснение: « Перестановки с повторением ».

Эта конкретная формула, то есть a! / b! / c! (где a, b и c - неотрицательные целые числа, а a = b + c) называется биномиальным коэффициентом и часто встречается в математике (например, биномиальное распределение названо в ее честь)

Итак, чтобы быть более резкими, мы можем сказать, что:

Количество моделей, существующих в модельном пространстве, определяется биномиальным коэффициентом положительных и отрицательных сторон.

Несмотря на то, что это интересный результат, он вскоре становится непригодным для использования, когда количество наблюдений увеличивается. Например, для 10 000 наблюдений и 100 положительных результатов у нас будет примерно 6 * 10 ^ 241 возможных моделей!

Излишне говорить, что я не мог вычислить ROC-Area и Average-Precision для некоторых моделей 6 * 10 ^ 241. Поэтому мне пришлось отказаться от идеи работы с полным пространством модели.

2. Но я не хотел сдаваться… (также известный как уменьшенное пространство модели)

Затем мне пришлось найти более разумный способ, чем просто перечислить все возможные модели, существующие в модельном пространстве. Это означало, что мне пришлось довольствоваться меньшим - или «уменьшенным» - пространством модели. И это нормально, поскольку уменьшенное пространство модели может суммировать исходное пространство модели.

Хорошо, но как я мог этого добиться? Я имею в виду, что получить полное пространство модели легко: вам просто нужно перечислить все перестановки положительных и отрицательных. Но как получить уменьшенное пространство модели? Для этого нет рецепта.

Возьмем еще раз небольшой пример: 10 наблюдений, 4 из которых положительные. Как известно, полное модельное пространство должно состоять из 10! / 4! / 6! = 210 моделей. Итак, цель состоит в том, чтобы найти n моделей (с n намного меньше 210), которые представляли бы «градацию» различных характеристик.

Как этого добиться? После некоторых испытаний у меня появилась идея.

Эти 7 моделей действительно соответствуют нашим требованиям, потому что:

  • 7 намного меньше 210,
  • Характеристики этих моделей идеально «нюансированы» от случайного (0,5 ROC-Area) до наилучшего (ROC-Area равняется 1). Обратите внимание, что мы можем смело игнорировать модели, которые работают хуже, чем случайные, потому что на практике их не существует.

Теперь вы можете угадать узор, который я использовал для создания этих комбинаций?

Я получил это с помощью цикла от 0 до n_negatives (в данном случае от 0 до 6). На каждой итерации:

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

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

Это очень удобный трюк, поскольку он резко сокращает количество моделей, которые нам нужно учитывать, с сумасшедшего n! / n_positives! / n_negatives! до всего n_negatives + 1. В этом простом случае от 210 до 7. Но по мере роста n выигрыш будет все больше и больше.

Если вы хотите взглянуть на реализацию алгоритма Python, вы можете найти ее в моем Github.

Этот простой алгоритм позволяет решить все задачи классификации реалистичного размера! Например, для задачи 1 миллион наблюдений, 10 000 положительных результатов сокращенное пространство модели содержит «всего» 990 001 модель.

Миссия выполнена!

Итак, мы можем перейти к самой интересной части, но не раньше, чем я сдержу свое обещание ...

3. А теперь самое интересное ... (он же аналитик данных в спортзале)

Если вы прошли через пункты 1 и 2, вы заслужили всю мою признательность. Если вы этого не сделали, не волнуйтесь: вот самое интересное (и актуальное).

В параграфах 1 и 2 мы нашли способ автоматически генерировать множество различных моделей и гарантировать, что они работают по-разному, исследуя все возможные нюансы между двумя крайностями: случайной моделью и идеальной (теоретической) моделью. Это то, что мы назвали «сокращенным» модельным пространством.

Теперь пришло время заняться тем, что нас действительно интересует: сравнить ROC-площадь и среднюю точность моделей и попытаться понять, как они себя ведут.

Возьмем задачу классификации:

  • n: 11,111
  • prevalence: 10% (что означает n_positives: 1,111 и n_negatives: 10 000)

Затем мы можем получить сокращенное модельное пространство с помощью алгоритма, описанного в параграфе 2. В этом случае мы получим 10 001 модель, пронумерованную от 0 (случайная) до 10 000 (наилучшая возможная). Для каждой модели были вычислены ROC-площадь и средняя точность.

Вот результат:

Когда я впервые увидел этот сюжет, у меня был один из тех моментов «Ага».

Мой коллега был прав!

В то время как ROC-Area имеет линейное поведение, средняя точность имеет экспоненциальное поведение. Экспоненциальное поведение намного более реалистично, чем линейное поведение. Почему? Если вы когда-нибудь ходили в спортзал, вы уже знаете.

Допустим, вы закончили тренировку и решили, что хотите подготовиться к лету. Вы получаете абонемент в спортзал. В первый день вы можете жать 50 кг. Затем после трех месяцев упорных тренировок вы набираете 100 кг. Удивительный! Не правда ли?

Но сообщу плохие новости: через три месяца вы уже не сможете жать 150 кг. Другими словами, ваши успехи в жиме лежа не линейны.

Именно это и происходит с машинным обучением. Получить хорошую модель относительно просто, а получить очень хорошую - чрезвычайно сложно.

То же самое и со средней точностью. Получить хорошую среднюю точность относительно просто, получить очень хорошую среднюю точность чрезвычайно сложно.

4. Я не понимаю, насколько это полезно ... (также известный как как мне объяснить это моему боссу?)

Метафора жима лежа отражается в поведении средней точности. И это тем более верно, когда проблема сложнее. Действительно, давайте посмотрим, как меняется средняя точность для разных значений распространенности.

Как видите, при распространенности 50% средняя точность очень похожа на ROC-Area. Но тогда, чем ниже распространенность, тем «более экспоненциально» кривая обучения. Это интуитивно понятно. Очень низкая распространенность - это, как говорится, попытка найти иголку в стоге сена. Чем больше стог сена, тем сложнее проблема. Как следствие, все труднее и труднее достичь высокого уровня средней точности.

В этом и заключается смысл использования средней точности, а не ROC-области. Средняя точность более реалистична и дает вам четкое представление о том, как на самом деле работает ваша модель.

Вы все еще не уверены? Вернемся к примеру, который мы уже видели в параграфе 3 - случай 10% распространенности.

Представьте, что мы обучили 3 модели и хотим сравнить их на основе их производительности на некоторых тестовых данных. Внутри скобок мы показываем квантиль каждой модели внутри модельного пространства, где 0% является случайным, а 100% - наилучшей возможной (теоретической) моделью. Вот результаты:

  • Логистическая регрессия (60%),
  • простой алгоритм Gradient-Boosting (80%),
  • тот же алгоритм Gradient-Boosting с некоторой интеллектуальной оптимизацией гиперпараметров (87%).

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

Как лучше?

И поверьте мне: это не философия. В задании Kaggle вы можете выбрать либо среднюю точность, либо ROC-площадь: это не имеет значения, потому что чем выше, тем лучше, без лишних вопросов.

Но в реальной жизни, отвечая на вопрос «насколько модель A лучше модели B?» имеет решающее значение. Например:

Стоит ли потратить 10 часов на оптимизацию гиперпараметров, чтобы получить на 1% больше в ROC-Area? А чтобы получить на 1% больше при средней точности?

Возможность ответить на эти вопросы - один из важнейших навыков специалиста по данным. Вот почему так важно различать среднюю точность и ROC-площадь.

Действительно, давайте посмотрим, где будут размещены 3 модели в зависимости от их процентиля:

Давайте сначала сосредоточимся на ROC-Area (левый график). С помощью логистической регрессии вы достигнете 80% ROC-области, что довольно хорошо. С Gradient-Boosting вы можете достичь 90%, и это здорово. Затем, скажем, после 10 часов оптимизации гиперпараметров, вы можете достичь 93% области ROC с оптимизированным градиентным усилением. На этом этапе ваш начальник может законно спросить вас: «Действительно ли это необходимо? 10 часов, чтобы получить 3% в ROC Area? Почему бы нам просто не согласиться на 90%? » Ваш босс правильно подметил.

Переход с 90% на 93% в ROC-Area не кажется большим делом. Зачем нам беспокоиться?

Что ж, если вы посмотрите на среднюю точность, вы получите совершенно другую картину. Переходя от неоптимизированного повышения градиента к оптимизированному, вы получаете поразительное увеличение средней точности на 10%: вы увеличиваете среднюю точность почти на треть, с 36% до 46%!

Если бы это была модель защиты от мошенничества, это означало бы, что из 100 транзакций, помеченных как потенциальные мошенничества, оптимизированный Gradient-Boosting правильно угадал бы в среднем на 10 мошенничеств больше, чем простой Gradient-Boosting.

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

5. Заключение

В этой статье мы узнали несколько полезных вещей о задачах двухклассной классификации. В частности, у нас есть:

  • обнаружил, что размерность модельного пространства (то есть множества всех возможных моделей для данной проблемы) задается биномиальным коэффициентом: n! / n_positives! / n_negatives!;
  • нашел алгоритм получения меньшего пространства, названного «сокращенным» модельным пространством, которое является точной миниатюрой полного модельного пространства. Это чрезвычайно полезно, поскольку позволяет работать с доступным количеством моделей: всего n_negatives + 1;
  • сравнил ROC-Area и Average-Precision и понял, что значение ROC-Area увеличивается линейно по мере улучшения качества модели, тогда как Average-Precision растет экспоненциально;
  • заметили, как значение ROC-Area может вводить в заблуждение и заставлять нас иногда переоценивать, а иногда недооценивать фактическую производительность модели. Поведение средней точности более выразительно, поскольку позволяет получить представление о том, как работает модель, потому что это более разумно при различении хорошей и очень хорошей модели. Более того, он напрямую связан с точностью: показателем, понятным человеку.

Спасибо за чтение! Надеюсь, этот пост был вам полезен.

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

Примечание: весь код Python, использованный для получения предыдущих графиков, включая алгоритм построения уменьшенного пространства модели, можно найти здесь: https://github.com/smazzanti/why_you_should_stop_using_the_roc_curve