Скільки коштує помилка

Модель назвала ціни. Справжні ціни ти знаєш. Лишилось звести сотні промахів в одне число — і саме тут ховається половина рішень у машинному навчанні.

Ти зібрав таблицю оголошень про вживані телефони. У кожному рядку — модель, рік випуску, стан, обсяг памʼяті й ціна, за якою телефон урешті продали. Ціна — це те, що ми хочемо передбачати; решта колонок — те, за чим ми це робимо. Ти навчив модель, розділив дані на навчальну й тестову частини — так, як розібрано в темі Train / Validation / Test — і тепер маєш перед собою два стовпчики чисел: факт і прогноз.

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

ПостановкаНавіщо взагалі одне число

Почнемо з одного рядка таблиці. Redmi Note 10, 2021 рік, стан добрий, 128 ГБ памʼяті. Продався за 5 200 грн. Модель сказала 5 600 грн. Помилка на цьому оголошенні:

ei = yi − ŷi  =  5200 − 5600 = −400 грн

Розберімо позначення, вони будуть скрізь до кінця теми:

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

Метрика — це ще й ціль. Те число, яке ти обереш мірилом, модель рано чи пізно почне мінімізувати: або тому, що ти прямо поставиш його функцією втрат, або тому, що ти сам відбиратимеш моделі за ним. Метрика — це не термометр збоку, а формулювання того, що ти вважаєш успіхом. Обереш не те число — отримаєш не ту модель.
Що таке функція втрат. Слово трапиться ще не раз, тож домовимось одразу. Функція втрат (loss function) — це число, яке модель під час навчання намагається зробити якомога меншим. Алгоритм навчання влаштований просто: він пробує змінити свої параметри, дивиться, чи стало це число меншим, і рухається в той бік, де воно спадає. Функція втрат — це «біль» моделі, а навчання — втеча від болю.

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

Перша спробаЧому не можна просто скласти

Найочевидніша ідея: скласти всі помилки. Візьмімо шість оголошень і подивімось, що з цього вийде.

оголошеннярікстанпамʼятьфакт, грнпрогноз, грнпомилка
Redmi Note 102021добрий128 ГБ5 2005 600−400
Samsung A522021добрий128 ГБ7 3006 700+600
Poco X32020задовільний64 ГБ3 9004 800−900
iPhone SE 20202020добрий128 ГБ8 1008 500−400
Realme 82021відмінний128 ГБ6 1006 200−100
iPhone 112019відмінний64 ГБ12 00010 800+1 200

Складаємо: −400 + 600 − 900 − 400 − 100 + 1200 = 0. Сума помилок дорівнює нулю. За цією логікою модель ідеальна.

А тепер подивись на кожен рядок окремо. Poco X3 переоцінено на 900 грн — це чверть його ціни. iPhone 11 недооцінено на 1 200 грн. Жоден прогноз не влучив. Модель, яку ми щойно оголосили ідеальною, помиляється на кожному оголошенні без винятку.

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

Покрути повзунок нижче. Він розводить прогнози від фактів усе далі — а сума помилок стоїть як укопана на нулі.

Сума помилок нічого не міряє

Стовпчики складаються один за одним, як сходи. Останній крок завжди повертає на нуль.

Σ помилок—
Σ модулів—
MAE—
RMSE—
Що читати: висота кожного стовпчика — помилка одного оголошення, бірюзові вгору (модель недооцінила), рожеві вниз (переоцінила). Каскад починається з нуля і на нуль повертається — за будь-якого положення повзунка. Саме тому сума помилок не може бути метрикою якості.

Виходів із цієї пастки рівно два, і обидва прибирають знак. Перший — взяти модуль помилки: −400 і +400 стають однаково поганими по 400. Другий — взяти квадрат: обидва стають 160 000. З цих двох рішень і виростають усі метрики регресії.

МодульMAE: середня абсолютна помилка

MAE (mean absolute error, середня абсолютна помилка) — найпрямолінійніша метрика, яку тільки можна вигадати:

MAE = ⅟n · Σ |yi − ŷi|

Словами: візьми помилку кожного оголошення, забудь про знак, порахуй середнє. Символ Σ означає «склади по всіх i від 1 до n», вертикальні риски | | — модуль, тобто «відкинь мінус». Ділення на n перетворює суму на середнє, щоб число не залежало від того, 6 у нас оголошень чи 6 000.

