Як обрати модель

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

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

У блоці 5 ми зібрали останні три інструменти: дерево рішень, випадковий ліс і градієнтний бустинг. До них уже були лінійна регресія, логістична регресія, k найближчих сусідів і наївний Баєс. Сім штук. Кожну ми розібрали окремо — і жодного разу не поставили їх поруч.

Ця тема ставить. Наскрізний приклад лишається тим самим, що й весь курс: дошка оголошень про вживані телефони, дві задачі — передбачити ціну (регресія) і розпізнати шахрайське оголошення (класифікація). Усі числа нижче пораховані на одній і тій самій дошці: 1 200 оголошень, з них 200 шахрайських.

Чесна відповідьНайкращої моделі немає

Це не ухиляння й не педагогічна обережність. Це доведене твердження, і зветься воно теоремою про відсутність безкоштовних обідів (no free lunch). Її сенс такий: якщо усереднити якість алгоритму по всіх мислимих задачах, усі алгоритми покажуть однаковий результат. Будь-який метод, що виграє на одному класі задач, рівно стільки ж програє на іншому.

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

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

КаркасВісім осей порівняння

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

Сім моделей курсу за вісьмома осями

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

модельякість на таблицяхданих требамасштаб ознак категорії й пропускинавчанняпередбачення зрозумілістьручок
лінійна регресіясереднядесяткиважливийкодувати вручнумиттєвемиттєвевисока1
логістичнасереднядесяткиважливийкодувати вручнудуже швидкемиттєвевисока1–2
kNNсереднятисячікритичнийпоганонемаєповільнесередня1–2
наївний Баєснижче середньоїсотнібайдужийприродномиттєвешвидкесередня0–1
дерево рішеньдобрасотнібайдужийприродношвидкемиттєвенайвища2–3
випадковий лісвисокасотнібайдужийприродноповільнепомірненизька1–2
бустингнайвищатисячібайдужийприродноповільнешвидкенизька4–6
Як читати. «Ручок» — скільки гіперпараметрів доводиться підбирати, щоб модель показала свій максимум; у лісі одна (max_features), у бустингу щонайменше пара «крок і кількість дерев» плюс глибина. «Масштаб ознак» — чи зіпсується модель, якщо одна ознака в гривнях, а інша у відсотках: для kNN це питання життя, для дерева — ні, бо порогові питання не змінюються від множення ознаки на сто. «Зрозумілість» — чи можна показати людині, чому вийшла саме така відповідь.

Дві клітинки варто прокоментувати окремо, бо вони найчастіше стають несподіванкою.

«Навчання: немає» у kNN. Метод нічого не обчислює наперед — він просто запамʼятовує навчальну вибірку. Уся робота переїжджає на момент передбачення, коли треба знайти найближчих сусідів серед усіх збережених оголошень. Тому в таблиці навчання безкоштовне, а передбачення найдорожче з усіх семи. Виміряймо це на нашій дошці: навчання на 960 оголошеннях і передбачення для 24 000 нових.

модельнавчання, мспередбачення 24 000, мс
логістична≈ 60≈ 5
наївний Баєс≈ 1≈ 4
дерево≈ 3≈ 2
kNN≈ 8≈ 280
випадковий ліс≈ 200≈ 90
бустинг≈ 310≈ 30

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

Помнож це на навантаження. Мільйон передбачень пачкою логістична зробить приблизно за чверть секунди, а kNN — секунд за дванадцять. І це ще оптимістична оцінка: тут усі 24 000 рядків пораховані одним викликом, а в живому сервісі запити приходять по одному, і власні накладні витрати kNN платяться на кожному окремо.

«Зрозумілість: найвища» у дерева. Одне дерево можна намалювати й прочитати вголос: «якщо ціна нижча за 3 200 грн і акаунт молодший за три місяці — це шахрайство». Ліс зі ста дерев уже не прочитаєш, хоча він і показує важливість ознак. Бустинг у цьому сенсі найтемніший: його дерева передбачають не відповідь, а залишок, у якого немає побутового сенсу.

ФормаОдна дошка, сім моделей

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

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

