Методы оценки классификатора — практическое объяснение

Точность/отзыв/точность/матрица путаницы/ ROC-кривая/ AUC

Гитхаб-репозиторий

Почти в 50% всех интервью по науке о данных по всему миру интервьюируемого просят построить и оценить модель бинарной классификации. Это означает классификацию определенного наблюдения как положительного (обычно обозначаемого цифрой 1) или отрицательного (обозначаемого как 0) с учетом набора признаков. Распространенная ошибка, которую совершают интервьюируемые, заключается в том, что они тратят слишком много времени на построение и настройку чрезмерно сложной модели и недостаточно времени на разработку того, какая метрика оценки классификации подходит для решения проблемы. Эта привычка даже поддерживается с помощью Kaggle или Kaggle-подобных вызовов данных, в которых метрика оценки классификатора не выбирается тщательно участником, а уже устанавливается хостом.

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

Игрушечный набор данных, который мы используем для этого поста, получен из задачи DrivenData под названием: Предсказатель Рихтера: моделирование ущерба от землетрясения. МЫ уже знакомы с набором данных для этого проекта, учитывая, что мы участвовали в этом испытании, которое можно прочитать здесь. Как следует из названия проекта, эта задача включает в себя прогнозирование ущерба от землетрясения, в частности, ущерба от землетрясения Горха, которое произошло в апреле 2015 года и унесло жизни более 9000 человек. Это крупнейшее стихийное бедствие, обрушившееся на Непал после землетрясения в Непале и Бихаре в 1934 году.

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

Предварительные сведения/ Импорт данных/ Разработка функций

Мы начинаем с импорта соответствующих пакетов и установки всех переменных пути для лучшего доступа к данным. После этого импортируем характеристики и метку, которую можно скачать с веб-сайта DrivenData. Все это делается с помощью следующих строк кода.

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

Далее идет некоторая первоначальная очистка данных и разработка функций. Учитывая, что в этом посте мы не заинтересованы в объяснении оптимизации фактической производительности модели, мы сведем работу по обработке данных к минимуму.

total_values.info()

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

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

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

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

total_labels.loc[:, "damage_grade"].value_counts()

Учитывая, что мы хотели бы сосредоточиться на бинарной классификации, мы видим из вывода выше, что необходимы некоторые изменения в целевой переменной, поскольку мы видим, что у нас есть более двух результатов. Поэтому мы исключаем из данных категорию повреждений 3. После этого мы вычитаем 1 из целевой переменной, чтобы создать целевую переменную, которая равна 0 или 1. Этот шаг также изменит смысл задачи. В то время как раньше целевая переменная сообщала нам, насколько сильно был поврежден дом, теперь целевая переменная может рассматриваться как указание на то, сильно пострадал дом или нет.

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

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

Обучение модели

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

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

Матрица путаницы

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

  1. Истинное значение равно 1, а прогноз равен 1 (истинно положительный)
  2. Истинное значение равно 1, а прогноз равен 0 (ложноотрицательный результат).
  3. Истинное значение равно 0, а прогноз равен 1 (ложноположительный результат).
  4. Истинное значение равно 0, а прогноз равен 0 (истинно отрицательный)

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

Приведенные выше матрицы путаницы говорят нам, сколько из каждого из четырех вышеупомянутых случаев у нас есть для каждой модели прогнозирования. В левом верхнем углу каждого графика мы видим количество случаев True Negatives, т.е. где истинная метка и предсказанная метка равны нулю. В правом нижнем углу показаны истинные положительные результаты, то есть все случаи, когда истинное и прогнозируемое значения равны единице. Два других, ложноположительные (вверху справа) и ложноотрицательные (внизу слева), являются неправильной классификацией модели.

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

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

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

Недостатки использования точности

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

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

Однако в ту ночь, когда кто-то забыл задуть свечу, модель классификации будет иметь ложноотрицательные ошибки — со смертельными последствиями. Фатальные ошибки, подобные этой, не отражаются в показателе Точности, учитывая, что в каждый момент, когда дом не горел, он правильно предсказывал метку.

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

Точность и отзыв

Два других популярных метода оценки классификации называются Precision и Recall. Когда использовать какой метод, зависит от варианта использования и, в частности, к какой ошибке мы более склонны. Для иллюстрации рассмотрим два случая:

  1. Классификация рака молочной железы: в этом сценарии предпочтительно предсказать наличие у женщины рака молочной железы, даже если у нее его нет (ложноположительный результат). Это потому, что предсказание наоборот (ложноотрицательный результат) оставит женщину в уверенности, что она в безопасности, хотя на самом деле это не так.
  2. Классификация спам-письма: здесь для нас было бы нормально, если бы наш детектор спама классифицировал подозрительное электронное письмо как не спам (ложноотрицательный результат), но было бы неприятно узнать, что важное деловое электронное письмо / счет скрывается в папке со спамом. за последние две недели, потому что оно было ошибочно классифицировано как спам (False Positive).

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

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

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

Ниже мы можем увидеть различные значения всех вышеупомянутых методов оценки для всех трех моделей, а также генерирующий код. Из самого высокого столбца в категории «Отзыв» мы видим, что для наших целей модель Stochastic Gradient Boosting является предпочтительной моделью.

Истинная положительная скорость / ложноположительная скорость

