Куди тиснути

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

Ти натиснув «навчити», дочекався, поки пробіжить прогрес-бар, і отримав число. Одне. Наприклад, F1 дорівнює 0.427. Далі екран перестає підказувати, і настає момент, який у курсах зазвичай проскакують за один абзац: що робити з цим числом. Складнішу модель? Докупити даних? Крутити гіперпараметри? Три відповіді звучать однаково розумно, коштують однаково дорого — і в кожній конкретній задачі щонайбільше одна з них правильна.

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

ПостановкаЧисло є. І що?

Наша дошка оголошень про вживані телефони мусить сама відсіювати шахрайські оголошення — ті, де телефона не існує, а є лише приманка з передоплатою. У базі 6 000 оголошень із відомою відповіддю: 2 024 з них виявились шахрайськими, це 33.7 %. Оголошення описують пʼять чисел: ціна в гривнях, ціна відносно медіанної ціни по всій дошці, вік акаунта продавця в днях, кількість фото й довжина опису. Дошку ділимо на 3 900 навчальних і 2 100 перевірочних оголошень, як заведено ще з теми Train / Validation / Test.

Навчаємо логістичну регресію й міряємо F1 на перевірочних оголошеннях. Виходить 0.427. Модель ловить 33.9 % шахраїв, і в 57.7 % випадків, коли вона кричить «шахрай», вона права.

Тепер уяви, що це твій перший робочий день. Ти дивишся на 0.427 і не знаєш нічого: ні чи це багато, ні чи це мало, ні куди рухатись. І це не через брак досвіду — цього числа фізично недостатньо, щоб ухвалити рішення. Одне число ніколи не каже, що робити далі. Далі — три кроки, які перетворюють його на рішення: знайти дно, знайти стелю й поставити діагноз.

Ще одне число, яке варто завести одразу, — гроші. Домовимось, як у темі про поріг: заблокувати чесне оголошення коштує майданчику 200 грн, пропустити шахрайське — 1 800 грн. Наша модель на 2 100 перевірочних оголошеннях дає 176 хибних тривог і 468 пропусків, тобто 877 600 грн збитку. Метрика показує, наскільки модель добра; гроші показують, наскільки це важливо.

ДноСпершу дно

Число без базової лінії не означає рівно нічого. Базова лінія — це навмисно тупе рішення, з яким ти порівнюєш своє. Корисно мати три різні, бо вони відповідають на три різні питання.

Тепер 0.427 читається. Модель удвічі краща за правило — отже, навчання не було марним. І помітно гірша за людину — отже, у продакшен її пускати рано. Одразу видно й наступний крок: не «взяти нейромережу», а закрити розрив із модератором.

Лінійка задачі: дно, ми, стеля

Одна вісь F1 і все, що на ній варто позначити перед тим, як щось покращувати.

Ліворуч від нашої позначки — усе, що ми вже перевершили; праворуч — усе, що ще можна виграти. Відстань від 0.427 до 0.645 і є запас задачі: 0.218 за F1. Якби наша позначка стояла на 0.63, уся ця лекція звелася б до одного речення: «зупинись».

Базові лінії — це не формальність і не звіт для начальства. Це шкала, без якої «0.427» — просто набір символів. Детальніше про те, як обирати базову лінію під різні задачі й чим порівняння моделей відрізняється від порівняння чисел, — у темі Порівняння моделей; тут вона потрібна нам як нижня риска на шкалі.

СтеляТепер стеля

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

Стеля — це найкраща якість, яку в принципі можна отримати з цих даних. Вона існує тому, що в даних є незвідний шум: два оголошення можуть виглядати однаково за всіма пʼятьма ознаками, а виявитись різними — одне шахрайське, друге ні. Жодна модель не розрізнить те, що не розрізняється в даних.

Виміряти стелю точно неможливо, але оцінити — можна, і є два практичні способи.

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

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