Межа рішення кожної моделі

300 оголошень для навчання, 2 000 нових для перевірки. Рожевим залито зону, яку модель вважає шахрайською. Точки — навчальні оголошення: кола чесні, хрестики шахрайські.

точність, %—
F1—
краще бази, п.п.—
до стелі, п.п.—
Перемкни всі вісім кнопок підряд — форма межі і є відповідь. Лінійна й логістична малюють пряму й обидві застрягають біля 90 %: пряма мусить або пропустити куток, або залізти в чесну зону. kNN дає рвану межу, яка облягає точки. Дерево — сходинки зі строго вертикальних і горизонтальних відрізків, бо кожне питання стосується однієї ознаки. Ліс і бустинг — ті самі сходинки, але згладжені усередненням десятків дерев. Стеля цієї задачі — 94.8 %: вище не забереться жодна модель, бо частина оголошень випадкова за побудовою.

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

ОбсягСкільки в тебе даних

Наступна вісь — та, яку новачки помічають останньою, хоча вона вирішує найчастіше. Складна модель має багато параметрів; щоб їх надійно оцінити, потрібні дані. Коли даних мало, складна модель вивчає не закономірність, а конкретні рядки — це перенавчання в чистому вигляді. І тоді проста модель із «поганими» припущеннями виграє в складної моделі з правильними: її припущення хоч і грубі, зате не потребують підтвердження даними.

Хто виграє на 20 оголошеннях, а хто на 800

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

переможець—
його точність—
відрив, п.п.—
останній—
Прожени повзунок від краю до краю — рейтинг перевертається. На 20 оголошеннях логістична регресія попереду з 87.0 %, а дерево останнє з 80.1 %: ділити площину сходинками нема на чому, кожен листок отримує по дві точки. На 800 оголошеннях логістична вже остання з 91.4 %, а kNN, дерево, ліс і бустинг стоять у діапазоні 94.5–94.7 %. Пряма не стала гіршою — вона просто перестала покращуватись, бо вперлася у власне припущення. Решта продовжила вчитись.

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

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

ДисциплінаЩо означає «порівняли»

Тепер найважливіша частина теми — і та, де помиляються найчастіше. Фраза «бустинг у нас показав 0.94, а kNN 0.59» не означає нічого, поки не сказано, як міряли. Чесне порівняння вимагає чотирьох однаковостей.

  1. Однакові дані. Ті самі рядки, ті самі ознаки, та сама передобробка. Якщо одній моделі ти прибрав викиди, а іншій ні — ти порівняв не моделі.
  2. Однаковий поділ. Ті самі фолди крос-валідації з тим самим random_state, а не «я перезапустив і взяв, що вийшло».
  3. Однакова метрика. Одна, обрана заздалегідь. Не «ця модель краща за accuracy, а ця за recall — виберу ту, що мені симпатичніша».
  4. Однаковий бюджет на налаштування. Кожній моделі — стільки ж спроб підібрати гіперпараметри, скільки й решті.

Пункт другий здається дрібним, тому ось цифри. Ми поміряли F1 логістичної регресії й дерева на нашій дошці пʼять разів, щоразу міняючи лише random_state поділу на фолди. Дерево дало від 0.829 до 0.862, логістична — від 0.820 до 0.847. На кожному окремому поділі дерево було попереду. Але якщо взяти дерево з невдалого поділу (0.829) і логістичну з вдалого (0.847), вийде впевнена перемога логістичної — з різницею більшою, ніж справжня перевага дерева. Розкид від поділу тут більший за різницю між моделями. Саме тому поділ мусить бути спільним, а не «однаковим за методом». А ще з цього випливає, що самих лише чотирьох однаковостей мало: навіть коли всі вони дотримані, лишається питання, чи не є вціліла різниця просто везінням. Як його порахувати — наступний розділ.

Пункт четвертий коштує ще дорожче. Ось наша дошка, 5-fold крос-валідація, ті самі фолди, метрика F1. Ліворуч — моделі зі значеннями за замовчуванням, праворуч — кожній дали рівно чотири спроби підібрати свій головний гіперпараметр (вкладеною крос-валідацією, як у темі 20):