Порахуймо руками на наших шести телефонах — крок за кроком, без пропусків.

крок 1 · помилка кожного рядка

Віднімаємо прогноз від факту. Це той самий стовпчик, що вже є в таблиці вище:

−400   +600   −900   −400   −100   +1200
крок 2 · прибираємо знак

Модуль перетворює «переоцінив» і «недооцінив» на однаково погане:

400   600   900   400   100   1200
крок 3 · сума

Тепер нічого не скорочується, бо всі доданки додатні:

400 + 600 + 900 + 400 + 100 + 1200 = 3600
крок 4 · середнє

Ділимо на кількість оголошень:

MAE = 3600 / 6 = 600 грн

Головна перевага MAE — її можна прочитати вголос людині, яка ніколи не чула про машинне навчання: «модель помиляється в середньому на 600 гривень». Число живе в тих самих одиницях, що й ціна. Якщо середня ціна телефона 7 100 грн, то помилка в 600 грн одразу відчувається як «прийнятно, але не блискуче».

Схема · Як народжується MAE

Той самий розрахунок стовпчиком. Довжина смужки — внесок оголошення в суму.

оголошенняфактпрогнозпомилкамодульвнесок
Redmi Note 105 2005 600−400400
Samsung A527 3006 700+600600
Poco X33 9004 800−900900
iPhone SE 20208 1008 500−400400
Realme 86 1006 200−100100
iPhone 1112 00010 800+1 2001 200
сума модулів3 600
поділити на 6 оголошень600 грн
Ключова властивість: у MAE кожна гривня помилки важить однаково. Промах на 1 200 грн вносить рівно втричі більше за промах на 400 грн — не в девʼять разів, не в пʼять. Це робить MAE стійкою до викидів і водночас позбавляє її здатності бити тривогу через одну катастрофу.

КвадратMSE і RMSE: сила квадрата

Другий спосіб позбутися знака — піднести помилку до квадрата. Так народжується MSE (mean squared error, середня квадратична помилка):

MSE = ⅟n · Σ (yi − ŷi)2

Формула читається так само, як MAE, тільки замість модуля стоїть друга степінь. На наших шести телефонах:

(−400)2 + 6002 + (−900)2 + (−400)2 + (−100)2 + 12002
= 160 000 + 360 000 + 810 000 + 160 000 + 10 000 + 1 440 000 = 2 940 000
MSE = 2 940 000 / 6 = 490 000

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

Ліки прості: витягти корінь і повернутись у гривні. Так виходить RMSE (root mean squared error, корінь із середньої квадратичної помилки):

RMSE = √MSE = √490 000 = 700 грн

Тепер число знову читається: «типовий промах моделі — близько 700 гривень». Зверни увагу, що RMSE (700) вийшла більшою за MAE (600) на тих самих даних. Це не випадковість: RMSE ніколи не буває меншою за MAE. Вони збігаються лише в одному випадку — коли всі помилки однакові за модулем. Що більший розкид помилок, то більший розрив.

Навіщо тоді MSE, якщо є RMSE. Для звіту людям — незамінна RMSE. А от усередині навчання моделі майже завжди мінімізують саме MSE. Мінімум у MSE і RMSE стоїть в одній точці (корінь не міняє порядку: більшому числу відповідає більший корінь), тож для навчання різниці немає, а рахувати MSE дешевше — не треба брати корінь на кожному кроці. Але головна причина інша, і вона варта окремого абзацу.
Чому квадрат зручніший за модуль — без похідних. Уяви, що ти шукаєш найнижчу точку долини, але бачиш лише клаптик землі під ногами. Єдине, що допомагає, — нахил схилу під ногами: він каже, у який бік крокувати й наскільки велике робити крок. Саме так вчиться модель — по нахилу функції втрат.

Тепер порівняй дві долини. Долина квадрата (y = x²) — гладка чаша: нахил є в кожній точці, і що ближче до дна, то він менший, тож кроки самі собою стають обережнішими. Долина модуля (y = |x|) — це дві прямі стінки, що сходяться в гострий кут. Нахил тут однаковий скрізь (стінка не стає пологішою біля дна), а рівно в нулі його немає взагалі: у гострому куті немає жодного «нахилу під ногами», бо ліворуч схил один, а праворуч інший. Алгоритм у такій точці не знає, що робити, і починає перестрибувати мінімум туди-сюди.

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