Тут варто спинитись, бо число дивує: віщун бачить справжню ймовірність кожного оголошення — і все одно помиляється в третині випадків. Як так?

Тому що знати ймовірність і знати відповідь — різні речі. Візьми сотню оголошень, у яких справжня ймовірність шахрайства дорівнює 0.30. Віщун бачить це «0.30» точно, до останнього знака. Але тридцять із цієї сотні справді виявляться приманками, а сімдесят — ні, і яка саме тридцятка, не написано ніде: у даних цієї інформації немає. Що б віщун із сотнею не зробив, частина рішень буде хибною. Заблокує всіх — сімдесят хибних тривог. Пропустить усіх — тридцять пропусків.

Порахуймо руками на десяти оголошеннях, щоб побачити це в числах. Хай у чотирьох оголошень справжня ймовірність шахрайства 0.9, а в шести — 0.2. Скільки шахрайських насправді? У першій четвірці в середньому 4 × 0.9 = 3.6, у шістці 6 × 0.2 = 1.2, разом 4.8. Віщун блокує ту четвірку, де ймовірність висока — це найкраще, що з такими числами взагалі можна зробити. Тоді:

Звідси precision = 3.6 / 4 = 0.900, recall = 3.6 / 4.8 = 0.750, а F1 = 2 × 0.900 × 0.750 / (0.900 + 0.750) = 0.818. Не одиниця — при тому, що помилок «через незнання» тут немає взагалі. Віщун програв не розуму, а випадковості, зашитій у самі дані.

На нашій дошці ймовірності розподілені гірше, ніж у цьому прикладі: багато оголошень сидить у сірій зоні біля 0.3–0.5, де ставити можна на будь-що. Тому й стеля виходить не 0.818, а 0.645.

Чесне застереження. Стелю 0.645 ми можемо порахувати лише тому, що дані навчальні й ми самі знаємо справжні ймовірності. У справжній задачі цього розкошу немає — там лишається перший спосіб, узгодженість людей, і він дає не число, а діапазон. Це нормально: щоб ухвалити рішення «працювати далі чи зупинитись», вистачає знати, стеля десь коло 0.65 чи десь коло 0.95.
Практичний висновок. 0.427 проти стелі 0.645 — запас великий, працювати є над чим. Якби ми стояли на 0.63, правильним рішенням було б зупинитись і піти вирішувати іншу задачу, навіть якщо замовник просить «ще трохи». «Ще трохи» за стелею не існує — там можна лише випадково вгадати тестову вибірку, а це не поліпшення, а оптимістичне зміщення.

ДіагностикаДерево рішень діагноста

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

Дерево рішень діагноста

Три числа на вході — одна гілка на виході. Кожна гілка закінчується діями, а не порадою «подумайте ще».

Гілки перевіряються згори вниз і зліва направо: спершу навчальна помилка, і лише якщо вона мала — розрив. Порядок не декоративний. Поки модель погана на тих самих даних, за якими вчилась, розмови про перенавчання передчасні, а додаткові дані не змінять нічого.

Пройдемо гілки словами.

Гілка А: висока помилка вже на навчанні. Модель не впоралась із даними, які бачила. Це недонавчання: їй бракує або гнучкості, або інформації. Дії: складніша модель, кращі ознаки, довше навчання, слабший штраф. Дані тут не допоможуть узагалі — пряма, навчена на мільйоні прикладів, лишається прямою.

Гілка Б: на навчанні добре, на валідації погано. Модель запамʼятала конкретні приклади замість правила. Це перенавчання. Дії: більше даних, регуляризація, простіша модель, рання зупинка. Це єдина з трьох гілок, де замовляти розмітку має сенс.

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

Наш випадок: на навчанні F1 = 0.451, на валідації 0.427, стеля 0.645. Розриву майже немає — 0.024, — зате до стелі цілих 0.218. Це гілка А, недонавчання, і жодних сумнівів тут немає. Отже, докупляти дані марно; треба або гнучкіша модель, або краща інформація на вході.

