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

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

Допустим, вы владелец магазина и замечаете растущий уровень краж. Вы хотите научиться вычислять воров среди всех покупателей, чтобы минимизировать убыток. Для этого вы разрабатываете модель машинного обучения, которая предсказывает, украл покупатель в магазине или нет. Проверяете алгоритм на качество и получаете точность 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.
Это означает, что наша модель может ловить воров и в то же время не обвинять невиновных покупателей.