Мы начнем разговор о том, как можно измерять качество в задачах классификации. Для этого существует много различных метрик:
И цель датасайентиста выбрать наиболее адекватную поставленной задаче. В зависимости от используемой метрики, мы можем получить либо модель, которая хорошо описывает данные, либо модель, которая не несет в себе смысла.
Начнем с самой простой метрики качества:
Возможно вы помните, что мы использовали долю неправильных ответов, чтобы обучать линейные классификаторы. Она считается очень просто:
$$y = \frac{1}{l}\sum_{i=1}^{l}[a(x_i) \neq y_i]$$Мы для каждого объекта выборки выясняем, дает ли алгоритм правильный ответ или нет, и если дает неправильный ответ, то записываем единичку, если правильный — то нолик, и усредняем эти нолики и единички по всем объектам выборки. Так вышло, что в задачах классификации метрики принято выбирать так, чтобы их нужно было максимизировать, тогда как в регрессии метрики были такие, что мы их минимизировали, например, среднюю квадратичную ошибку.
Чтобы максимизировать долю неправильных ответов, нужно ее немножко модифицировать и превратить в долю правильных ответов, или accuracy
на английском.
Она вычисляется точно так же: мы усредняем по всем объектам выборки индикаторы того, что на данном объекте алгоритм выдает правильный ответ. Это очень простая метрика качества, которая широко используется, но при этом у нее есть две проблемы. Поговорим о них подробнее.
Давайте рассмотрим простой пример.
Пусть в выборке 1000 объектов, из них 950 относится к классу −1, и 50 — к классу +1.
Такие выборки встречаются, например, в медицине, в медицинской диагностике, из-за того, что больных, как правило, гораздо меньше, чем здоровых.
И при этом рассмотрим константный алгоритм a(x), который на всех объектах, абсолютно всех объектах возвращает ответ 1. То есть всех пациентов относит к классу «здоровые».
$a(x) = 1$
Этот алгоритм "тупой", не имеет смысла его использовать ни в каких задачах. Он не восстанавливает никакие закономерности в данных. При этом его доля верных ответов на данной выборке будет равна 0,95 или 95 %. Это очень много, но не соответствует нашим ожиданиям. Понятно, что проблема именно в несбалансированности. В том, что объектов одного из классов намного больше, чем другого.
Как решить эту проблему? Ну, например, можно измерять не только долю правильных ответов, но и базовую долю правильных ответов, которая равна максимальному качеству, которое можно достичь, если алгоритм возвращает константу на всех объектах – "-1" или "1". В нашем случае базовая доля правильных ответов равна 95%. Это означает, что разумный интервал значений для доли правильных ответов – – это от 95% до 100%, а не от 50% до 100%, как мы могли бы ожидать при сбалансированных классах.
Еще раз совет на случай, если вы настроили некоторый классификатор и получили большую долю верных ответов — посмотрите на баланс классов. Возможно, дело не в том, что вы построили хороший классификатор, а в том, что просто одного из классов сильно больше, чем другого, и из-за этого легко получить ложную высокую оценку верных ответов.
Давайте разберем простой пример. Рассмотрим задачу кредитного скоринга, в которой нужно для клиента банка, который просит кредит, понять, выдавать ему кредит или не выдавать - вернет он этот кредит или не вернет. И представим, что у нас есть две модели.
Первая модель говорит, что нужно выдать кредит 100 "хорошим" клиентам из 200. При этом если мы их выдадим, то из них:
Вторая модель более консервативная. Она говорит, что нужно выдать кредит всего 50 "хорошим" клиентам из 200, и если мы это сделаем, то:
Вторая модель рискует меньше. Если мы воспользуемся ей, то практически все клиенты вернут кредиты, но при этом многим мы кредиты не дадим, хотя они вернули бы деньги. Мы не заработаем.
Первая модель рискует сильнее, она выдает кредиты большему количеству человек, мы заработаем больше, но при этом и будут некоторые потери, связанные с тем, что 20 клиентов кредит не вернут.
У доли правильных ответов есть и другие проблемы, но прежде, чем говорить о них, давайте разберемся с тем, какие виды ошибок может допускать классификатор. Каждый объект характеризуется двумя числами – тем, какой правильный ответ на нем, и тем, какой ответ дает наш алгоритм.
Обозначим классы (+) и (-) - по аналогии с терминами "positive"(положительный) и "negative"(отрицательный). Хотя вы можете использовать в своих задачах любое обозначение класса, понятное вам: 1 или -1, 0 или 1, А или В и т.д.
В зависимости от сочетания этих двух чисел, можно разделить все объекты на четыре категории:
1) Первая – это «верные срабатывания» или True Positive. К ним относятся те объекты, на которых правильный ответ класса (+), и наш алгоритм возвращает (+).
2) Если же объект относится к классу (-), но при этом алгоритм относит его к классу (+) – это «ложное срабатывание» или False Positive.
3) Наоборот, если объект относится к классу (+), а алгоритм относит его к классу (-) – это «ложный пропуск» или False Negative.
4) Если же объект относится к классу (-) и мы относим его к классу (-) – это «верный пропуск» или True Negative.
Давайте разберем эти метрики на примере двух кредитных моделей. Будем считать, что у нас есть информация обо всех 200 клиентах - о тех кому мы выдали кредит информация хранится у нас. А информацию о поведении тех клиентов, которым мы не дали кредит, мы попросили в банке Tinkoff, который выдал кредит нашим ненадежным клиентам.
Возьмем "1" в качестве метки класса "хороших" клиентов - вернувших кредит, который они взяли (либо у нас в банке, либо в любом другом) и "-1" для "плохих" клиентов которые кредит ни одному банку не вернули.
Итак, теперь наша выборка состоит из 200 объектов, из которых 100 относится к классу "1" и 100 относится к классу "-1".
Составим матрицу ошибок для обеих моделей:
И если с деньгами все относительно, то в вопросах жизни людей цена ошибки становится очень важной метрикой!
Класс "1" означает больных людей, класс "0" – здоровых людей.
Рассмотрим выборку, в которой на самом деле
А ответы алгоритма здесь
Видно, что алгоритм в целом неплох.
Он находит 20 из 25 больных и при этом не очень много пациентов, которые здоровые, относит к классу «больные». Кажется, что алгоритм очень приемлемый.
Алгоритм угадал в 1020 (сумма True Positive и True Negative) случаях из 1075, значит
$$accuracy = \frac{1020}{1075}$$Его доля правильных ответов равна 94,9%.
А вот другой пример: та же самая выборка, но алгоритм – константный, относит всех к классу 0.
При этом его доля правильных ответов гораздо выше – 97,6%. В чем же дело?
Почему более разумный алгоритм, более подходящий для нас, имеет качество меньше? Дело в том, что разные типы ошибок могут иметь разную цену.
В нашей задаче ложное срабатывание (False Positive) ничего не значит. Нам не страшно провести несколько дополнительных анализов и понять, что человек здоров.
При этом ложный пропуск (False Negative) крайне опасен – мы не определяем больного человека, мы не понимаем, что его нужно лечить. А это угроза жизни! Поэтому здесь ложное срабатывание гораздо менее ценно, чем ложный пропуск.
В случаях, когда разные ошибки имеют разную цену, гораздо лучше измерять две другие метрики качества вместо одной: точность и полноту.
In [ ]: