Машинне навчання · Блок 1 · Тема 05

Ціна помилки

Точність 99% звучить чудово рівно доти, доки хтось не спитає, що саме модель робить у тому одному відсотку.

Уяви лікарню, яка купила модель для раннього виявлення рідкісної хвороби. Продавець показує звіт: точність 99,4%. Головний лікар киває, контракт підписано. За півроку виявляється, що модель не знайшла жодного хворого — вона просто всім підряд пише «здоровий». І це справді дає 99,4% правильних відповідей, бо хворіє шестеро з тисячі.

Ця історія — не курйоз, а типова пастка. Одне число не здатне описати поведінку класифікатора, бо класифікатор помиляється двома різними способами, і ці способи майже ніколи не рівноцінні. Ця лекція про те, як розкласти якість моделі на складові, які справді щось означають: precision (точність позитивного прогнозу) і recall (повнота).

01 / МеханікаОцінка, поріг і рішення

Почнімо з того, чого зазвичай не пояснюють. Класифікатор насправді не видає слово «хворий» або «здоровий». Він видає число — оцінку впевненості, найчастіше в діапазоні від 0 до 1. Логістична регресія, градієнтний бустинг, нейромережа — усі вони на виході дають щось на кшталт 0.83.

Щоб перетворити це число на рішення, потрібен ще один крок, який модель не робить за нас: треба обрати поріг t. Правило просте:

ŷ = 1, якщо p̂ ≥ t   ·   ŷ = 0, якщо p̂ < t

За замовчуванням бібліотеки ставлять t = 0.5, і це створює ілюзію, що рівно половина — щось природне. Насправді 0.5 — просто зручне число. Поріг є окремим рішенням проєктувальника системи, і воно залежить не від моделі, а від того, скільки коштує кожен вид помилки. Модель лишається тією самою; змінюючи поріг, ми лише пересуваємо межу між «тривога» і «спокій».

Ключова думка всієї лекції. Навчання моделі й вибір порогу — це дві незалежні задачі. Першу розвʼязує алгоритм оптимізації, другу — людина, яка розуміє предметну область. Метрики, про які йдеться далі, потрібні саме для другої задачі.

02 / РозкладМатриця плутанини

Коли поріг зафіксовано, кожен обʼєкт вибірки потрапляє рівно в одну з чотирьох категорій. Їх утворює перетин двох питань: яка правда і що сказала модель.

Розташовані у квадрат 2×2, ці чотири числа називаються матрицею плутанини (confusion matrix). У ній міститься вся інформація про поведінку класифікатора при даному порозі: будь-яка метрика, яку ми далі побачимо, — це просто дріб із цих чотирьох чисел.

Найважливіше зауваження: FP і FN — це принципово різні події. Хибна тривога веде до зайвого обстеження. Пропуск — до невиявленої хвороби. Плутати їх в одному показнику означає свідомо втрачати інформацію.

Посунь поріг у інтерактиві нижче. Дивись, як точки перефарбовуються і як разом із ними пливуть усі чотири клітинки та всі метрики одночасно.

Інтерактив 1 · Поріг керує всім

Угорі — оцінки моделі для 240 пацієнтів, розкладені за справжнім діагнозом. Унизу — матриця плутанини для поточного порогу.

accuracy
precision
recall
F1
Спробуй крайнощі: постав поріг у 0.00 — модель оголошує хворими геть усіх, recall стає 1.00, але precision падає до частки хворих у вибірці. Постав 1.00 — жодного позитивного прогнозу, recall = 0, precision взагалі невизначена. Обидва режими дають «непогану» accuracy — і обидва нікому не потрібні.

03 / ПасткаЧому accuracy бреше

Accuracy — це частка правильних відповідей:

accuracy = (TP + TN) / (TP + FP + TN + FN)

Метрика чесна рівно в одному випадку: коли класи приблизно однакові за розміром і однаково важливі. Щойно одна з цих умов ламається, accuracy перестає нести інформацію.

