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

Пряма крізь хаос

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

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

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

01 / ПостановкаМодель у три символи

Формально ми припускаємо, що цільова величина y складається зі зваженої суми ознак плюс щось, чого ми не знаємо:

y = β0 + β1x1 + β2x2 + … + βpxp + ε

Розберімо кожен символ окремо:

Чому «лінійна». Модель лінійна за параметрами β, а не обовʼязково за ознаками. Ми ще побачимо, що додавши ознаку , отримаємо криву — і це все ще буде лінійна регресія, бо β входять у формулу лінійно.

Далі для наочності залишимо одну ознаку. Тоді модель — звичайна пряма на площині, і вся задача зводиться до питання: які саме β₀ і β₁ вважати найкращими?

02 / ПомилкаЩо означає «найкраща» пряма

Для кожного будинку різниця між справжньою ціною і нашим прогнозом називається залишком (residual):

ei = yi − ŷi

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

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

Інтерактив 1 · Підбери пряму

Тягни β₀ і β₁. Бурштинові відрізки — залишки. Пунктир — оптимум за формулою МНК.

MSE
RMSE
мінімум
Що читати: сірий пунктир — прогноз середнім, найпримітивніша можлива модель. R² якраз і показує, наскільки ти обіграв це середнє: R² = 0 — не краще за нього, R² = 1 — ідеально, R² < 0 — гірше, ніж просто вгадувати середнє.

03 / Вибір метрикиЧому саме квадрат

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

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

У квадрата дві властивості. Перша: він гладкий — має похідну скрізь, тому працює градієнтний спуск і існує замкнена формула. Модуль у нулі зламаний, і це ускладнює оптимізацію. Друга: квадрат непропорційно карає великі промахи. Помилка 10 коштує 100, помилка 20 — вже 400. Учетверо більше за вдвічі більшу помилку.

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

Інтерактив 2 · MSE проти MAE: хто стійкіший до викидів

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

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

04 / R²З чим ми взагалі порівнюємо

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

R2 = 1 − SSres / SStot

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

Інтерактив 3 · З чого складається R²

Ліворуч — квадрати від середнього (SStot). Праворуч — від нашої прямої (SSres).

SStot
SSres
R² = 1 − SSres/SStot
Ключ до розуміння: ліва картинка не змінюється — вона не залежить від моделі. Уся робота моделі в тому, щоб зменшити праву суму. R² — це просто частка, на яку вдалося її зменшити.
Пастка R². Він майже ніколи не спадає, коли додаєш нові ознаки — навіть якщо ознака є чистим шумом. Модель завжди знайде спосіб трохи підігнатися під випадковість. Тому моделі з різною кількістю ознак чесно порівнювати лише за скоригованим (adjusted) R², який штрафує за кожен зайвий параметр.

05 / Розв'язокНормальне рівняння крок за кроком

Функція втрат MSE — квадратична, отже опукла: у неї рівно один мінімум, без пасток у вигляді локальних ям. Це рідкісний подарунок. Розберімо, звідки береться формула розв'язку — не як магію, а як чотири звичайні кроки.

крок 1 · записуємо в матричному вигляді

Складаємо всі обʼєкти в матрицю X (рядок = обʼєкт, стовпець = ознака, перший стовпець — одиниці для β₀). Тоді всі прогнози одразу:

ŷ = X β
крок 2 · записуємо помилку

Сума квадратів залишків — це квадрат довжини вектора помилок:

L(β) = ‖y − Xβ‖2 = (y − Xβ)T(y − Xβ)
крок 3 · шукаємо мінімум

У точці мінімуму похідна дорівнює нулю. Беремо градієнт по β і прирівнюємо:

∇L = −2 XT(y − Xβ) = 0

Ділимо на −2 і розкриваємо дужки — отримуємо так зване нормальне рівняння:

XTX β = XTy
крок 4 · виражаємо β

Якщо матриця XᵀX оборотна — множимо обидві частини на обернену:

β = (XTX)−1 XTy

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

На практиці. Навіть коли формулу застосовують, матрицю ніколи не обертають явно. np.linalg.solve або QR-розклад розвʼязують систему напряму — це і швидше, і чисельно стійкіше. np.linalg.inv у робочому коді — майже завжди ознака помилки.

06 / ІтераціїГрадієнтний спуск

Другий шлях — не розв'язувати рівняння, а просто котитися вниз схилом функції втрат:

β := β − η · ∇L(β)

Обчислюємо градієнт (напрямок найшвидшого зростання помилки), робимо крок у протилежний бік, повторюємо. Розмір кроку η задаємо самі — і саме він вирішує все. Замалий: збіжність триватиме вічність. Завеликий: кожне оновлення перестрибуватиме мінімум і відлітатиме далі, ніж було.