модельF1 з коробкиF1 з бюджетомзмінамісце було → стало
бустинг0.9190.940+0.0211 → 1
ліс0.8010.903+0.1024 → 2
дерево0.8870.886−0.0012 → 3
логістична0.8250.835+0.0103 → 4
kNN0.4050.589+0.1846 → 5
наївний Баєс0.4830.524+0.0415 → 6

Чотири спроби на модель — мізерний бюджет, а рейтинг уже перетасувався. Ліс піднявся з четвертого місця на друге, kNN додав 0.184 і перестав бути посміховиськом, дерево з другого місця опустилось на третє, нічого не втративши. Тепер уяви типовий пост у мережі: «ми взяли бустинг, перебрали двісті конфігурацій, і він переграв kNN з коробки». Це правда — і це нічого не означає.

Той самий рейтинг, два режими вимірювання

Дошка з двома ознаками з інтерактиву 1: 300 оголошень для навчання, 2 000 для перевірки. «Як є» — значення за замовчуванням, ознаки не масштабовані. «Рівний бюджет» — кожній моделі шість кандидатів, найкращий обрано трифолдовою крос-валідацією, ознаки масштабовані.

перше місце—
його точність—
останнє місце—
розрив, п.п.—
Найповчальніший рядок — наївний Баєс. Його число не змінюється взагалі: 91.6 % в обох режимах, бо масштаб ознак йому байдужий, а підбирати в нього майже нема чого. Але місце змінюється з другого на пʼяте — просто тому, що сусіди нарешті отримали свій шанс. Друга історія — логістична регресія: на немасштабованих ознаках вона дає 79.4 %, тобто стоїть на базовій лінії (78.6 %); після масштабування й підбору штрафу — 90.2 %, тобто +10.8 п.п. А місце при цьому не змінилось — сьоме з семи: на цій дошці пряма межа просто не та форма, і жоден бюджет цього не виправить.

ПохибкаРізниця, менша за розкид, — не різниця

Попередній розділ дав лише половину відповіді. Ми побачили, що зміна поділу гойдає F1 приблизно на 0.03 і що з різних поділів можна «довести» майже будь-що. Ми навіть помітили головне: на кожному окремому поділі дерево було попереду логістичної. Але зі спостереження «на кожному» ми так і не зробили числа. Без нього розділ 05 лишається закликом бути обережним, а питання висить: як відрізнити справжню перевагу від везіння? Відповідь арифметична й поміщається в чотири дії. Нової бібліотеки для них не треба — усі числа вже пораховані крос-валідацією, ми просто перестаємо їх викидати.

Дія 1. Не викидай окремі фолди

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

Дія 2. Порівнюй парно, а не в середньому

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

di = (метрика моделі А на фолді i) − (метрика моделі Б на тому самому фолді i)

Тут i — номер фолда, від 1 до k; тобто різниць виходить рівно стільки, скільки фолдів. Виграш ось у чому: обидві моделі на фолді i перевіряються на тих самих рядках. Якщо фолд трапився легкий, він піднімає обидві моделі — і при відніманні ця спільна удача зникає. Лишається саме те, чим моделі відрізняються, без шуму, який їх обох однаково стосується. Це зветься парним порівнянням, і воно ж пояснює, чому пункт «однаковий поділ» із попереднього розділу такий принциповий: без спільних фолдів парну різницю просто нема з чого скласти.

Дія 3. Порахуй розкид цих різниць

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

Дія 4. Порівняй середню різницю із запасом

Тепер у тебе два числа: Δ — середня з усіх різниць d, і s — їхній розкид. Питання «чи справжня перевага» перетворюється на питання «чи Δ помітно більша за нуль на тлі власного розкиду». Порогом слугує запас на випадковість:

запас = t × s ÷ √k

Що тут кожен символ:

Чому ділимо на √k. Тому що середнє з k чисел коливається менше, ніж кожне з них окремо, — і рівно у √k разів. Побутова версія: кинь монету один раз — випаде або нуль, або одиниця, розкид максимальний; усередни сто кидків — вийде щось біля 0.5, і від разу до разу це «біля» майже не гуляє. Що більше фолдів, то надійніше середнє й то менший запас потрібен.