ДовідкаСимптом — причина — дія

Те саме у вигляді, зручному для роботи: побачив ліворуч — зроби праворуч.

симптомймовірна причинаперша дія
обидві помилки високінедонавчаннядодати ознак, узяти гнучкішу модель, навчати довше
навчальна мала, валідаційна великаперенавчаннядодати даних, увімкнути регуляризацію, спростити модель
обидві малі, у бою поганодрейф данихзвірити розподіли ознак, перенавчити на свіжих даних
метрика підозріло високавитік данихперевірити кожну ознаку на доступність у момент прогнозу
валідаційна нижча за навчальнувибірки різніперевірити поділ і стратифікацію
метрика скаче від запуску до запускузамала вибірка або велика дисперсіякрос-валідація, усереднення, більший тест
усі помилки в одній групі обʼєктівбракує ознаки саме про цю групуаналіз помилок, потім нова ознака
модель гірша за просте правилопомилка в конвеєріперевірити масштабування, пропуски, порядок стовпців

Останній рядок трапляється частіше, ніж хочеться визнавати. Якщо навчена модель програє пʼятирядковому if, найімовірніша причина не в алгоритмі, а в тому, що на вхід їй приїхало не те, що ти думаєш.

ПриладКриві навчання як прилад

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

Будується так: береш підвибірки зростаючого розміру, на кожній навчаєш модель і міряєш якість двічі — на самій підвибірці й на відкладеній частині. У scikit-learn це один виклик learning_curve. Читається за трьома ознаками: розрив між кривими, нахил валідаційної кривої в кінці й відстань до стелі.

Три криві навчання, три різні вироки

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

F1 на навчанні—
F1 на валідації—
розрив—
до стелі 0.645—
Вісь обсягу логарифмічна: від 100 до 3 120 навчальних оголошень. Числа в табло — для найправішої точки, тобто для повної вибірки. Сценарій «недонавчання» — логістична регресія, якій залишили тільки вік акаунта й кількість фото. «Перенавчання» — дерево без обмеження глибини. «Стеля» — та сама логістична регресія, але з шостою ознакою, якої в наших пʼятьох немає: її ми знайдемо в розділі 08, розглядаючи помилки очима. Тут вона потрібна лише щоб показати третю форму кривих — ту, з якою робота закінчена.

Три форми — три різні дії, і в цьому вся цінність приладу.

Криві злиплись низько. Розрив −0.006, приріст за останнє подвоєння вибірки +0.002, до стелі 0.221. Модель однаково безпорадна і на знайомих, і на нових оголошеннях. Даних у неї вже вдосталь — бракує не прикладів, а інформації в кожному прикладі. Замовляти розмітку тут означає купити те, що вже є.

Розрив величезний і не закривається. На навчанні дерево дає рівно 1.000 — воно запамʼятало кожне оголошення, — а на валідації 0.541. Але подивись на праву частину: валідаційна крива ще росте, за останнє подвоєння вибірки вона додала 0.027. Ось тут дані працюють, і працюють найдешевшим способом із можливих.

Криві зійшлись високо. Розрив −0.003, приріст за останнє подвоєння −0.004, до стелі 0.025. Це не поразка, а фініш: модель узяла від даних майже все, що в них є. Дані не допоможуть — але з протилежної причини, ніж у першому випадку.

Головна пастка приладу. Перший і третій сценарії виглядають на графіку однаково: дві криві, що зійшлися й вирівнялись. Відрізняє їх лише висота — і саме тому стелю треба знати до того, як дивитись на криві. Без стелі злиплі криві на рівні 0.42 неможливо відрізнити від злиплих кривих на рівні 0.62, а це протилежні ситуації: у першій попереду ще половина роботи, у другій роботи не лишилось.