Порахуймо явно. Нехай на 10 000 обстежених припадає 10 хворих — поширеність 0,1%. Розглянемо модель-порожнечу: вона взагалі не дивиться на дані й завжди відповідає «здоровий».

крок 1 · матриця плутанини порожньої моделі

Позитивних прогнозів немає взагалі, отже TP = 0 і FP = 0. Усі 9 990 здорових вгадані: TN = 9 990. Усі 10 хворих пропущені: FN = 10.

крок 2 · accuracy
accuracy = (0 + 9 990) / 10 000 = 0,999 = 99,9%

Формально — майже ідеальний результат. Такий, що його не соромно показати в презентації.

крок 3 · recall
recall = TP / (TP + FN) = 0 / (0 + 10) = 0

Модель не знайшла жодного хворого. Її діагностична користь дорівнює нулю рівно.

крок 4 · висновок

Два числа описують ту саму модель: 99,9% і 0%. Обидва правильні. Різниця в тому, що перше рахує всі відповіді разом, а друге дивиться тільки на клас, заради якого систему й будували.

Ця асиметрія має назву — дисбаланс класів. Він трапляється майже скрізь, де взагалі варто застосовувати машинне навчання: шахрайські транзакції (частки відсотка), відмови обладнання, рідкісні діагнози, релевантні документи серед мільярда сторінок. Чим рідкісніший позитивний клас, тим більше accuracy виміряє розмір більшості замість якості моделі.

У наступному інтерактиві модель незмінна: та сама роздільна здатність, той самий поріг. Змінюється лише частка хворих у популяції. Дивись, що при цьому робить кожна метрика.

Інтерактив 2 · Дисбаланс: accuracy тримається, precision валиться

Одна й та сама модель у популяціях із різною поширеністю хвороби.

accuracy
«усі здорові»
precision
recall
Що читати: recall не змінюється взагалі — він дивиться лише на хворих, і від їхньої кількості не залежить. Accuracy самої моделі теж стоїть на місці (поріг посередині, тож чутливість і специфічність тут рівні). А от accuracy порожньої моделі росте разом із дисбалансом і обганяє справжню модель приблизно на 10% позитивних. Precision тим часом обвалюється: кожен крок дисбалансу додає хибних тривог із дедалі більшої маси здорових.

04 / PrecisionЧи можна вірити вироку

Перша з двох потрібних метрик відповідає на питання: якщо модель сказала «так», наскільки ймовірно, що вона має рацію?

precision = TP / (TP + FP)

У знаменнику — усі позитивні прогнози, і правильні, і хибні. Тобто precision дивиться на стовпець матриці: беремо все, що модель позначила як позитивне, і питаємо, яка частка з цього виявилась справжньою.

Українською precision зазвичай перекладають як «точність», що плутається з accuracy — теж «точністю». Щоб не плутатись, у цій лекції я вживаю англійські назви, а українською описово: точність позитивного прогнозу.

Precision — це метрика довіри до сигналу. Вона важлива там, де хибна тривога дорого коштує: користувач, чий важливий лист потрапив у спам; клієнт, якому безпідставно заблокували картку; юрист, який мусить прочитати тисячу нерелевантних документів. У всіх цих випадках FP витрачає чужий час, гроші або довіру.

Важливо. Precision не визначена, коли модель не зробила жодного позитивного прогнозу: у знаменнику нуль. Бібліотеки в цьому разі зазвичай повертають 0 і друкують попередження. Це не «поганий precision» — це відсутність відповіді, і плутати ці речі не можна.

05 / RecallСкільки ми проґавили

Друга метрика ставить дзеркальне питання: яку частку справжніх позитивних випадків модель узагалі помітила?

recall = TP / (TP + FN)

Тепер у знаменнику — усі, хто насправді позитивний, незалежно від того, що сказала модель. Recall дивиться на рядок матриці. Його синоніми, які ти зустрінеш у літературі: sensitivity (чутливість) у медицині і TPR (true positive rate) у теорії виявлення сигналів. Це одне й те саме число.