Правило читання виходить коротке:

Порахуймо руками

Візьмімо пару «дерево проти логістичної регресії» з фігури нижче: та сама дошка з двома ознаками, 2 000 оголошень, 5 фолдів по 400. Різниці F1 по фолдах, у відсоткових пунктах:

5.2 6.7 5.0 5.0 4.4
  1. Середнє: (5.2 + 6.7 + 5.0 + 5.0 + 4.4) ÷ 5 = 26.3 ÷ 5 = Δ = 5.3.
  2. Відхилення кожного числа від середнього: −0.1, +1.4, −0.3, −0.3, −0.9.
  3. Квадрати відхилень: 0.01, 1.96, 0.09, 0.09, 0.81. Їхня сума — 2.96.
  4. Ділимо на k − 1 = 4: виходить 0.74. Корінь: s = 0.9.
    Чому на 4, а не на 5: середнє ми порахували з цих самих пʼятьох чисел, тож одне з них уже «витрачене» на нього — вільних лишилось чотири. Це технічна поправка; на висновок вона не впливає.
  5. Запас: 2.8 × 0.9 ÷ √5 = 2.52 ÷ 2.24 = 1.1.

Δ = 5.3 проти запасу 1.1 — майже впʼятеро більше. Перевага дерева справжня, і це видно навіть без арифметики: різниця має один знак на всіх пʼятьох фолдах. А тепер перемкни фігуру на пару «логістична проти наївного Баєса» — там Δ = 1.6 при запасі 2.0, хоча півтора пункти на око виглядають цілком солідною перемогою.

Різниця по фолдах проти запасу на випадковість

Дошка з двома ознаками, 2 000 оголошень, 5 фолдів по 400, метрика F1. Угорі — результат кожної моделі на кожному фолді; лінія зʼєднує пару, поміряну на однакових рядках. Унизу — ті самі пʼять різниць, їхнє середнє Δ і смуга запасу навколо нуля.

різниця Δ, п.п.—
розкид s, п.п.—
запас, п.п.—
фолдів із перевагою—
Смуга — це весь запас на випадковість; поза нею різниця щось означає, усередині — ні. Пара «дерево / логістична» лягає далеко за смугу: Δ = 5.3 п.п. при запасі 1.1, і жоден із пʼятьох фолдів не суперечить. Пара «логістична / Баєс» дає солідні на вигляд 1.6 п.п. — але один фолд із пʼятьох показує зворотний знак, розкид від цього подвоюється, і Δ лишається всередині смуги. Пара «дерево / бустинг» — типова нічия: 0.4 п.п. різниці при запасі 1.0. Заголовок «бустинг переграв дерево» на таких числах був би повідомленням про шум.
Чому запас — світлофор, а не вирок. Пʼять фолдів — це не пʼять незалежних вимірювань: навчальні частини двох сусідніх фолдів збігаються на три чверті, тому різниці трохи «злипаються», порахований s виходить меншим за справжній, а запас — оптимістичнішим. Ліки дешеві: повтори крос-валідацію кілька разів із різними поділами (5 фолдів × 5 повторів = 25 різниць) і читай межу як світлофор. «Набагато більше за запас» — перевага. «Приблизно як запас» — переміряй, а не публікуй.

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

ПасткаПрокляття переможця

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