ПомилкиСто помилок очима

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

  1. Візьми сто оголошень, на яких модель помилилась. Не всі 644 — рівно сто, випадкових. Більше не дасть нової інформації, менше дасть шум.
  2. Подивись на кожне очима й запиши, чому, на твою думку, модель помилилась. Не метрику, не важливість ознак — саме рядок даних.
  3. Згрупуй записане за причиною.
  4. Порахуй, скільки коштує кожна група в гривнях.

Четвертий крок — той, який відрізняє аналіз помилок від розглядання помилок. Групи різні не тільки за розміром: пропустити шахрая коштує 1 800 грн, а хибно заблокувати чесного — 200 грн. Група з двадцяти пропусків дорожча за групу з тридцяти хибних тривог.

Сто помилок, згрупованих за причиною

Довжина стовпчика — ціна групи в гривнях, а не кількість помилок. Обери групу — побачиш реальні оголошення з неї.

помилок у групі—
ціна групи—
хибних тривог—
пропусків—
Сто помилок разом коштують 136 800 ₴. Стовпчики впорядковані за ціною. У таблиці внизу: ціна — ціна оголошення, до дошки — її відношення до медіани всієї дошки (ознака, яку бачить модель), до категорії — відношення до медіани своєї категорії (ознаки, якої модель не бачить), далі вік акаунта в днях, кількість фото й вирок моделі.

Читаємо результат. Найдорожча група — 48 помилок із 100, і вона коштує 72 000 грн зі 136 800, тобто 52.6 % усіх втрат. Усі 48 — не телефони: ноутбуки й аксесуари. Причина видно з першого ж рядка таблиці: ноутбук за 30 523 грн має відношення до медіани дошки 3.65 — «утричі дорожчий за типове оголошення», а всередині своєї категорії він коштує рівно стільки, скільки має, 0.99. Модель порівнювала ціну ноутбука з медіаною по всій дошці, де більшість — телефони, і робила з цього висновок «дуже дорого, отже точно не приманка». Тридцять девʼять шахрайських ноутбуків і аксесуарів пройшли повз.

Ось чому аналіз помилок такий ефективний. Ні метрика, ні важливість ознак цього не показали б: з погляду метрики модель просто «трохи слабка». Дефект видно тільки тоді, коли дивишся на самі рядки — і виявляється, що 38 % дошки обробляються за неправильною шкалою.

ВиправленняЩо дала знахідка

Лікування випливає з діагнозу дослівно: додати ознаку «ціна відносно медіани своєї категорії». Один стовпчик, порахований із даних, які вже є. Жодних нових оголошень, жодної складнішої моделі, та сама логістична регресія.

модельF1 на тестіхибних тривогпропусківзбиток
дурна константа0.00007081 274 400 грн
правило0.210266221 124 800 грн
модель v10.427176468877 600 грн
модель v2, + одна ознака0.594201324623 400 грн
модератор-людина0.566240334649 200 грн
стеля задачі0.645———

F1 виріс із 0.427 до 0.594, збиток упав на 254 200 грн на кожних 2 100 оголошеннях. Модель уперше обійшла живого модератора. І все це — один стовпчик, знайдений за годину розглядання ста рядків.

А тепер чесна половина історії. Окрилені успіхом, ми додали ще три похідні ознаки — квадрат відносної ціни, логарифм віку акаунта й добуток кількості фото на відносну ціну. Звучало розумно. На крос-валідації результат змінився з 0.620 на 0.620 — насправді на −0.0004, тоді як сама похибка вимірювання тут ±0.010. На тесті — 0.594 проти 0.594. Три ознаки, пів дня роботи, нуль ефекту, і правильне рішення — викинути їх, а не залишити «про всяк випадок».

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

ДаніСкільки дасть більше даних

«Треба більше даних» — найчастіша відповідь на будь-яку проблему в машинному навчанні й найдорожча в перевірці. Розмітити ще десять тисяч оголошень — це місяці роботи людей. Перед тим, як це замовляти, приріст можна оцінити наперед.

