Уяви лікарню, яка купила модель для раннього виявлення рідкісної хвороби. Продавець показує звіт: точність 99.4%. Головний лікар киває, контракт підписано. За півроку виявляється, що модель не знайшла жодного хворого — вона просто всім підряд пише «здоровий». І це справді дає 99.4% правильних відповідей, бо хворіє шестеро з тисячі.
Ця історія — не курйоз, а типова пастка. Одне число не здатне описати поведінку класифікатора, бо класифікатор помиляється двома різними способами, і ці способи майже ніколи не рівноцінні. Ця лекція про те, як розкласти якість моделі на складові, які справді щось означають: precision (точність позитивного прогнозу) і recall (повнота).
МеханікаОцінка, поріг і рішення
Почнімо з того, чого зазвичай не пояснюють. Класифікатор насправді не видає слово
«хворий» або «здоровий». Він видає число — оцінку впевненості, найчастіше
в діапазоні від 0 до 1. Логістична регресія, градієнтний бустинг, нейромережа — усі вони
на виході дають щось на кшталт 0.83.
Щоб перетворити це число на рішення, потрібен ще один крок, який модель не
робить за нас: треба обрати поріг t. Правило просте:
За замовчуванням бібліотеки ставлять t = 0.5, і це створює ілюзію, що
рівно половина — щось природне. Насправді 0.5 — просто зручне число. Поріг є
окремим рішенням проєктувальника системи, і воно залежить не від моделі,
а від того, скільки коштує кожен вид помилки. Модель лишається тією самою; змінюючи поріг,
ми лише пересуваємо межу між «тривога» і «спокій».
РозкладМатриця плутанини
Коли поріг зафіксовано, кожен обʼєкт вибірки потрапляє рівно в одну з чотирьох категорій. Їх утворює перетин двох питань: яка правда і що сказала модель.
- TP (true positive, істинно позитивний) — хворий, і модель це побачила. Влучання.
- FP (false positive, хибно позитивний) — здоровий, а модель підняла тривогу. Хибна тривога.
- TN (true negative, істинно негативний) — здоровий, і модель промовчала. Правильна тиша.
- FN (false negative, хибно негативний) — хворий, а модель промовчала. Пропуск.
Розташовані у квадрат 2×2, ці чотири числа називаються матрицею плутанини (confusion matrix). У ній міститься вся інформація про поведінку класифікатора при даному порозі: будь-яка метрика, яку ми далі побачимо, — це просто дріб із цих чотирьох чисел.
Найважливіше зауваження: FP і FN — це принципово різні події. Хибна тривога веде до зайвого обстеження. Пропуск — до невиявленої хвороби. Плутати їх в одному показнику означає свідомо втрачати інформацію.
Посунь поріг у інтерактиві нижче. Дивись, як точки перефарбовуються і як разом із ними пливуть усі чотири клітинки та всі метрики одночасно.
Поріг керує всім
Угорі — оцінки моделі для 240 пацієнтів, розкладені за справжнім діагнозом. Унизу — матриця плутанини для поточного порогу.
ПасткаЧому accuracy бреше
Accuracy — це частка правильних відповідей:
Метрика чесна рівно в одному випадку: коли класи приблизно однакові за розміром і однаково важливі. Щойно одна з цих умов ламається, accuracy перестає нести інформацію.
Порахуймо явно. Нехай на 10 000 обстежених припадає 10 хворих — поширеність 0.1%. Розглянемо модель-порожнечу: вона взагалі не дивиться на дані й завжди відповідає «здоровий».
Позитивних прогнозів немає взагалі, отже TP = 0 і FP = 0. Усі 9 990 здорових вгадані: TN = 9 990. Усі 10 хворих пропущені: FN = 10.
Формально — майже ідеальний результат. Такий, що його не соромно показати в презентації.
Модель не знайшла жодного хворого. Її діагностична користь дорівнює нулю рівно.
Два числа описують ту саму модель: 99.9% і 0%. Обидва правильні. Різниця в тому, що перше рахує всі відповіді разом, а друге дивиться тільки на клас, заради якого систему й будували.
Ця асиметрія має назву — дисбаланс класів. Він трапляється майже скрізь, де взагалі варто застосовувати машинне навчання: шахрайські транзакції (частки відсотка), відмови обладнання, рідкісні діагнози, релевантні документи серед мільярда сторінок. Чим рідкісніший позитивний клас, тим більше accuracy виміряє розмір більшості замість якості моделі.
У наступному інтерактиві модель незмінна: та сама роздільна здатність, той самий поріг. Змінюється лише частка хворих у популяції. Дивись, що при цьому робить кожна метрика.
Дисбаланс: accuracy тримається, precision валиться
Одна й та сама модель у популяціях із різною поширеністю хвороби.
ОбразОдин образ на дві метрики
Перш ніж писати формули, треба мати картинку в голові — інакше precision і recall плутатимуться довічно, і не тому, що вони складні, а тому, що вони симетричні на вигляд. Тож спершу образ, а формули за ним.
Уяви озеро й рибалку з сіткою. В озері плаває риба — це справжні позитивні випадки, ті, які ми шукаємо. Плаває там і всякий мотлох: старі чоботи, гілки, банки — це негативні випадки. Рибалка закидає сітку й витягає її. У сітці опиняється щось: частина риби, а разом із нею частина мотлоху. Модель — це рибалка, а сітка — усе, що модель позначила як позитивне.
Тепер два різні питання до одного й того самого вилову, і в них уся суть теми:
- Чистота улову. Дивимось у сітку: яка частка того, що ми витягли, справді риба? Це precision. Знаменник — те, що в сітці.
- Повнота вилову. Дивимось в озеро: яку частку всієї риби ми витягли? Це recall. Знаменник — уся риба, і та, що в сітці, і та, що лишилась плавати.
Звідси одразу видно, чому кожну з них окремо легко зробити ідеальною й чому це нічого не варте. Хочеш precision = 1? Витягни одну-єдину рибину, у якій ти впевнений на всі сто, — у сітці буде 100% риби. Хочеш recall = 1? Перегороди все озеро й витягни його вміст цілком — жодна рибина не втече. Обидва рекорди безглузді, і саме тому ці числа завжди називають парою.
Сітка в цьому образі — не метафора з повітря, а точний відповідник порога з розділу 01. Велика сітка — низький поріг: гребемо все підряд. Маленька сітка — високий поріг: беремо лише найпевніше. Посунь повзунок і подивись, як одне й те саме рішення тягне два числа в різні боки.
Озеро, сітка й два різні знаменники
Бірюзові кружечки — риба (справді позитивні), сірі — мотлох. Помаранчеве коло — сітка: усе, що модель позначила позитивним.
PrecisionЧи можна вірити вироку
Перша з двох потрібних метрик відповідає на питання: якщо модель сказала «так», наскільки ймовірно, що вона має рацію?
У знаменнику — усі позитивні прогнози, і правильні, і хибні. Тобто precision дивиться на стовпець матриці: беремо все, що модель позначила як позитивне, і питаємо, яка частка з цього виявилась справжньою.
Українською precision зазвичай перекладають як «точність», що плутається з accuracy — теж «точністю». Щоб не плутатись, у цій лекції я вживаю англійські назви, а українською описово: точність позитивного прогнозу.
Precision — це метрика довіри до сигналу. Вона важлива там, де хибна тривога дорого коштує: користувач, чий важливий лист потрапив у спам; клієнт, якому безпідставно заблокували картку; юрист, який мусить прочитати тисячу нерелевантних документів. У всіх цих випадках FP витрачає чужий час, гроші або довіру.
RecallСкільки ми проґавили
Друга метрика ставить дзеркальне питання: яку частку справжніх позитивних випадків модель узагалі помітила?
Тепер у знаменнику — усі, хто насправді позитивний, незалежно від того, що сказала модель. Recall дивиться на рядок матриці. Його синоніми, які ти зустрінеш у літературі: sensitivity (чутливість) у медицині і TPR (true positive rate) у теорії виявлення сигналів. Це одне й те саме число.
Recall — метрика повноти охоплення. Вона головна там, де пропуск катастрофічний: невиявлена пухлина, незнайдений дефект у партії деталей, шахрайський переказ, який пройшов. Тут ми готові терпіти хибні тривоги, бо перевірити зайве дешевше, ніж пропустити справжнє.
Зверни увагу на симетрію: precision штрафується за FP, recall — за FN. Кожна метрика бачить рівно один вид помилки і повністю ігнорує другий. Саме тому їх завжди наводять парою: окремо взяте будь-яке з цих чисел легко зробити ідеальним.
КонфліктКомпроміс, якого не уникнути
Чому не можна мати обидві метрики високими? Тому що обома керує один і той самий важіль — поріг. Опускаємо поріг: модель стає підозріливішою, ловить більше справжніх хворих (recall росте), але заодно чіпляє більше здорових (precision падає). Піднімаємо поріг: кожен позитивний вирок стає надійнішим (precision росте), але частина хворих лишається непоміченою (recall падає).
Це не вада конкретної моделі, а наслідок того, що розподіли оцінок для двох класів перекриваються. Поки в зоні перекриття є і хворі, і здорові, будь-яка вертикальна межа розріже обидві групи одночасно. Прибрати компроміс може тільки краща модель — така, що розсуває розподіли далі один від одного.
Усі чотири метрики як функції порогу
Одна модель, 101 значення порогу. Вертикальна лінія — поточний вибір.
Чому recall падає завжди, а precision — не завжди росте
У попередній фігурі одна крива поводиться бездоганно рівно, а друга смикається. Це не шум даних, а властивість самих означень, і її варто розібрати до кінця — на ній тримається половина практичних рішень із порогом.
Recall спадає монотонно. Підняти поріг означає відібрати позитивні прогнози, а не додати їх: жоден обʼєкт від підвищення порога не стане позитивним. Отже TP може лише зменшитись, а знаменник recall — усі справжні хворі — узагалі не залежить від порога, він однаковий за будь-якого рішення моделі. Дріб зі сталим знаменником і незростаючим чисельником може лише падати. Тому гарантія тут строга: вищий поріг — не більший recall, без винятків.
Precision росте «загалом», але не крок за кроком. У неї від порога залежить і чисельник, і знаменник: піднімаючи поріг, ми викидаємо із сітки і хибні тривоги (добре), і справжні влучання (погано). Якщо обʼєкт, який щойно випав із сітки, виявився хворим, precision у цю мить падає. Загальна тенденція вгору є, бо згори в упорядкуванні хворих густіше, ніж знизу, — але рівність не гарантована жодним кроком.
Це видно найкраще, якщо рухати поріг не повзунком, а по одному обʼєкту: опустити його рівно настільки, щоб у сітку зайшов наступний за оцінкою пацієнт, і подивитись, що сталося з двома числами.
Поріг на один обʼєкт: хто зайшов у сітку
Пацієнти, упорядковані за оцінкою. Показано вікно навколо межі; кожне натискання пересуває межу рівно на одного.
Тепер найважливіше практичне: вимога до однієї метрики автоматично призначає ціну по другій, і цю ціну треба вміти назвати числом. Візьмімо ту саму модель із 240 пацієнтів, що й у фігурах вище (72 хворих, 168 здорових), і подивимось, що коштує кожна вимога:
| поріг | TP | FP | FN | recall | precision |
|---|---|---|---|---|---|
| 0.70 | 54 | 4 | 18 | 0.750 | 0.931 |
| 0.50 | 61 | 24 | 11 | 0.847 | 0.718 |
| 0.35 | 69 | 48 | 3 | 0.958 | 0.590 |
| 0.29 | 71 | 61 | 1 | 0.986 | 0.538 |
Прочитаймо цю таблицю як розмову із замовником. Він каже: «recall має бути не нижчий за 0.98». Дивимось у стовпець recall: найвищий поріг, за якого умова ще виконується, — 0.29 (recall 0.986). Отже поріг доведеться опустити з 0.50 на 0.29, і платимо ми за це хибними тривогами: їх стає 61 замість 24. Тобто 37 зайвих обстежень за 10 додатково знайдених хворих — приблизно чотири зайві обстеження на кожного знайденого.
Ось це відношення — «скільки зайвої роботи за один додатковий результат» — і є чесною відповіддю замовникові. Фраза «ми досягли recall 0.98» відповіддю не є: у ній немає ціни, а рішення ухвалюють саме за ціною.
PR-криваУся модель на одному графіку
Замість дивитись на два графіки окремо, зручно викинути поріг із координат і побудувати залежність precision від recall безпосередньо. Кожна точка такої кривої — це один поріг. Кінець із високим recall відповідає низьким порогам, кінець із високим precision — високим.
Форма кривої говорить про модель більше, ніж будь-яке одне число. Крива, що тулиться до правого верхнього кута, означає, що є пороги, які дають одразу і повноту, і надійність. Крива, що падає одразу, означає: розподіли перекриваються сильно, і компроміс жорсткий.
Площу під цією кривою називають average precision (AP). Це чесний однокласний підсумок якості ранжування, який не залежить від вибору порогу. Важлива деталь: базовий рівень PR-кривої дорівнює частці позитивних у вибірці. Якщо хворих 5%, то класифікатор, який роздає оцінки навмання, дасть AP ≈ 0.05 — і AP = 0.30 означає 0.30 / 0.05 = у шість разів краще за випадковість, хоч число й виглядає низьким. Це головна відмінність від AUC, у якої базовий рівень завжди 0.5 незалежно від складу вибірки. Порівнювати AP із 0.5 — типова помилка, через яку викидають цілком робочі моделі.
PR-крива з рухомою точкою
Другий повзунок керує якістю моделі: наскільки далеко рознесені розподіли оцінок.
F1Одне число замість двох
Порівнювати моделі парами чисел незручно: модель A має precision 0.8 і recall 0.4, модель B — 0.6 і 0.6. Яка краща? Щоб отримати впорядкування, треба звести пару в одне число, тобто взяти якесь середнє. І ось тут виявляється, що середніх буває кілька, і вибір між ними — не формальність.
Саме ця властивість нам і потрібна, тому F1 — це гармонійне середнє precision і recall:
Порахуймо на прикладі, у якому різниця найпомітніша. Модель із precision = 1.00 і recall = 0.02 — це та, що знайшла двох хворих зі ста, зате в обох не помилилась. Арифметичне середнє дасть (1.00 + 0.02) / 2 = 0.51, тобто «трієчка», начебто пристойно. Гармонійне: 2 · 1.00 · 0.02 / (1.00 + 0.02) = 0.04 / 1.02 ≈ 0.039. Для скринінгу друге число чесніше: модель, яка проґавила 98 хворих зі ста, не заслуговує на половину балів через те, що була обережною.
Повернімось до питання з початку розділу. Модель A: precision 0.8 і recall 0.4 — F1 = 2 · 0.32 / 1.2 ≈ 0.533. Модель B: 0.6 і 0.6 — F1 = 2 · 0.36 / 1.2 = 0.600. Арифметичне середнє в обох випадках дало б 0.6, тобто нічию, і питання лишилось би без відповіді. Гармонійне віддає перевагу збалансованій B — і саме цього ми від нього хотіли.
Три середні на одній парі чисел
Precision закріплено, recall їде від 0 до 1. Дивись, як розходяться три способи усереднення.
Через чотири базові числа F1 записується компактно:
З цього запису видно головне обмеження: TN у формулі немає взагалі. F1 повністю ігнорує правильно розпізнані негативні випадки. Для рідкісного позитивного класу це радше перевага (TN там і так мільйони), але якщо класи рівноправні й тебе цікавить симетрична якість — F1 не та метрика.
F-betaКоли важливість різна
F1 припускає, що precision і recall однаково цінні. У реальних задачах це майже ніколи не так. Узагальнення вводить параметр важливості:
Читається це так: recall важить у β² разів більше за precision. Розберімо межові випадки, щоб формула перестала бути абстракцією:
β = 1— рівновага, звичайний F1.β = 2— recall у чотири рази важливіший. Класика для медичного скринінгу й виявлення шахрайства: пропуск дорожчий за хибну тривогу.β = 0.5— precision учетверо важливіший. Спам-фільтри, рекомендації, автоматичні блокування — усе, де хибна тривога зачіпає невинного користувача.β → 0— F вироджується в чистий precision.β → ∞— F вироджується в чистий recall.
У інтерактиві нижче кольорова карта показує значення Fβ для всіх можливих пар (precision, recall). Змінюй β і дивись, як лінії рівня перекошуються: при великому β «хороша» зона зміщується вправо, до високого recall, при малому — вгору, до високого precision.
Карта F-beta
Ліворуч — Fβ для всіх пар метрик. Праворуч — як змінюється Fβ для твоєї точки, коли β їде від 0.1 до 5.
ЕкономікаЯка помилка дорожча
Досі ми говорили про метрики абстрактно. Але вибір порогу — це врешті-решт економічне рішення, і його можна поставити чесно: приписати кожному виду помилки вартість і мінімізувати сумарні збитки.
Читається формула так: «загальні збитки при порозі t дорівнюють вартості
однієї хибної тривоги, помноженій на їхню кількість, плюс вартість одного пропуску,
помножена на кількість пропусків». C — це ціна (cost), нижні індекси
кажуть, ціна чого саме; FP(t) і FN(t) — уже знайомі числа з
матриці плутанини, які залежать від порога.
Абсолютні величини не потрібні — досить відношення
C_FN / C_FP. Якщо пропуск обходиться в 20 разів дорожче за хибну тривогу,
оптимальний поріг буде значно нижчим за 0.5. Якщо навпаки — вищим. Це той самий важіль,
що й раніше, але тепер ми крутимо його не на око, а за критерієм.
Для моделі з наступної фігури (популяція 1000 випадків, позитивних 8%) мінімум сумарних втрат лежить ось де:
| CFN / CFP | оптимальний поріг | FP на 1000 | FN на 1000 |
|---|---|---|---|
| 0.1 | 0.89 | 0.8 | 56 |
| 1 | 0.75 | 11 | 29 |
| 3 | 0.64 | 32 | 17 |
| 10 | 0.51 | 81 | 8.5 |
| 30 | 0.40 | 161 | 3.8 |
| 100 | 0.28 | 295 | 1.3 |
Дивись на середній стовпець згори вниз: що дорожчий пропуск, то нижчий поріг, і рухається він плавно, без стрибків. При рівних цінах оптимум 0.75 — далеко за 0.5. Аби поріг зійшов приблизно до 0.5, пропуск має коштувати вдесятеро дорожче за хибну тривогу, і лише при відношенні близько 100 система стає справді підозріливою. Права пара стовпців показує ціну цього руху в штуках: від 0.8 хибної тривоги на 1000 випадків до 295.
| галузь | що таке FP | що таке FN | дорожча помилка |
|---|---|---|---|
| онкоскринінг | зайве обстеження, стрес пацієнта | невиявлена пухлина | FN → високий recall |
| спам-фільтр | важливий лист у теці «спам» | реклама в теці «вхідні» | FP → високий precision |
| антифрод | заблокована чесна оплата | шахрайський переказ пройшов | зазвичай FN, але FP дратує |
| кредитний скоринг | відмова платоспроможному | кредит тому, хто не поверне | залежить від маржі й ставки |
| пошук і рекомендації | нерелевантний результат згори | релевантний не показано | FP на перших позиціях |
| контроль якості | придатну деталь відбраковано | брак пішов до клієнта | FN, якщо є гарантія |
Зверни увагу на рядок про антифрод: там немає однозначної відповіді. Заблокована чесна оплата — це втрачена транзакція і роздратований клієнт, тобто цілком вимірювані гроші. Тому банки не ставлять recall на максимум, а шукають точку, де сума двох збитків найменша. Спробуй знайти її самостійно.
Поріг під задану вартість помилок
Популяція 1000 випадків, поширеність позитивного класу 8%. Витрати в умовних одиницях.
Багато класівМакро, мікро і зважене
Досі клас був один: «позитивний». Коли класів три, десять чи тисяча, precision і recall
рахують для кожного класу окремо за схемою «один проти решти»: для класу
c позитивними вважаються обʼєкти класу c, усі інші — негативними.
Виходить набір із F1 для кожного класу. Далі їх треба звести в одне число, і способів три.
- Макро: порахувати F1 для кожного класу і взяти просте середнє. Усі класи рівноправні незалежно від розміру — рідкісний клас важить стільки ж, скільки найчисельніший.
- Мікро: спершу скласти TP, FP і FN по всіх класах, і лише потім порахувати метрику. Великі класи домінують. У задачі, де кожен обʼєкт має рівно одну мітку, мікро-F1 математично збігається зі звичайною accuracy.
- Зважене (weighted): середнє F1 з вагами, пропорційними розміру класів. Компроміс, який усе одно дає перевагу більшості.
Вибір між ними — це знову питання «що для нас важливо», а не технічна деталь. Якщо рідкісний клас — головна мета системи (як у діагностиці), макро чесніше. Якщо всі обʼєкти рівноцінні (як у розпізнаванні тексту), мікро адекватніше.
Три способи усереднити
Три класи різного розміру. Керуй якістю й розміром рідкісного класу.
МежіЧого ці метрики не бачать
Precision, recall і F1 відповідають на важливі питання, але кожна з них дивиться у вузьку щілину. Сліпих зон три, і кожна коштувала комусь проваленого проєкту.
Вони ігнорують TN
Жодна з трьох метрик не містить у формулі істинно негативних. Це навмисно: у задачах із рідкісним позитивним класом TN настільки багато, що вони затопили б будь-який показник. Але якщо тебе цікавить саме здатність моделі не піднімати тривогу, потрібна окрема метрика — специфічність (specificity):
Пара «recall + specificity» — це те, на чому побудована ROC-крива й показник AUC, тобто вся наступна тема 06. ROC та AUC. На відміну від PR-кривої, ROC не залежить від поширеності класу: обидві її осі є частками всередині одного класу. Це і перевага (порівнюваність між популяціями), і вада (при сильному дисбалансі ROC виглядає оптимістичніше, ніж є насправді).
Вони не питають, наскільки модель упевнена
Після застосування порогу оцінка 0.51 і оцінка 0.99 стають однаковими одиницями. Уся інформація про впевненість зникає. Якщо вона потрібна — а вона потрібна скрізь, де результат моделі йде далі в розрахунок ризику чи очікуваної вигоди, — модель треба перевіряти на калібрування: чи справді серед обʼєктів з оцінкою 0.7 приблизно 70% позитивних. Цьому присвячена тема 21. Калібрування і вибір порога.
Вони мовчать про те, для кого модель помиляється
Усі метрики цієї лекції рахуються по вибірці загалом. Модель може мати чудовий recall у середньому і при цьому систематично пропускати випадки в якійсь підгрупі даних. Загальне число цього не покаже — потрібно рахувати ті самі TPR і FPR окремо по групах. Цим займається окрема тема — 38. Справедливість моделей.
ПідсумокЯк обирати метрику
Зведімо все в порядок дій, який працює для будь-якої задачі класифікації:
- Подивись на баланс класів. Якщо позитивних менше за третину — accuracy вже майже не інформативна, і показувати її як головний результат не варто.
- Назви ціну обох помилок. Не в балах, а в наслідках: що станеться з людиною чи бізнесом при FP і що при FN.
- Обери метрику, що відповідає цій ціні. Дорожчий FN — recall або F2. Дорожчий FP — precision або F0.5. Приблизно рівні — F1.
- Побудуй PR-криву на валідації і подивись на весь діапазон порогів, а не на одне значення 0.5.
- Зафіксуй поріг за критерієм — мінімум втрат, або вимога «recall не нижче 0.95», або максимум Fβ. І зафіксуй його на валідаційній вибірці, а міряй якість на тестовій.
- Звітуй парою чисел, а не одним. «Precision 0.71 при recall 0.88 на порозі 0.23» — це звіт. «Точність 94%» — це реклама.