Recall — метрика повноти охоплення. Вона головна там, де пропуск катастрофічний: невиявлена пухлина, незнайдений дефект у партії деталей, шахрайський переказ, який пройшов. Тут ми готові терпіти хибні тривоги, бо перевірити зайве дешевше, ніж пропустити справжнє.

Зверни увагу на симетрію: precision штрафується за FP, recall — за FN. Кожна метрика бачить рівно один вид помилки і повністю ігнорує другий. Саме тому їх завжди наводять парою: окремо взяте будь-яке з цих чисел легко зробити ідеальним.

06 / КонфліктКомпроміс, якого не уникнути

Чому не можна мати обидві метрики високими? Тому що обома керує один і той самий важіль — поріг. Опускаємо поріг: модель стає підозріливішою, ловить більше справжніх хворих (recall росте), але заодно чіпляє більше здорових (precision падає). Піднімаємо поріг: кожен позитивний вирок стає надійнішим (precision росте), але частина хворих лишається непоміченою (recall падає).

Це не вада конкретної моделі, а наслідок того, що розподіли оцінок для двох класів перекриваються. Поки в зоні перекриття є і хворі, і здорові, будь-яка вертикальна межа розріже обидві групи одночасно. Прибрати компроміс може тільки краща модель — така, що розсуває розподіли далі один від одного.

Інтерактив 3 · Усі чотири метрики як функції порогу

Одна модель, 101 значення порогу. Вертикальна лінія — поточний вибір.

accuracy
precision
recall
F1
Головне спостереження: recall спадає монотонно, precision загалом росте, а F1 має чіткий максимум між ними. Accuracy ж має широке пласке плато і навіть у найгіршій точці не падає нижче 0,70 — частки більшого класу. Саме тому за нею не видно, що модель робить із рідкісним класом.

07 / PR-криваУся модель на одному графіку

Замість дивитись на два графіки окремо, зручно викинути поріг із координат і побудувати залежність precision від recall безпосередньо. Кожна точка такої кривої — це один поріг. Кінець із високим recall відповідає низьким порогам, кінець із високим precision — високим.

Форма кривої говорить про модель більше, ніж будь-яке одне число. Крива, що тулиться до правого верхнього кута, означає, що є пороги, які дають одразу і повноту, і надійність. Крива, що падає одразу, означає: розподіли перекриваються сильно, і компроміс жорсткий.

Площу під цією кривою називають average precision (AP). Це чесний однокласний підсумок якості ранжування, який не залежить від вибору порогу. Важлива деталь: базовий рівень PR-кривої дорівнює частці позитивних у вибірці. Якщо хворих 5%, то випадковий класифікатор дасть AP ≈ 0,05, і AP = 0,3 — це вже втричі краще за випадковість, хоч і виглядає низьким числом.

Інтерактив 4 · PR-крива з рухомою точкою

Другий повзунок керує якістю моделі: наскільки далеко рознесені розподіли оцінок.

precision
recall
AP площа
випадковий
Постав роздільність на 0 — розподіли зіллються, і крива стане горизонтальною лінією на рівні частки позитивних: жоден поріг не дає переваги. Постав на 5 — крива притиснеться до верхнього краю, і зʼявиться діапазон порогів, де обидві метрики близькі до одиниці.

08 / F1Одне число замість двох

Порівнювати моделі парами чисел незручно: модель A має precision 0,8 і recall 0,4, модель B — 0,6 і 0,6. Яка краща? Щоб отримати впорядкування, беруть гармонійне середнє двох метрик:

F1 = 2 · precision · recall / (precision + recall)

Чому гармонійне, а не звичайне? Бо звичайне середнє надто поблажливе до перекосу. Для моделі з precision = 1,0 і recall = 0,02 арифметичне середнє дасть 0,51 — начебто пристойно. Гармонійне дасть 0,039, бо воно притягується до меншого з двох чисел. Саме така поведінка нам і потрібна: модель, яка провалила одну зі сторін, не має отримувати половину балів.