Інтерактив 4 · Градієнтний спуск

Ліворуч — карта функції втрат, світле в центрі = мінімум. Праворуч — як падає помилка.

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

07 / МасштабЧому потрібна стандартизація

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

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

Інтерактив 5 · Яр проти чаші

Та сама задача, той самий крок η. Різниця лише в тому, чи стандартизовано ознаку.

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

08 / РозмірністьКілька ознак: від прямої до площини

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

Але математика не змінюється взагалі. Та сама формула β = (XᵀX)⁻¹Xᵀy працює для будь-якої кількості ознак — треба лише додати стовпців у матрицю X. Покрути сцену, щоб побачити, що площина робить те саме, що робила пряма:

Інтерактив 6 · Дві ознаки — площина

Прогноз ціни за площею та віком будинку. Тягни повзунок повороту.

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

09 / ГнучкістьНелінійність і перенавчання

А якщо залежність насправді крива? Тут стається несподіване: лінійна регресія вміє описувати криві. Достатньо додати як ознаки степені x:

ŷ = β0 + β1x + β2x2 + β3x3 + …

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

Рухай повзунок степеня й дивись на дві криві помилки. Вони поводяться зовсім по-різному:

Інтерактив 7 · Степінь полінома та перенавчання

Рожеві точки — навчальні, сині — тестові (модель їх ніколи не бачила).

помилка train
помилка test
Дві криві розходяться: навчальна помилка падає завжди — складніша модель завжди краще запамʼятовує те, що бачила. Тестова спочатку падає, потім росте. Поки що просто запамʼятай цю картинку: чому вона саме така, звідки береться підйом і що з ним робити — розібрано в темі 20 · Перенавчання й недонавчання.
Звідси головне правило. Якість моделі вимірюють тільки на даних, яких вона не бачила. Помилка на навчальній вибірці нічого не каже про те, чи буде модель працювати завтра — вона каже лише, наскільки добре модель запамʼятала вчорашнє.

10 / ПриборканняРегуляризація

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

Ідея регуляризації проста: додати штраф за величину ваг прямо у функцію втрат. Тепер моделі невигідно роздувати коефіцієнти без вагомої причини:

L = Σ(y − ŷ)2 + λ · Σ βj2   ← Ridge (L2)
L = Σ(y − ŷ)2 + λ · Σ |βj|   ← Lasso (L1)

Параметр λ керує балансом: нуль — звичайна регресія, велике значення — всі ваги притиснуті до нуля й модель стає майже прямою. Різниця між L2 і L1: Ridge плавно стискає всі ваги, а Lasso занулює неважливі повністю — тобто заодно робить відбір ознак.

Інтерактив 8 · Як λ приборкує криву

Степінь фіксовано на 12 — свідомо забагато. Дивись, що робить регуляризація.

помилка test
‖β‖ норма ваг
Що видно: знизу — стовпчики коефіцієнтів. При λ=0 вони зашкалюють, зі зростанням λ дружно осідають до нуля. Тестова помилка має мінімум десь посередині — саме там λ підбирають крос-валідацією.

11 / СенсЯк читати коефіцієнти

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

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

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

12 / МежіЧотири припущення, які легко порушити

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

Інтерактив 9 · Коли пряма бреше

Угорі — дані та підгонка. Унизу — графік залишків: головний діагностичний інструмент.

нахил β₁
Головне правило: у здоровій моделі залишки — безструктурна хмара навколо нуля. Будь-який видимий візерунок на нижньому графіку означає, що в даних лишилася закономірність, якої модель не побачила.
літераприпущенняяк ламаєтьсящо робити
LLinearity — звʼязок лінійнийзалишки лягають дугоюполіноміальні ознаки, інша модель
IIndependence — спостереження незалежнічасові ряди, повтори обʼєктамоделі часових рядів, групова валідація
NNormality — залишки нормальніламає довірчі інтервалитрансформація y (напр. log)
EEqual variance — розкид сталийзалишки воронкоюзважена регресія, log-таргет

13 / ПідсумокНавіщо це знати

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

А ще вона — найдешевший спосіб зрозуміти механіку, яку далі побачиш скрізь:

Змінюватиметься форма моделі. Цикл лишиться тим самим.

Далі в практиці. У practice.ipynb ти реалізуєш МНК через NumPy вручну, порівняєш із scikit-learn, напишеш градієнтний спуск із нуля й перевіриш припущення LINE на реальному датасеті.

Далі в темі

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