Спосіб такий. Будуємо криву «розмір вибірки → якість» на тому, що вже є, і продовжуємо її вперед. Продовжувати навмання не можна — потрібна форма кривої. Емпірично якість росте за степеневим законом: із кожним подвоєнням вибірки залишок до межі скорочується в однакову кількість разів. Формулою:

F1(n) = A − B · n−α

Тут n — кількість навчальних оголошень; A — межа, до якої крива прямує, коли даних стає нескінченно багато; B і α (грецька «альфа») — два числа, що описують, наскільки швидко крива до цієї межі підбирається. Читається все разом так: чим більше даних, тим менший залишок до межі, і зменшується він тим повільніше, чим ти ближче. Три числа A, B і α підбираються так, щоб крива якнайкраще лягла на вже поміряні точки. Значок n−α читається «одиниця, поділена на n у степені α»: що більше n, то менше це число, і то менше залишається відняти від межі.

Порахуймо на числах, бо інакше формула лишиться значками. Підгонка по всіх наших десяти точках дає A = 0.661, B = 0.469, α = 0.33.

Крок 1 · що обіцяє формула на тому, що вже є

У нас 3 120 навчальних оголошень. Спершу 3 120 у степені 0.33 — це 14.2, отже 3120−0.33 дорівнює 1 / 14.2 = 0.0703. Множимо на B: 0.469 × 0.0703 = 0.033. Це і є залишок до межі. Тоді F1 = 0.661 − 0.033 = 0.628. Поміряли ми 0.620 — крива проходить поруч, але не крізь останню точку, і це нормально: підгонка шукає компроміс по всіх десяти, а не збіг з однією.

Крок 2 · скільки треба для F1 = 0.640

Потрібний залишок: 0.661 − 0.640 = 0.021. Тобто теперішній залишок 0.033 має скоротитись у 0.033 / 0.021 = 1.57 раза.

Крок 3 · переводимо це в оголошення

Залишок падає як n−0.33, тож щоб він зменшився в 1.57 раза, обсяг має вирости в 1.57 у степені 1 / 0.33, тобто в 1.573.03 ≈ 3.9 раза: з 3 120 приблизно до 12 200 оголошень.

Інтерактив нижче на тій самій вимозі показує 12 743 — трохи більше, бо цілиться він не в кругле 0.640, а в 0.620 + 0.02 = 0.6401, і рахує без наших округлень по дорозі. Різниця в чотири відсотки тут нічого не міняє: обидва числа кажуть те саме — «учетверо більше даних».

І головне, що видно з арифметики кроку 3: показник α стоїть у знаменнику. Що він менший, то дорожче обходиться кожна наступна сота F1. При α = 0.33 скорочення залишку вдвічі коштує вісім разів більше даних; при α = 0.20 — уже тридцять два рази. Ось звідки береться відчуття, що «модель перестала вчитись»: вона не перестала, просто ціна кроку росте швидше, ніж бюджет.

Скільки оголошень треба для потрібного приросту

Лівий повзунок — скільки навчальних оголошень у тебе вже є. Правий — на скільки треба підняти F1. Підгонка будується тільки по точках ліворуч від твоєї позначки, як було б у житті.

F1 зараз—
межа підгонки—
треба оголошень—
у скільки разів—
Точки — виміряна якість, вусики — плюс-мінус одна стандартна похибка середнього по пʼяти фолдах крос-валідації. Суцільна лінія — підгонка по видимих точках, пунктир — її продовження, світла смуга навколо — та сама похибка, перенесена на прогноз. Горизонтальна риска — потрібний рівень.