Через чотири базові числа F1 записується компактно:

F1 = TP / (TP + ½(FP + FN))

З цього запису видно головне обмеження: TN у формулі немає взагалі. F1 повністю ігнорує правильно розпізнані негативні випадки. Для рідкісного позитивного класу це радше перевага (TN там і так мільйони), але якщо класи рівноправні й тебе цікавить симетрична якість — F1 не та метрика.

09 / F-betaКоли важливість різна

F1 припускає, що precision і recall однаково цінні. У реальних задачах це майже ніколи не так. Узагальнення вводить параметр важливості:

Fβ = (1 + β2) · precision · recall / (β2 · precision + recall)

Читається це так: recall важить у β² разів більше за precision. Розберімо межові випадки, щоб формула перестала бути абстракцією:

У інтерактиві нижче кольорова карта показує значення Fβ для всіх можливих пар (precision, recall). Змінюй β і дивись, як лінії рівня перекошуються: при великому β «хороша» зона зміщується вправо, до високого recall, при малому — вгору, до високого precision.

Інтерактив 5 · Карта F-beta

Ліворуч — Fβ для всіх пар метрик. Праворуч — як змінюється Fβ для твоєї точки, коли β їде від 0,1 до 5.

Fβ
F1 для порівняння
Перевір межі: при β = 0.1 значення F майже дорівнює precision, при β = 5 — майже дорівнює recall. Тобто β — це буквально ручка, якою ти плавно переїжджаєш від однієї метрики до іншої.

10 / ЕкономікаЯка помилка дорожча

Досі ми говорили про метрики абстрактно. Але вибір порогу — це врешті-решт економічне рішення, і його можна поставити чесно: приписати кожному виду помилки вартість і мінімізувати сумарні збитки.

втрати(t) = CFP · FP(t) + CFN · FN(t)

Абсолютні величини не потрібні — досить відношення C_FN / C_FP. Якщо пропуск обходиться в 20 разів дорожче за хибну тривогу, оптимальний поріг буде значно нижчим за 0,5. Якщо навпаки — вищим. Це той самий важіль, що й раніше, але тепер ми крутимо його не на око, а за критерієм.

галузьщо таке FPщо таке FNдорожча помилка
онкоскринінгзайве обстеження, стрес пацієнтаневиявлена пухлинаFN → високий recall
спам-фільтрважливий лист у теці «спам»реклама в теці «вхідні»FP → високий precision
антифродзаблокована чесна оплаташахрайський переказ пройшовзазвичай FN, але FP дратує
кредитний скорингвідмова платоспроможномукредит тому, хто не повернезалежить від маржі й ставки
пошук і рекомендаціїнерелевантний результат згорирелевантний не показаноFP на перших позиціях
контроль якостіпридатну деталь відбракованобрак пішов до клієнтаFN, якщо є гарантія

Зверни увагу на рядок про антифрод: там немає однозначної відповіді. Заблокована чесна оплата — це втрачена транзакція і роздратований клієнт, тобто цілком вимірювані гроші. Тому банки не ставлять recall на максимум, а шукають точку, де сума двох збитків найменша. Спробуй знайти її самостійно.

Інтерактив 6 · Поріг під задану вартість помилок

Популяція 1000 випадків, поширеність позитивного класу 8%. Витрати в умовних одиницях.

FP на 1000
FN на 1000
втрати
мінімум
Що видно: зі зростанням CFN/CFP оптимальний поріг їде вліво — система стає підозріливішою. При відношенні 1:1 оптимум навпаки заходить далеко за 0,5: позитивних усього 8%, тож хибні тривоги накопичуються швидше за пропуски. Це і є формальна відповідь на питання «який поріг брати».

11 / Багато класівМакро, мікро і зважене

Досі клас був один: «позитивний». Коли класів три, десять чи тисяча, precision і recall рахують для кожного класу окремо за схемою «один проти решти»: для класу c позитивними вважаються обʼєкти класу c, усі інші — негативними. Виходить набір із F1 для кожного класу. Далі їх треба звести в одне число, і способів три.