Тепер про головну властивість квадрата. Помилка 100 грн коштує 10 000. Помилка 1 200 грн коштує 1 440 000 — у 144 рази більше, хоча сама помилка більша всього в 12 разів. Квадрат карає великі промахи непропорційно сильно. У нашій таблиці один iPhone 11 дає 1 440 000 із 2 940 000 — тобто майже половину всієї MSE, хоча це лише одне оголошення з шести.

ПротистоянняMAE проти RMSE

Ось найважливіше протиставлення всієї теми. MAE й RMSE — не «точніша» й «менш точна» версії одного. Вони ставлять різні питання:

Щоб побачити різницю не на словах, візьмімо ті самі шість телефонів і дві різні моделі. Перша, назвімо її Обережною, помиляється на кожному оголошенні рівно на 650 грн. Друга, Ризикова, влучає майже точно на пʼяти телефонах — промах лише 200 грн, — але на iPhone 11 промахується на 2 000 грн.

Схема · Дві моделі, два протилежні вердикти

Ті самі шість оголошень. Угорі — рівні помилки, унизу — одна велика замість багатьох дрібних.

Читай числа: MAE обирає Ризикову (500 проти 650) — у середньому вона помиляється менше. RMSE обирає Обережну (650 проти 837) — вона ніколи не провалюється катастрофічно. Обидві метрики порахували чесно на тих самих даних і дали протилежні відповіді. Метрика не знайде за тебе «кращу модель» — вона лише виконає те визначення кращого, яке ти в неї заклав.

Розрахунок для Обережної: усі шість помилок по 650, отже MAE = 650 і RMSE = 650 — вони збіглися, бо помилки однакові. Для Ризикової: MAE = (200·5 + 2000) / 6 = 3000 / 6 = 500 грн, а MSE = (40 000·5 + 4 000 000) / 6 = 4 200 000 / 6 = 700 000, звідки RMSE = √700 000 ≈ 836.7 грн.

Яку модель брати — питання не математики, а наслідків. Якщо ти показуєш продавцеві орієнтовну ціну, промах у 2 000 грн на дорогому телефоні — це втрачена довіра й скарга; тоді бери RMSE. Якщо ти оцінюєш тисячі оголошень для внутрішньої аналітики, де важлива сумарна точність, а окремий викид нікого не вбʼє, — бери MAE.

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

ПорівнянняR²: з чим ми взагалі порівнюємо

MAE = 600 грн. Це добре чи погано? Чесна відповідь: невідомо. Якщо ми оцінюємо флагманські айфони за 40 000 грн, 600 грн — блискучий результат. Якщо кнопкові телефони за 800 грн — це катастрофа. Метрика в гривнях нічого не каже, поки ти не знаєш масштабу задачі.

Потрібне число без одиниць, яке саме несе в собі контекст. Ідея така: порівняймо нашу модель із найдурнішою моделлю, яку взагалі можна побудувати — з такою, що завжди називає середню ціну, не дивлячись ні на рік, ні на памʼять, ні на стан. Для наших шести оголошень середнє дорівнює 42 600 / 6 = 7 100 грн. Ця «модель» каже 7 100 і для Poco X3, і для iPhone 11.

R2 = 1 − SSres / SStot

Розшифровуємо обидві суми:

R2 = 1 − 2 940 000 / 39 900 000 = 1 − 0.0737 = 0.926

Читається так: наша модель прибрала 92.6 % тієї мінливості цін, яку не пояснювало просте середнє. Або коротше — «модель пояснює 92.6 % розкиду».

Схема · Геометрія R²

Ліворуч — розкид навколо середнього. Праворуч — розкид навколо прогнозів. Площа квадратів і є сумою.

Ліва картинка не залежить від моделі взагалі — це властивість самих даних. Уся робота моделі полягає в тому, щоб зменшити праву суму. R² — просто частка, на яку її вдалося зменшити.

Шкала R² має три опорні точки, і кожну варто запамʼятати окремо:

Останній пункт багатьох дивує, тому порахуємо його явно. Уяви модель, яка завжди каже 10 000 грн. Її SSres = (5200−10000)² + (7300−10000)² + (3900−10000)² + (8100−10000)² + (6100−10000)² + (12000−10000)² = 90 360 000. Тоді R² = 1 − 90 360 000 / 39 900 000 = −1.26. Ніякої помилки тут немає: «R квадрат» лише зветься квадратом, відʼємним він буває легко. І трапляється це не в екзотиці, а щоразу, коли модель, навчена на одних даних, застосована до інших — наприклад, ціни за півроку зросли, а модель цього не знає.