Прожени лівий повзунок від краю до краю з приростом +0.02. Коли даних 260, відповідь оптимістична: треба 738 оголошень, менш ніж утричі більше — тиждень збору. Коли даних уже 1 100, треба 2 517, теж по силі. А на повній вибірці з 3 120 та сама вимога коштує 12 743 оголошення, у 4.1 раза більше, ніж є. Приріст +0.03 із цієї точки вимагає вже 93 822 навчальних оголошення, +0.04 — понад 330 мільйонів, а +0.05 не досягається взагалі: підгонка каже, що межа цієї моделі на цих ознаках — 0.661, і скільки даних не давай, вище не буде.

Чого варта така екстраполяція. Подивись на «межу підгонки» при 260 оголошеннях: 0.818. Реальна межа — близько 0.62. Помилилась удвічі за запасом. Це не дефект методу, а його природа: на короткій ділянці крива ще майже пряма, і будь-яке продовження виглядає оптимістично. Тому екстраполяції варто вірити на одне-два подвоєння вперед і не варто — на порядок. Практичне правило: якщо прогноз каже «вдвічі більше даних», плануй збір; якщо «у сто разів» — шукай інший шлях.

ПроцесОдна зміна за раз

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

Уяви типовий вечір: ти додав ознаку, замінив логістичну регресію на градієнтний бустинг і заодно підкрутив поріг. Метрика зросла з 0.43 до 0.61. Питання: що спрацювало? Відповіді немає. Можливо, ознака дала +0.17, а бустинг забрав 0.02. Можливо, навпаки. Ти не знаєш, який із трьох кроків залишити, який відкотити й що робити наступного разу. Три зміни дали одне число, а одне число несе рівно один біт інформації — «стало краще» або «стало гірше».

Тому правило нудне й нерушиме: одна зміна — один замір — один рядок у журналі. Журнал — це буквально таблиця; ось наш, справжній:

крокщо змінилиF1 на крос-валідаціїзмінавирок
0базова лінія: одне правило0.210 (на тесті)—дно шкали
1логістична регресія, 5 ознак0.453 ± 0.023—старт
2дерево без обмеження глибини0.541 ± 0.031+0.088на навчанні 1.000 — перенавчання
3назад логістична, + ціна до медіани категорії0.620 ± 0.033+0.167прийнято
4ще три похідні ознаки0.620 ± 0.0230.000відхилено
5class_weight="balanced"0.657 ± 0.020+0.037це зсув порога, не нове знання
—фінальний замір кроку 3 на тесті0.594—чесне число

Журнал відповідає на питання, які без нього губляться. Крок 2 виглядав вдалим: дерево підняло F1 на 0.088. Але поруч записано, що на навчанні воно дало 1.000, — і це підказало, що виграш тут випадковий, а справжня причина слабкості деінде. Дерево вміє різати ціну різними порогами в різних гілках, тому частково обійшло нашу зламану ознаку грубою силою; ознака з кроку 3 вирішила ту саму проблему чесно й дала вдвічі більше.

Той самий журнал, але з вусиками

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

Дивись не на крапки, а на довжину поперечок. Крок 4 стоїть рівно там само, де крок 3, і його інтервал накладається на попередній цілком — три ознаки, пів дня роботи, і нуль, який ми навіть не змогли б відрізнити від нуля, якби він був не нуль, а +0.01. Крок 5, навпаки, дав +0.037 при похибці ±0.020 — це вдвічі більше за поперечку, тобто зміна справжня, хоч і скромна. Правило читається з картинки просто: приріст, коротший за власну поперечку, — це не приріст, а те, як цього разу лягли дані. Порівняння тут грубе: чесніше було б звірити ті самі фолди між собою, а не два незалежні інтервали, — але для рішення «продовжувати чи ні» цієї грубості вистачає, і саме її бракує в таблиці з голими числами.

Цикл розробки моделі

Один оберт — одна зміна. Виходів із циклу три, і всі три законні.

Крок «записати в журнал» виглядає бюрократією рівно доти, доки не настане момент, коли треба пояснити, чому модель така, як вона є. Памʼять на це не розрахована: через три тижні ти не згадаєш, чи пробував уже цю ознаку.