Кожна виміряна оцінка складається з двох частин: справжньої якості моделі й випадкового шуму того замірювання. Шум може бути в плюс, може в мінус — у середньому нуль. Але ти не береш середню модель. Ти береш найкращу. А найкращою з багатьох частіше за інших виявляється та, якій шум додав, а не відняв. Тому оцінка переможця систематично завищена — просто тому, що ти брав максимум. Це зветься прокляттям переможця (winner's curse), і тема 20 вже показала його на підборі числа сусідів для kNN. Тут те саме явище піднімається на поверх вище — з окремих гіперпараметрів на цілі моделі.

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

89.4 91.8 90.2 88.7 90.9

Середнє цих пʼятьох — 90.2, тобто майже точно справжня якість: шум усереднився. А максимум — 91.8. Ти оголосиш переможцем ту модель, що дала 91.8, і саме це число запишеш у звіт, — хоча її справжня якість ті самі 90. Максимум завжди більший за середнє, і саме ця різниця й є завищенням. Причому воно росте разом із кількістю кандидатів: що більше чисел, то більший максимум, навіть якщо всі моделі однакові.

Скільки коштує право вибирати

Двадцять чотири однаково гарні кандидати (дерева, навчені на різних підвибірках). Переможця обирають за точністю на вибірці вибору, а потім міряють його ж на нових оголошеннях, яких вибір не бачив. Обидві криві усереднено по 24 повторах, щоб не дивитись на один випадковий розклад.

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

Тепер видно, чому попередній розділ вимагав однакового бюджету. Механізм один і той самий, але поверхів два. Усередині однієї моделі ти перебираєш гіперпараметри й береш найкращий — це переможець серед конфігурацій. Зверху ти перебираєш моделі й береш найкращу — переможець серед моделей. Обидва рази максимум завищений, і обидва завищення складаються. Саме тому «наш бустинг після двохсот конфігурацій дав 0.94» — число з подвійною надбавкою, і порівнювати його з чиїмось kNN «з коробки» не можна навіть після вирівнювання бюджету: у того, хто перебирав більше, і завищення більше.

Звідси єдиний надійний засіб, і він не в тому, щоб менше перебирати:

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

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

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

ДноБазова лінія

Перш ніж радіти будь-якому числу, треба знати, з чим його порівнювати. Базова лінія (baseline) — це навмисно дурна модель, яка не дивиться на ознаки взагалі:

На нашій дошці шахрайських оголошень 200 із 1 200. Модель «усі оголошення чесні» має точність 83.3 % і не знаходить жодного шахрая. Тепер уяви звіт: «наша модель має точність 87 %». Звучить пристойно, поки не згадаєш, що дурна константа дає 83.3 %, а справжня цінність вимірюється тим, скількох шахраїв модель упіймала. Ось чому accuracy бреше на нерівних класах, і чому базову лінію рахують першою, а не останньою.

Тепер зменшімо дошку вдесятеро — до 120 оголошень — і поміряймо ще раз:

модельточність на 1 200точність на 120F1 на 1 200F1 на 120
базова лінія0.8330.8200.0000.000
логістична0.9480.8980.8250.558
kNN0.8730.8230.4050.165
наївний Баєс0.8480.8130.4830.380
дерево0.9630.8650.8870.584
ліс0.9420.8880.8010.567
бустинг0.9750.8900.9190.606

Читаємо. На 120 оголошеннях наївний Баєс має точність 0.813 проти 0.820 у базової лінії — тобто програє константі, яка нічого не вміє. kNN тримається врівень із нею: 0.823 проти 0.820, різниця в межах шуму. Помітно відриваються від дна лише логістична (0.898), ліс (0.888) і бустинг (0.890), дерево тримається посередині (0.865) — і навіть у цих чотирьох F1 упав приблизно вдвічі. Це не аргумент проти цих моделей — це аргумент за те, що на 120 рядках жодна модель не врятує, і зусилля треба вкладати не у вибір алгоритму, а в збір даних.

Пастка «95 % — це багато». Число саме по собі не означає нічого. Якщо в задачі 95 % відповідей одного класу, то 95 % точності — це рівно нуль корисної роботи. Правильна форма звіту завжди подвійна: стільки-то в моделі проти стільки-то в базової лінії. Без другої половини перша не читається.

РецептПорядок дій на новій задачі

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

Пʼять кроків, і коли зупинятись раніше

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

Чому саме такий порядок. Базова лінія коштує секунду й задає нуль відліку. Проста модель коштує хвилину й показує, чи є в ознаках хоч якийсь сигнал: якщо логістична регресія не відірвалась від базової лінії, справа майже напевно в даних, а не в алгоритмі. Ліс — надійна опора: працює зі значеннями за замовчуванням, не боїться масштабу й дає OOB-оцінку задарма. Бустинг ставлять передостаннім, бо він єдиний вимагає справжнього налаштування — і його перевага над лісом на нашій дошці склала 0.037 за F1 після того, як обидва отримали однаковий бюджет. Кроки 0-3 — це вибір, і всі їхні числа несуть надбавку переможця. Крок 4 — звіт: одне число, зняте на вибірці, якої вибір не бачив.

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

Симптом задачі → з чого починати

Не правила, а перші здогади. Кожну ще треба перевірити вимірюванням — але починати з правильного місця дешевше.

що бачиш у задачіз чого починатичому
Рядків менше за 200логістична або наївний Баєсмало вільних величин — мало даних треба
Ознак більше, ніж рядківлінійна модель із регуляризацієюрешта моделей просто запамʼятає вибірку
Треба пояснити кожне рішенняодне дерево або лінійна модельлише їх можна прочитати вголос
Багато категорій і пропусківдерева, ліс, бустингпрацюють із ними без кодування
Відповідь потрібна за мілісекундилінійна модель або деревоkNN і ліс платять на кожному запиті
Класи дуже нерівніспершу метрику, потім модельінакше переможе базова лінія
Треба максимум, і є годинабустинг із ранньою зупинкоюнайсильніший на таблицях, але потребує ручок
Дані — не таблиця: текст, звук, фотонейронні мережітабличні моделі не бачать структури сигналу
Не знаю, з чого початибазова лінія, потім лісдва числа за пʼять хвилин — уже орієнтир
Найчастіша реальна ситуація — останній рядок. Базова лінія й ліс зі значеннями за замовчуванням дають дві точки відліку майже задарма. Якщо між ними велика відстань — у даних є сигнал і є за що боротись. Якщо мала — жоден алгоритм справи не врятує, і час іти по нові ознаки.

Ціна складностіКоли простіша модель краща

Припустімо, бустинг таки переміг: 0.940 проти 0.835 у логістичної. Здається, вибір зроблено. Але «точніша» і «та, що поїде в продакшн» — не синоніми, і причин щонайменше чотири.

Пояснюваність. Банк відмовляє в кредиті — і за законом мусить назвати причину. Страхова піднімає тариф — клієнт має право спитати чому. «Так вирішив ансамбль із трьохсот дерев» — не відповідь. Логістична регресія відповідає одразу: кожен коефіцієнт — це відношення шансів, і його можна проговорити словами.

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

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

Вартість підтримки. Бустинг треба переучувати, стежити за кількістю дерев, зберігати модель на сотні мегабайтів, підтримувати бібліотеку й версії. Логістична регресія — це десяток чисел у текстовому файлі. Через рік, коли автор моделі змінить роботу, різниця стане відчутною.

Робоче правило. Бери найпростішу модель, що дає прийнятну якість, а не найточнішу з можливих. «Прийнятну» визначає задача, а не змагання: якщо втрати від шахрайства падають на 80 % однаково при F1 = 0.84 і F1 = 0.94, різниці немає, а різниця в підтримці є.

МежіЧого вибір моделі не вирішує

І чесне завершення блоку. Є три речі, проти яких безсилі всі сім моделей разом, і жодне налаштування нічого не змінить.

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

модельF1 на 7 ознакахF1 з новою ознакою
логістична0.8250.985
дерево0.8870.970
бустинг0.9190.964

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

Витік даних. Якщо в ознаки випадково потрапила інформація з майбутнього або сама відповідь у замаскованому вигляді, метрика злетить до 0.99 у будь-якої моделі — і розсиплеться в продакшні. Найкращий бустинг на витеклих даних гірший за найгіршу логістичну регресію на чесних. Ознаки витоку й способи його ловити — у темі про розбиття даних.

Зміщена вибірка. Якщо навчальні оголошення зібрані лише за один місяць або лише в одному місті, модель вивчить закономірності цього зрізу. Жоден алгоритм не здогадається про те, чого в даних не було. Це не проблема моделі — це проблема того, як дані потрапили в таблицю.

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

МапаЩо вже вміємо

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

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

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