Дві пастки R². Перша: він майже ніколи не спадає, коли додаєш нові ознаки — навіть коли ознака є чистим шумом. Причина проста: зайва ознака дає моделі ще одну ручку, і навіть якщо крутити її немає сенсу, підганяючись під ці дані, модель завжди знайде положення не гірше за попереднє. SSres не зростає — отже, R² не спадає. Друга: R² рахується відносно середнього тієї вибірки, на якій ти міряєш. Візьми тестову вибірку з вужчим розкидом цін — і R² впаде, хоча модель не змінилась ні на йоту.
Скоригований R² — і чому він тут потрібен. Через першу пастку порівнювати за звичайним R² моделі з різною кількістю ознак нечесно: у моделі з двадцятьма ознаками число буде більшим просто за фактом двадцяти ознак. Тому поруч рахують скоригований (adjusted) R², який бере плату за кожну ознаку:
R2adj = 1 − (1 − R2) · (n − 1) / (n − p − 1)
Словами: береться те, що модель не пояснила (1 − R²), і множиться на поправку, яка тим більша, чим більше ознак. Символи: n — скільки обʼєктів у вибірці, p — скільки ознак у моделі, R² — звичайний коефіцієнт, порахований вище.

Порахуємо на наших шести оголошеннях. Нехай модель користується двома ознаками (рік і памʼять), тобто n = 6, p = 2, а звичайний R² = 0.926. Тоді (1 − 0.926) = 0.074; (n − 1) = 5; (n − p − 1) = 3; отже R²adj = 1 − 0.074 · 5 / 3 = 1 − 0.123 = 0.877. Додай третю ознаку, яка нічого не покращила (R² лишився 0.926): тепер знаменник (6 − 3 − 1) = 2, і R²adj = 1 − 0.074 · 5 / 2 = 0.815. Скоригований R² упав — саме цього ми й хотіли: зайва ознака має коштувати.

ВідсоткиMAPE, SMAPE і де вони брешуть

Є ще одна річ, якої не бачить жодна метрика в гривнях. Промах у 600 грн на телефоні за 12 000 — це 5 %, дрібниця. Той самий промах на телефоні за 1 500 грн — це 40 %, повний провал. MAE вважає ці два випадки однаковими. MAPE (mean absolute percentage error, середня абсолютна відсоткова помилка) — ні:

MAPE = ⅟n · Σ |yi − ŷi| / yi · 100 %

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

оголошеннямодуль помилкифактчастка
Redmi Note 104005 2007.69 %
Samsung A526007 3008.22 %
Poco X39003 90023.08 %
iPhone SE 20204008 1004.94 %
Realme 81006 1001.64 %
iPhone 111 20012 00010.00 %
MAPE = (7.69 + 8.22 + 23.08 + 4.94 + 1.64 + 10.00) / 6 = 9.26 %

Порівняй із тим, що казала MAE. За MAE найгіршим був iPhone 11 (1 200 грн). За MAPE — Poco X3 (23 %), хоча його помилка на 300 грн менша. Це не суперечність, а різні питання: скільки гривень ми втратили проти того, наскільки сильно ми промазали відносно ціни товару.

Тепер про те, де MAPE бреше — а бреше вона систематично.

Перше: маленький знаменник. Ділення на ціну означає, що дешеві товари важать непропорційно багато. Помилка в 500 грн на телефоні за 600 грн дає 83 %, і одне таке оголошення здатне перекрити двадцять акуратних прогнозів на дорогих моделях. У задачах, де цільова величина буває близькою до нуля, MAPE стає некерованою.

Друге: нуль ламає її повністю. Якщо в даних є хоч один рядок із y = 0, MAPE не існує — там ділення на нуль. Не «дорівнює нулю», не «велика», а не існує.

Третє: вона несиметрична. Це найпідступніше. Нехай справжня ціна 5 000 грн. Якщо модель скаже 0 — помилка 5 000, MAPE = 100 %. Це максимум, гірше при заниженні бути не може. А якщо модель скаже 15 000 — MAPE = 200 %, і зверху немає межі взагалі. Отже, MAPE карає завищення сильніше за заниження, а модель, яку вчать під MAPE, тихо навчається занижувати ціни.

