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

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

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

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

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

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

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

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

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

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

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

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

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

оголошеннярікстанпам'ятьфакт, грнпрогноз, грнпомилка
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 грн. Жоден прогноз не влучив. Модель, яку ми щойно оголосили ідеальною, помиляється на кожному оголошенні без винятку.

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

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

Інтерактив 1 · Сума помилок нічого не міряє

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

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

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

03 / Модуль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 стійкою до викидів і водночас позбавляє її здатності бити тривогу через одну катастрофу.

04 / Квадрат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 дешевше. Як саме на цьому будується навчання, розібрано в темі Лінійна регресія.

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

05 / Протистояння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 почне міряти переважно їх, а не якість моделі.

06 / Порівняння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². Перша: він майже ніколи не спадає, коли додаєш нові ознаки — навіть коли ознака є чистим шумом. Тому моделі з різною кількістю ознак чесно порівнювати лише за скоригованим (adjusted) R². Друга: R² рахується відносно середнього тієї вибірки, на якій ти міряєш. Візьми тестову вибірку з вужчим розкидом цін — і R² впаде, хоча модель не змінилась ні на йоту.

07 / Відсотки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 грн:

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

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

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

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

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

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

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

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

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

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

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

метрикашість чеснихплюс оголошення за 1 грну скільки разів гірше
MAE600 грн1 371 грн×2,3
RMSE700 грн2 358 грн×3,4
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 вціліла краще саме тому, що її знаменник — середнє між фактом і прогнозом, а не сам факт.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Далі в практиці. У practice.ipynb ти напишеш кожну метрику вручну на NumPy, звіриш свої числа зі sklearn.metrics до останнього знака, зіпсуєш дані одним викидом і побачиш реакцію кожної метрики, а наприкінці збудуєш дві моделі, на яких MAE і RMSE дадуть протилежні вердикти.

Далі в темі

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