Вибір між ними — це знову питання «що для нас важливо», а не технічна деталь. Якщо рідкісний клас — головна мета системи (як у діагностиці), макро чесніше. Якщо всі обʼєкти рівноцінні (як у розпізнаванні тексту), мікро адекватніше.

Інтерактив 7 · Три способи усереднити

Три класи різного розміру. Керуй якістю й розміром рідкісного класу.

макро-F1
мікро-F1
зважене
F1 класу C
Ключовий дослід: постав recall рідкісного класу в 0 при розмірі 50. Мікро-F1 просяде на кілька відсотків і виглядатиме пристойно, макро-F1 провалиться на третину. Модель, яка повністю ігнорує цілий клас, «непогана» лише в мікроусередненні.

12 / МежіЧого ці метрики не бачать

Precision, recall і F1 — потужний інструмент, але й у них є сліпі зони. Варто знати три.

Вони ігнорують TN

Жодна з трьох метрик не містить у формулі істинно негативних. Це навмисно: у задачах із рідкісним позитивним класом TN настільки багато, що вони затопили б будь-який показник. Але якщо тебе цікавить саме здатність моделі не піднімати тривогу, потрібна окрема метрика — специфічність (specificity):

specificity = TN / (TN + FP) = 1 − FPR

Пара «recall + specificity» — це те, на чому побудована ROC-крива й показник AUC. На відміну від PR-кривої, ROC не залежить від поширеності класу: обидві її осі є частками всередині одного класу. Це і перевага (порівнюваність між популяціями), і вада (при сильному дисбалансі ROC виглядає оптимістичніше, ніж є насправді).

Вони не питають, наскільки модель упевнена

Після застосування порогу оцінка 0,51 і оцінка 0,99 стають однаковими одиницями. Уся інформація про впевненість зникає. Якщо вона потрібна — а вона потрібна скрізь, де результат моделі йде далі в розрахунок ризику чи очікуваної вигоди, — модель треба перевіряти на калібрування: чи справді серед обʼєктів з оцінкою 0,7 приблизно 70% позитивних.

Вони мовчать про те, для кого модель помиляється

Усі метрики цієї лекції рахуються по вибірці загалом. Модель може мати чудовий recall у середньому і при цьому систематично пропускати випадки в якійсь підгрупі даних. Загальне число цього не покаже — потрібно рахувати ті самі TPR і FPR окремо по групах. Це вже тема наступної лекції.

13 / ПідсумокЯк обирати метрику

Зведімо все в порядок дій, який працює для будь-якої задачі класифікації:

  1. Подивись на баланс класів. Якщо позитивних менше за третину — accuracy вже майже не інформативна, і показувати її як головний результат не варто.
  2. Назви ціну обох помилок. Не в балах, а в наслідках: що станеться з людиною чи бізнесом при FP і що при FN.
  3. Обери метрику, що відповідає цій ціні. Дорожчий FN — recall або F2. Дорожчий FP — precision або F0.5. Приблизно рівні — F1.
  4. Побудуй PR-криву на валідації і подивись на весь діапазон порогів, а не на одне значення 0,5.
  5. Зафіксуй поріг за критерієм — мінімум втрат, або вимога «recall не нижче 0,95», або максимум Fβ. І зафіксуй його на валідаційній вибірці, а міряй якість на тестовій.
  6. Звітуй парою чисел, а не одним. «Precision 0,71 при recall 0,88 на порозі 0,23» — це звіт. «Точність 94%» — це реклама.
Далі в практиці. У practice.ipynb ти побудуєш матрицю плутанини вручну через NumPy, звіриш із classification_report зі scikit-learn, намалюєш PR-криву й підбереш поріг під задану матрицю вартостей на незбалансованому датасеті.

Далі в темі

Теорію прочитано. Тепер закріпи її на практиці.