Тесно связана с точностью и отзывом концепция истинной положительной скорости (TPR) и ложноположительной скорости (FPR), которые определяются следующим образом:

У наблюдательного читателя может сложиться впечатление, что он уже видел формулу TPR. Это потенциальное ощущение верно, учитывая, что Истинный положительный показатель является синонимом метода оценки отзыва, с которым мы сталкивались ранее. Учитывая, что мы уже рассмотрели концепцию отзыва / TPR, мы только развиваем интуицию ложноположительного показателя.

Частота ложных срабатываний, также известная как вероятность ложной тревоги, определяется как вероятность отклонения нулевой гипотезы, которая на самом деле верна. В области статистики вывода этот тип ошибки также называется ошибкой типа I (в отличие от ошибки типа II, которая описывает принятие нулевой гипотезы, когда она на самом деле неверна).

Ниже мы видим матрицу того, как TPR и FPR вписываются в общую картину. Очевидно, что в идеальном мире мы хотели бы иметь высокий TPR, но низкий FPR. Это потому, что мы хотели бы классифицировать все положительное как положительное, а все отрицательное — как положительное.

Мы также замечаем, что существует своего рода компромисс между этими двумя ставками. Рассмотрим пример, в котором у нас есть семь истинных значений и три отрицательных значения. Если наш алгоритм классифицирует все десять как истинные, мы получим TPR и FPR, равные 1. Если, с другой стороны, мы классифицируем все десять наблюдений как ложные, мы получим нулевое значение для обеих скоростей.

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

Ориентация на типы ошибок

Если нас особенно беспокоит определенный тип ошибки, многие модели классификации позволяют нам повысить чувствительность к той или иной ошибке. Чтобы объяснить, как это работает, важно отметить, что алгоритмы вероятностной классификации не присваивают каждому наблюдению непосредственно 0 или 1, а скорее вычисляют вероятность, с которой наблюдение принадлежит к тому или иному классу. Правило по умолчанию: если вероятность того, что наблюдение относится к классу 1, выше 50%, то наблюдение относится к классу 1. Именно это пороговое значение 50% мы будем обозначать как c, которую мы подправим.

Если, например, вероятность того, что наблюдение относится к первому классу, составляет 60 %, или 0,6, его относят к первому классу, так как это превышает пороговое значение 0,5. Это правило принятия решения, хотя и простое, также проиллюстрировано на рисунке ниже.

Если мы теперь настроим параметр c так, чтобы он был выше или ниже 0,5, мы также изменили бы TPR и FPR.

Это проще всего объяснить и понять при рассмотрении примера. Ниже мы находим вероятность принадлежать к классу один для пяти наблюдений, а также их истинную метку. Мы видим, что когда уровень отсечки находится на уровне по умолчанию 0,5. При таком уровне c мы находим один ложноотрицательный результат и 0 ложноположительных результатов.

Если мы теперь изменим порог отсечки на 0,2, мы увидим на графике ниже, что мы находим один ложноположительный результат и ноль ложноотрицательных результатов.

Мы замечаем: при изменении порогового значения c можно получить разные TPR и FPR, что, следовательно, позволяет нам ориентироваться на определенный тип ошибки.

Концепция кривой ROC и AUC

Теперь, когда мы увидели, как мы можем нацелить и настроить нашу модель в соответствии с определенным типом ошибок путем настройки параметра c, может возникнуть вопрос, как мы узнаем, какое оптимальное значение c для нашей проблемы. Именно здесь вступает в игру рабочая характеристика приемникаc (или короткая кривая ROC). Кривая ROC отображает все комбинации TPR и FPR для каждого значимого порогового уровня c, как показано на GIF-файле ниже.

Готовая реализация кривой ROC от sklearn не использует случайное количество различных отсечений, а перебирает вероятности каждого наблюдения по соображениям эффективности. Это станет яснее позже, когда мы сами реализуем код для получения ROC-кривой.

С концепцией кривой ROC связано соответствующее значение под кривой, называемое просто площадью под кривой (или сокращенно: AUC). Эта метрика пытается обобщить степень соответствия кривой ROC одним числом. Как следует из названия, это делается путем измерения площади под кривой ROC.

Учитывая, что идеальная кривая охватывает верхний левый угол как можно ближе — поскольку это означало бы, что наш классификатор способен идентифицировать все истинные положительные результаты, избегая ложных положительных результатов — мы знаем, что идеальная модель будет иметь AUC, равную 1. С другой стороны , если бы ваша модель предсказывала не лучше, чем случайное предположение, ваши TPR и FPR увеличивались бы параллельно друг другу, что соответствует AUC, равному 0,5.

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

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

Учитывая, что мы уже знаем, что модель GradientBoosting превосходит логистическую регрессию с точки зрения количества истинных положительных и истинных отрицательных результатов, можно было предсказать, что модель GradientBoosting также будет доминировать в пространстве кривой ROC. Это можно увидеть, заметив, что красная линия (модель GradientBoosting) находится выше синей линии (логистическая регрессия) для каждого отдельного порогового значения c.

Ручная реализация ROC-кривой

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

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

Из диаграммы выше мы видим, что наша ручная реализация прошла правильно и полностью соответствует результату sklearn-алгоритма.

Резюме

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