Как измерить эффективность классификации… с помощью Pokemon!

Все хорошие уроки лучше усвоить, если они замаскированы под приключение… Нашим сегодняшним заданием будет поиск легендарных покемонов, чтобы поймать их всех. Для этого мы будем использовать лучший инструмент, который есть в нашем распоряжении: МАШИННОЕ ОБУЧЕНИЕ!

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

Набор данных

Как вы, наверное, догадались, мы будем использовать знаменитый Полный набор данных о покемонах, который вы можете скачать здесь. Этот набор данных содержит 41 функцию о 802 покемонах, таких как их имя, рост, вес, атака и защита и т. Д., А также то, на чем мы сосредоточимся: двоичная функция, которая сообщает нам, является ли покемон легендарным или нет .

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

Проблема с результатами классификации

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

Однако в классификации все не так тривиально. Рассмотрим, например, задачу двоичной классификации. У нас есть две разные категории в наших данных (например, легендарный и нелегендарный покемон в нашем случае), обычно представленные 0 (обычно для случая False) и 1 (обычно для случая True). Самый простой способ оценить производительность - использовать точность модели, которая просто рассчитывается с учетом количества правильно классифицированных выборок и общего количества выборок.

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

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

  • 1. Из всех покемонов, поскольку только 10/1000 = 1% являются легендарными, наша модель все равно будет иметь следующую точность:

99% точность. Вау! На бумаге это выглядит фантастически, но действительно ли наш алгоритм работает хорошо?

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

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

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

Матрица замешательства

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

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

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

Давайте опишем, что означает каждый элемент этой матрицы, чтобы вы могли понять, почему он так полезен. Когда мы увидим реальный пример, эти буквы (TP, FP, FN и TN) будут заменены числами. из которых мы можем получить различные идеи:

  • TP - True Positives: этот блок является пересечением истинных прогнозов с истинными метками; который представляет точки данных с меткой True, которая была правильно предсказана нашим алгоритмом или моделью. В нашем примере с покемонами это будет представлять количество легендарных покемонов, которые были правильно идентифицированы как таковые.
  • FP - Ложные срабатывания: этот блок является пересечением истинных предсказаний с ложными реальными метками. Он представляет точки данных, у которых есть настоящая метка False, но которая была предсказана моделью как True. В нашем случае это будут покемоны, которые не являются легендарными, но были предсказаны нашим алгоритмом как таковые.
  • FN - ложно-отрицательные: этот блок является пересечением ложных прогнозов с истинными реальными метками. Он представляет точки данных, которые имеют настоящую метку True, которая была неверно предсказана алгоритмом как False. В нашем случае это будут легендарные покемоны, которые предсказывались как обычные.
  • TN - True Negatives: этот блок является пересечением между ложными предсказаниями и ложными реальными метками. Он представляет точки данных с реальной меткой False, которая была правильно классифицирована моделью как False. В нашем случае эта ячейка соответствует нелегендарным покемонам, которые были правильно классифицированы как таковые.

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

Очень легко запутаться между ложными отрицательными и ложными срабатываниями. «Какой из них что олицетворял?» Вы можете спросить. Чтобы избежать этой путаницы (без каламбура), думайте о ложных отрицательных результатах как о ложноотрицательных прогнозах (то есть о реальных положительных результатах), а о ложных срабатываниях как о ложноположительных прогнозах (т.е. о реальных отрицательных).

В нашем примере после выполнения сплита Train-Test, обучения очень простой логистической регрессии на обучающих данных и построения матрицы путаницы с прогнозами, сделанными на основе тестовых данных, мы получаем следующие результаты:

Эта матрица путаницы говорит нам о том, что из 25 легендарных покемонов в нашем наборе данных 23 правильно классифицированы как таковые, а 2 неправильно классифицированы как нелегендарные (блок ложных отрицательных значений в нижнем левом углу). Кроме того, наша модель хорошо справляется с классификацией нелегендарных покемонов, поскольку она делает все прогнозы правильными (правый столбец матрицы).

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

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

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

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

Как видно из изображения выше, наша логистическая регрессия классифицирует Тапу Фини и Тапу Коко как нелегендарные, хотя на самом деле они легендарны. С другой стороны, Random Forest классифицирует Metagross как легендарный, а он - нет.

Теперь нам решать. Зная, что это ошибки, не возражаем ли мы упустить эти два и, возможно, других легендарных покемонов, которые присоединятся к сообществу покемонов в будущем, или использовать один из наших драгоценных Master Ball на таком покемоне, как Metagross и, возможно, на других не столь ценных новых покемонах, которые появятся?

Что бы мы ни решили, Матрица путаницы позволила нам принять это решение, зная, что произойдет, а это именно то, что мы хотим: использовать эти модели для принятия более информированных и дополнительных решений.

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

Показатели, полученные из матрицы неточностей

Двумя основными показателями, которые могут быть получены из матрицы неточностей (помимо точности), являются Точность и Отзыв. Давайте восстановим исходную общую матрицу путаницы, чтобы увидеть, откуда они берутся.

  • Точность модели рассчитывается с использованием строки "Истина" прогнозируемых меток. Он говорит нам, насколько хороша наша модель, когда делает положительный прогноз. В нашем случае это будет говорить нам, сколько настоящих легендарных покемонов у нас есть во всех положительных предсказаниях нашего алгоритма.

Этот показатель важен, когда мы хотим избежать ошибок в истинных предсказаниях наших алгоритмов. В примере из нашей истории, если бы мы знали, что у нас есть только 25 легендарных покемонов, и купили бы ровно 25 мастер-шаров для их захвата, 100% точность означала бы, что наш Pokedex будет правильно идентифицировать каждого легендарного покемона, когда он его увидит, никогда путать нелегендарное с легендарным. Так обстоит дело с моделью логистической регрессии, которую мы обучили.

Однако этот алгоритм предсказывал только 23 легендарных покемона, когда их стало 25. Чтобы оценить эту ошибку, у нас есть еще один показатель: отзыв.

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

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

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

Существует также комбинированная метрика, F1-Score, которая учитывает точность и отзывчивость в тех случаях, когда нам нужен компромисс между ними и нужен другой показатель, чем просто точность, или когда мы хотим быстро сравнить два классификатора. Формула для F1 следующая:

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

Заключение

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

Код этого простого проекта можно найти на моем Github.

Чтобы проверить это, зайдите в подписывайтесь на меня на Medium и следите за обновлениями!

Вот и все, надеюсь пост вам понравился. Не стесняйтесь подписываться на меня в Твиттере по адресу @jaimezorno. Кроме того, вы можете ознакомиться с другими моими сообщениями о данных и машинном обучении здесь. Приятного чтения!