Спроба це полагодити називається SMAPE (symmetric MAPE): помилку ділять не на факт, а на середнє між фактом і прогнозом:

SMAPE = ⅟n · Σ |yi − ŷi| / ((yi + ŷi) / 2) · 100 %

На наших шести оголошеннях SMAPE = 8.94 % — трохи менше за MAPE, бо в знаменнику тепер стоїть середнє між фактом і прогнозом. Ділення на нуль тут стається лише коли і факт, і прогноз дорівнюють нулю, а значення обмежене зверху 200 %. Проте «симетрична» в назві — перебільшення. Візьмімо ту саму ціну 5 000 грн і однакову за модулем помилку в 2 500 грн:

Схема · Дві криві, два перекоси

Справжня ціна завжди 5 000 грн. Повзунка немає: по горизонталі відкладено всі можливі прогнози від 0 до 15 000 грн.

Якби метрика була симетричною, її крива була б дзеркальною відносно ціни 5 000 — жодна не є. MAPE (рожева) ліворуч упирається в стелю 100 %: гірше за прогноз «нуль» при заниженні не буває. Праворуч стелі немає взагалі — 15 000 дають уже 200 %. Тому модель, яку вчать під MAPE, вигідніше занижувати. SMAPE (бірюзова) перекошена дзеркально: заниження до нуля коштує 200 %, а завищення ніколи не перевищує 100 %. Криві перетинаються рівно у справжній ціні — там обидві дорівнюють нулю, і сперечатись нема про що.

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

Що таке логарифм і чому він тут. Курс не вимагав від тебе математики, тож поясню з нуля. Десятковий логарифм числа (записують log₁₀ x, або просто log x) — це відповідь на питання «у який степінь треба піднести 10, щоб дістати це число». Отже log 100 = 2, бо 10² = 100; log 1000 = 3; log 10 = 1. Числа між ними дають дробові відповіді: log 5000 ≈ 3.7. Усе, більше нічого знати не треба.

Головна властивість, задля якої логарифм тут потрібен: він перетворює множення на додавання. Помилитись «удвічі» — це помножити на 2, а після логарифмування це стає «додати log 2 ≈ 0.3», і додати ту саму 0.3 незалежно від того, телефон коштує 1 500 грн чи 40 000.

Порахуймо на числах. Телефон за 1 500 грн, прогноз 3 000 — помилка вдвічі. log 1500 ≈ 3.18; log 3000 ≈ 3.48; різниця 0.30. Телефон за 20 000 грн, прогноз 40 000 — теж помилка вдвічі. log 20000 ≈ 4.30; log 40000 ≈ 4.60; різниця знову 0.30. У гривнях промахи були 1 500 і 20 000, і жодна метрика в гривнях не назвала б їх однаковими. У логарифмах вони буквально однакові.

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

ТаблоУсі метрики на одній моделі

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

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

Та сама модель під різними метриками

Пряма завжди проходить через центр хмари, тож повзунок керує лише нахилом. Бурштинові відрізки — помилки. Три кнопки ставлять повзунок в оптимум відповідної метрики.

MAE—
RMSE—
MSE—
R²—
MAPE—
SMAPE—
Головне спостереження: MSE, RMSE і R² — це одна метрика в трьох одежинах. Вони рахуються з тієї самої суми квадратів, тому їхній оптимум завжди збігається й вони ніколи не сперечаються між собою. Справжня незгода можлива лише між трьома таборами: квадратичним, MAE і MAPE.

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

ВикидОдне шахрайське оголошення

Тепер найважливіше практичне питання теми. У будь-якому реальному наборі оголошень є сміття: помилки набору, тестові записи, шахрайські оголошення «iPhone за 1 грн, пишіть у месенджер». Що робить один такий рядок із нашими метриками?

Додаймо до шести телефонів сьомий: оголошення з ціною 1 грн, яке модель, дивлячись на характеристики, оцінила у 6 000 грн. Помилка на цьому рядку: 1 − 6 000 = −5 999 грн. Ось що стає з метриками:

метрикашість чеснихплюс оголошення за 1 грну скільки разів гірше
MAE600 грн1 371 грн×2.3
RMSE700 грн2 358 грн×3.4
R²0.9260.532−0.394
MAPE9.26 %85 708 %×9 255
SMAPE8.94 %36.2 %×4.1

