КОНСУЛЬТАЦИЯ 29.05 – самостоятельная №3
Машинное обучение. Классификация.
Сразу отвечаем на вопросы:
Да, постараемся сделать запись.
Да, файлы вывесим в группу.
Всем, кто оставил фидбек – безграничная любовь
Задача классификации.
Как мы (надеюсь) помним, классификация нужна для предсказания категориальных переменных.
Как и у регрессии, у классификации есть свои метрики качества прогнозов. На первой половине нашего занятия разберемся, что там да как.
Проще всего это будет понять на задачах, так что давайте приступим.
В первом задании нам предлагают найти долю правильных ответов для всех трёх моделей. Ок, давайте найдем. Перепишем модельки.
Сейчас я покажу вам матрицу, из которой должно стать очевидно, что нам делать дальше.
TN = True negative, FN = False negative
FP = False positive, TP = True Positive
Что нужно, чтобы найти долю правильных ответов? Правильно, взять и поделить
TN + TP на сумму всего остального.
На примере 1 модели:
(80+80) / (80+20+20+80) = 0.8
Для 2 модели: (48+98) / (98+52+2+48) = 0.73
Для 3 модели: (10+10000) / (10000+90+20+10) = 0.98
У этой метрики есть как минимум две существенные проблемы. Первая проблема связана с несбалансированными выборками. Именно такая ситуация наблюдается в третьей табличке, где у нас число одного трушного наблюдения сильно больше, чем все остальные элементы (оттуда и такая высокая точность, которой я не советую верить)
Вторая проблема с долей верных ответов состоит в том, что она никак не учитывает разные цены разных типов ошибок.
Чтобы таких недочетов в нашей жизни было меньше, придумали ещё 2 метрики: Precision и Recall. Они на практике используются чаще.
Эта метрика отвечает за точность классификатора.
В принципе, из формулы понятно, как она считается.
Эта метрика отвечает за полноту. Тоже по формуле ясно, как это дело считать. Разница в том, какая ошибка для нас страшнее.
Пример: мы хотим выдать кредит и нам смерть как нужно получить деньги с процентами обратно. Естественно, для нас страшнее будет False positive ошибка, ведь мы предсказали, что деньги вернутся, но… Не прокатило.
Пример 2: мы хотим найти зараженных КаКиМ-То вирусом. В таком случае, для нас будет страшнее False negative ошибка, ведь мы сказали человеку, что он здоров, тот, впоследствии пошел гулять по паркам и всех перезаражал. Так себе вышло.
Это я всё к чему – метрику мы выбираем в зависимости от того, что там важно и что нам нужно. Accuracy наверное не берут на практике или берут супер-редко.
Давайте-ка обратно к практике.
Найдем Precision и Recall для всех наших моделей.
Precision = TP / TP+FP
Recall = TP / TP+FN
Для 1: Precision = 80/(20+80)=0.8 Recall = 80/(20+80)= 0.8
Для 2: по аналогии, Precision = 0.96, Recall = 0.48
Для 3:Precision = 0.33, Recall = 0.1
Эти результаты говорят нам о качестве моделек уже больше.
Неплохо, да? Но и этого недостаточно.
Нам не всегда хочется выбирать между Precision и Recall, поэтому умные люди придумали так называемую f-меру. Считается она так:
Посчитаем этот параметр для наших моделей.
Для 1: 2* 0.8*0.8 / (0.8+0.8) = 0.8
Для 2: 2* 0.96*0.48 / (0.96+0.48) = 0.64
Для 3: 2* 0.33*0.3 / (0.33+0.1) = 0.15
Вот, теперь всё совсем хорошо стало.
f-мера очень полезная вещь, которую, кстати, можно визуализировать.
Совершенно бесполезно, но зато смотрите, как красиво
Вдоль каждой кривой f-мера постоянна. Например, для самой нижней кривой, а-мера равна 0.1. Чем правее по ней мы двигаемся тем меньше точности и тем больше полнота. Прирост полноты вдоль кривой компенсирует упадок точности и мы остаемся на том же самом уровне f-меры.
Ничего не напоминает? Кривые безразличия из микры, да.
Помните невеселые примеры с кредитами и вирусами?
Можно попробовать дать больший вес или точности, или полноте, если от нас требует этого задача и немного вытянуть кривые безразличия в сторону полноты или точности:
Если β > 1 приоритет отдаётся полноте, если 0 < β < 1, то точности. Например, если β = 2, для нас более важна полнота. Если β = 0.5, более важна точность.
а) Представим себе два объекта: плохой и хороший. Представим себе, что модель предсказала нам вероятность того, что первый объект будет плохой и получила p̂1, а для второго случая (когда объект хороший) p̂2.
y = 1 P(y = 1) = p̂1
y = 0 P(y = 1) = p̂2
Ясно, что если модель хорошая, то p̂1 > p̂2
roc_auc — это доля пар, где модель оказалась права
Чтобы это найти, нам надо сравнить каждый объект у=1 с каждым объектом у = 0
у = 1 у нас встречается два раза, у = 0 три.
наблюдений, логично, будет 6.
0.7 > 0.2 ok
0.7 > 0.3 ok
0.7 > 0.1 ok
0.25 > 0.2 ok
0.25 < 0.3 not ok
0.25 > 0.1 ok
Внимание! Нули с нулями и единицы с единицами мы не сравниваем.
Итого, 5 наблюдений из 6 у нас вышли правильными. Клево. Наверное.
Чтобы нарисовать ROC-кривую, надо взять единичный квадрат на координатной плоскости, разбить его на m равных частей горизонтальными линиями и на n – вертикальными, где m – число 1 среди правильных меток теста (в нашем примере m = 2), n – число нулей (n = 3). В результате квадрат разбивается сеткой на m × n блоков.
Отсортируем нашу табличку по значению вероятности, которую предсказала модель
Теперь начнем строить:
Будем просматривать строки сверху вниз и прорисовывать на сетке линии, переходя их одного узла в другой. Стартуем из точки (0, 0). Если значение метки класса в просматриваемой строке 1, то делаем шаг вверх; если 0, то делаем шаг вправо. Ясно, что в итоге мы попадём в точку (1, 1), т.к. сделаем в сумме m шагов вверх и n шагов вправо.
Если положительный класс существенно меньше по размеру, roc_auc может давать неадекватную оценку качества алгоритма. Вылечить такой недостаток позволяет другая метрика, pr_auc (precision-recall area under curve). О ней мы сейчас и поговорим.
Давайте по оси x откладывать полноту, а по оси y точность. Будем по очереди перебирать
разные пороги и считать для них точность и полноту. Нанесём на картинку все полученные точки и соединим их. Это и будет precision − recall кривая.
Например, если мы возьмём порог ≥ 0.1, тогда все объекты будут принадлежать к классу 1, точность составит 2 / 5, а полнота 1. Если мы возьмём порог ≥ 0.2, тогда один объект
будет нулевым, а остальные четыре единичными. Точность составит 2 / 4, а полнота 1. По аналогии получим точность и полноту при порогах ≥ 0.25, ≥ 0.3 и ≥ 0.7.
PR- кривая всегда начинается из точки (0, 0) и заканчивается в точке (1, r), где r — это доля объектов первого класса в выборке.
В случае идеального классификатора, то есть если существует такой порог, что и точность, и полнота равны 100%, кривая будет проходить через точку (1, 1). Таким образом, чем ближе кривая пройдет к этой точке, тем лучше оценки. Площадь под этой кривой может быть хорошей мерой качества оценок принадлежности к классу 1. Такая метрика называется pr-auc, или площадь под PR-кривой.
Посчитав площадь под кривой получим pr-auc. Будем делать это, считая площади треугольников и прямоугольников.
0.5 ⋅ 1 ⋅ 0.5 + 0.5 ⋅ 0.5 ⋅ (0.66 − 0.5) + 0.52 = 0.25 + 0.04 + 0.25 = 0.54
Эта метрика подобно roc-auc не зависит от выбора порога и отражает способность модели правильно упорядочивать пары, но немножечко в другом плане. Эта метрика строится в осях точность и полнота. Из-за этого она нечувствительна к дисбалансу в выборке.