Оглавление

Если вы читаете эту заметку, то наверно, вы уже сталкивались и с точностью (precision), и с полнотой (recall) классификаторов. Но никак не можете запомнить формулы про TP, TN, FP, FN. Я тоже никак не мог их осознать и видел множество людей, корыте каждый раз задумываются, что там в числителе, а что в знаменателе. Но когда я взглянул на проблему под другим углом, всё встало с головы на ноги.

Оценка точности классификатора

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

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

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

факт  прогноз-А прогноз-В
----  --------- ---------
ясно  ясно      ясно
ясно  дождь     ясно
дождь дождь     дождь
ясно  ясно      ясно
ясно  ясно      ясно
дождь ясно      дождь
дождь дождь     ясно
ясно  снег      снег
снег  снег      ясно
ясно  ясно      ясно

Количества пар [фактические осадки]-[предсказанные отсадки] мы можем представить наглядно в таблице — матрице неточностей (confusion matrix).

              прогноз-А                прогноз-В
       ----------------------   ----------------------
                  факт                     факт
       ----------------------   ----------------------
             ясно  дождь снег         ясно  дождь снег
пред-   ясно 4     1     0       ясно 5     1     1
сказ-  дождь 1     2     0      дождь 0     2     0
зание   снег 1     0     1       снег 1     0     0

Самая простая мера качества классификатора — accuracy

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

accuracy = 7/10

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

Мы же не можем различить эти два классификатора с помощью нашей метрики accuracy.

Чтобы избавиться от этой проблемы вводят две другие метрики.

Точность (precision) и полнота (recall) классификатора

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

По смыслу, это «меткость» классификатора. На сколько часто он попадает в факт, когда работает в данном классе.

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

По смыслу, это «отзывчивость» классификатора. На сколько он «чувствует» факт.

Для наших классификаторов мы получим такие цифры:

       прогноз-А           прогноз-В
      -----------         -----------
      prec recall         prec recall
      -----------         -----------
 ясно 4/5  4/6       ясно 5/7  5/6
дождь 2/3  2/3      дождь 2/2  2/3
 снег 1/2  1/1       снег 0/1  0/1
      -----------         -----------
сред. 0.66 0.78     сред. 0.57 0.61

Тут уже видно, что прогнозатор А лучше, чем В. Но нам-то нужно одно число для оценки.

И таким числом часто становится

F-мера

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

         precision × recall
F = 2 × ──────────────────── 
         precision + recall

Для нашего классификатора А она будет равна 0.72, а для B — 0.59.

Теперь точно видно, что А выигрывает.

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