май 18, 2021

Метрики качества

Выбор правильных метрик для задач классификации

Метрики качества
Если вы не можете оценить результат, вы не можете объективно выбирать между различными стратегиями.

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

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

Разберем их на примере.

Доля правильных ответов


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

В нашем случае показателем качества являлась точность | accuracy, равная 95%. Что это такое?

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

Формулы знать полезно для понимания, но в Python есть библиотека sklearn, которая посчитает все за вас!

sklearn.metrics.accuracy_score(y_true, y_pred, *, normalize=True, sample_weight=None)

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

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

Если из 10 000 покупателей только 500 были ворами в этом месяце, то получается, что 95% клиентов не воруют в магазинах, а остальные 5% - нет.

Если бы вы сказали, что все были не ворами, вы были бы правы в 95 из 100 случаев. В остальных 5 случаях вы ошиблись бы. Такого же результата добивается модель с точностью 95%.

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

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

Accuracy не подходит для использования в ситуациях, когда данные искажены.

Посмотрим на другие метрики, которые расскажут нам больше о природе ошибок, которые вы делаете:

  • точность (но другая) | precision
  • полнота | recall
  • F-мера | F-score

Понять смысл этих метрик удобнее всего с помощью матрицы ошибок | confusion matrix. Матрица ошибок показывает  все возможные сценарии предсказаний модели против реальной истины.

sklearn.metrics.confusion_matrix(y_true, y_pred, *, labels=None, sample_weight=None, normalize=None)

Случай 1:  Модель предсказывает, что кто-то украл в магазине, когда он действительно это сделал (TP - True Positive)
Случай 2: Модель предсказывает, что кто-то украл в магазине, хотя он этого не сделал (FP - False Positive)
Случай 3: Модель предсказывает, что кто-то не воровал в магазине, когда они это сделали (FN - ложноотрицательный)
Случай 4: Модель предсказывает, что кто-то не воровал в магазине, когда он этого не делал (TN - True Negative)

Есть два типа ошибок, которые мы можем сделать.

I Мы можем сказать, что один элемент принадлежит какой-то категории (в нашем примере - банда воришек), когда это не так (ошибка первого рода).  

II Мы не можем сказать, что элемент принадлежит категории, когда на самом деле он принадлежит.  

Лучше мнемонического правила, чем этот мем, не существует:

Теперь разберем, как считать метрики качества.


Метрика Recall или полнота говорит нам, насколько хорошо наша модель ловит настоящих воров, то есть выявляет, какую часть объектов, имеющих ответ «вор», выделила модель.

sklearn.metrics.recall_score(y_true, y_pred, *, labels=None, pos_label=1, average='binary', sample_weight=None, zero_division='warn')

TP: Воры правильно определили, FN: Воры пропущены

Если модель никого не классифицирует как вора, recall будет равен 0.
А если мы заклеймим всех как воров? У нас будет 100% recall.

Данная метрика заботится о том, чтобы воры не ушли из магазина, а не о ложных обвинениях в адрес невиновных посетителей (False Positive).

Другой пример  — определение заразной болезни —  важно не пропустить ни одного носителя.  

Показатель, который учитывает ложные обвинения клиентов - precision или точность. Precision показывает, насколько хороша наша модель в том, чтобы не выдвигать ложных обвинений, то есть какая доля объектов, для которых модель предсказала ответ «вор», действительно имеют ответ «вор».


sklearn.metrics.precision_score(y_true, y_pred, *, labels=None, pos_label=1, average='binary', sample_weight=None, zero_division='warn')


Recall и Precision связаны таким образом, что высокая значение одного ведет к низкому значению другого, и наоборот.


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

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

Press F1 to pay respects.👋


F score  - это среднее гармоническое значение Recall и Precision.
Мы используем гармоническое среднее вместо простого среднего, потому что просто среднее наказывает экстремальные значения.

Классификатор с точностью 1,0 и отзывом 0,0 имеет простое среднее значение 0,5, но оценку F1 равную 0. Оценка F1 придает одинаковый вес обоим показателям и является частным случаем  общей метрики Fβ.

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

sklearn.metrics.f1_score(y_true, y_pred, *, labels=None, pos_label=1, average='binary', sample_weight=None, zero_division='warn')

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