СтопКоли зупинитись

Останнє питання теми — і найнеприємніше, бо зупинятись ніхто не любить. Є три чесні критерії, і достатньо одного.

Приріст менший за похибку вимірювання. Наше F1 = 0.594 поміряне на 2 100 оголошеннях. Якби вибірка була інша, число вийшло б інше; розкид цієї величини — приблизно ±0.016 (його можна оцінити бутстрепом або крос-валідацією). Отже, покращення на 0.01 ти просто не побачиш: воно потоне в шумі вимірювання. А з інтерактиву 3 видно, що +0.01 із нашої точки коштує ще 744 оголошення — тобто ми пропонуємо витратити гроші на різницю, яку не зможемо підтвердити.

Наступний крок дорожчий за виграш. Порахуй у гривнях. Наш стрибок із 0.427 на 0.594 — це +0.167 за F1 і 254 200 грн економії, тобто приблизно 15 000 грн на кожну соту F1. Отже, приріст +0.02 вартий десь 30 000 грн за цикл. А коштує він, за тим самим інтерактивом, 12 743 навчальних оголошення всього — тобто 9 623 нових поверх наших 3 120. Якщо розмітка одного коштує хоча б 5 грн, це 48 000 грн витрат проти 30 000 грн виграшу. Арифметика закриває питання без жодних дискусій про машинне навчання.

Задача розвʼязана достатньо. Це не про метрику, а про продукт. Модель обійшла живого модератора (0.594 проти 0.566) і зняла 254 200 грн збитку з кожних 2 100 оголошень. Далі до стелі лишилось 0.051 — і, як показала екстраполяція, даними цей залишок не купується. Купити його можна тільки новою інформацією: історією скарг на продавця, номером телефона з чорного списку, схожістю фото на вже відомі приманки. Це вже не задача моделювання, а задача продукту.

І ще одна ручка, про яку легко забути, коли думаєш лише про метрику. Той самий крок 5 із журналу — вага класів — підняв F1 на тесті до 0.632 (у журналі поруч стоїть 0.657 — це крос-валідація на навчальній частині, інша вибірка й інше число), але зробив дещо цікавіше зі збитком: 407 000 грн замість 623 400. Модель не стала розумнішою, вона стала обережнішою: більше хибних тривог по 200 грн замість пропусків по 1 800. Це не покращення моделі, а вибір порога — і найдешевший спосіб виграти гроші, коли модель уже вперлась у стелю.

ПідсумокЩо варто винести

Ми пройшли шлях від «0.427, і що?» до «0.594, і зупиняємось» — жодного разу не змінивши алгоритм. Ось порядок, який варто виконувати механічно на кожній новій задачі.

крокщо робишщо дізнаєшся
1три базові лініїчи має твоє число сенс узагалі
2оцінка стеліскільки ще можна виграти
3дві помилки поручдіагноз і гілка дерева
4крива навчаннячи допоможуть додаткові дані
5сто помилок очимаде саме модель ламається
6ціна кожної групи помилокщо чинити першим
7одна зміна, один замір, один рядокщо саме спрацювало
8порівняння приросту з похибкоюколи зупинитись

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

На цьому блок про якість моделі закінчено. Ми вміємо чесно міряти (крос-валідація), стримувати (регуляризація), налаштовувати (гіперпараметри), читати ймовірності (калібрування й поріг) і тепер — вирішувати, що робити далі. Одну гілку діагнозу ми лишили без інструмента: гілка А казала «потрібна гнучкіша модель», а всі наші моделі досі проводили пряму або рахували відстані. У наступному блоці зʼявиться сімейство, яке вміє вигинатись як завгодно і ставити різні пороги в різних частинах даних, — саме те, чого нам бракувало на ноутбуках. Починається воно з дерев рішень.