Один рядок із семи. MAE подорожчала більш ніж удвічі — вона просто чесно врахувала ще одну велику помилку. RMSE злетіла втричі — квадрат зробив своє. А MAPE перетворилась на 85 708 %, бо в її формулі стоїть 5 999 / 1 = 599 900 %, і цей єдиний доданок дає 99.99 % усього результату. SMAPE вціліла краще саме тому, що її знаменник — середнє між фактом і прогнозом, а не сам факт.

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

Вплив однієї точки на пʼять метрик

Пряма зафіксована. Повзунок рухає справжню ціну одного оголошення від 0 до 30 000 грн.

MAE—
RMSE—
R²—
MAPE—
Форма кривих і є відповідь: MAE росте прямою лінією — кожна зайва гривня промаху додає рівно 1/16 гривні до метрики. RMSE загинається вгору дедалі крутіше. MAPE поводиться зовсім інакше: праворуч вона майже пласка (велика ціна в знаменнику), а ліворуч вибухає й на нулі перестає існувати.

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

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

Візьмімо модулі помилок наших семи рядків разом із шахрайським: 100, 400, 400, 600, 900, 1200, 5999. Їх сім, отже посередині стоїть четверте число — 600. Це і є MedAE. Середнє тих самих семи чисел — 9 599 / 7 = 1 371, тобто MAE.

Тепер порівняймо з тим, що було до появи сміттєвого рядка. На шести чесних оголошеннях модулі помилок такі: 100, 400, 400, 600, 900, 1200. Чисел парна кількість, тож середину беруть як середнє двох центральних: (400 + 600) / 2 = 500. MAE тоді була 600. Отже додавання оголошення з промахом 5 999 грн зсунуло MAE з 600 до 1 371 (більш ніж удвічі), а MedAE — усього з 500 до 600. І ці 100 гривень MedAE набрала не через розмір промаху: пʼяте за величиною число просто зсунулось на одну позицію в черзі. Хоч зроби той промах 5 999 грн, хоч 599 999 — MedAE лишиться 600.

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

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

Схема · Однакова MAE, різні хвости

Гістограма помилок двох моделей на 60 оголошеннях. Число над стовпчиком — скільки оголошень у нього потрапило. Ліворуч від нуля — модель переоцінила, праворуч — недооцінила.

MAE в обох рівно 600 грн — і це все, що в них спільного. Верхня модель помиляється помірно й завжди приблизно однаково: найгірший промах 1 100 грн. Нижня майже точна на 54 оголошеннях із 60, зате шість разів промахується на 4 650 грн. Різницю видно вже в другому числі: RMSE 668 проти 1 477. А MedAE каже взагалі протилежне — 600 проти 150. Одного числа замало не тому, що воно неправильне, а тому, що воно одне.

ВибірЯк обирати метрику

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

Таблиця рішень · Що болить → яку метрику брати

Читай зліва направо: спершу знайди свій випадок, і аж потім бери формулу.

що болитьметрикачому саме вона
Треба назвати помилку людині простими словамиMAEу гривнях, читається вголос, кожен промах важить однаково
Велика помилка коштує дорогоRMSEквадрат карає провали непропорційно, тримає модель від катастроф
Треба навчати модельMSEгладка чаша без гострого кута, є замкнена формула розвʼязку
Незрозуміло, добре це число чи поганоR²без одиниць, порівнює з «завжди називаю середнє»
Важать відсотки, а не гривніMAPEділить на факт — але тільки якщо ціни далекі від нуля
MAPE зривається на дешевих товарахSMAPEділить на середнє факту й прогнозу, обмежена 200 %
У даних гарантовано є сміттяMedAEмедіана не помічає окремих викидів узагалі
Робоче правило: звітуй завжди двома числами — одним у гривнях (MAE або RMSE) і одним без одиниць (R²). Перше каже, наскільки модель помиляється, друге — чи варта вона взагалі свого існування порівняно з найпростішим припущенням.

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

ДаліКуди це веде

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

Другий напрямок — те, що метрика буває не лише мірилом, а й двигуном навчання. Коли ми поставили MSE функцією втрат, зʼявилась замкнена формула, яка одразу дає найкращу пряму. Як вона виводиться і чому квадрат тут не випадковий — у темі Лінійна регресія.

Три речі, які варто винести з цієї теми, навіть якщо формули забудуться: