Уяви, що тобі треба назвати ціну будинку, знаючи лише його площу. У тебе є записи про два десятки вже проданих будинків. Точки на графіку лежать не на одній лінії — вони розкидані хмарою, бо ціну визначає ще й район, стан ремонту, поверх, настрій продавця. Але крізь цю хмару вгадується напрямок: більша площа — дорожче.
Лінійна регресія — це спроба провести крізь хаос одну пряму так, щоб вона описувала загальний напрямок якнайточніше. Звучить примітивно. Проте саме тут ховаються ідеї, на яких тримається все машинне навчання: як виміряти помилку, як її зменшувати, як не перенавчитись і як зрозуміти, чи можна вірити результату.
01 / ПостановкаМодель у три символи
Формально ми припускаємо, що цільова величина y складається зі зваженої суми
ознак плюс щось, чого ми не знаємо:
Розберімо кожен символ окремо:
β₀— вільний член (intercept). Значення прогнозу, коли всі ознаки дорівнюють нулю. Часто не має фізичного сенсу (будинок площею 0 м²), але потрібен, щоб пряма могла зсуватися вгору-вниз.β₁…βₚ— ваги (коефіцієнти). Ті самі числа, які модель «вивчає». Кожна вага каже, наскільки змінюється прогноз при зміні своєї ознаки на одиницю.x₁…xₚ— ознаки (features). Те, що ми знаємо про обʼєкт.ε— незвідна помилка. Усе, чого модель не здатна пояснити в принципі: шум вимірювання, невраховані фактори, випадковість світу.
x², отримаємо криву —
і це все ще буде лінійна регресія, бо β входять у формулу лінійно.Далі для наочності залишимо одну ознаку. Тоді модель — звичайна пряма на площині, і вся задача зводиться до питання: які саме β₀ і β₁ вважати найкращими?
02 / ПомилкаЩо означає «найкраща» пряма
Для кожного будинку різниця між справжньою ціною і нашим прогнозом називається залишком (residual):
На графіку це вертикальний відрізок від точки до прямої. Ідеальної прямої не існує — завжди хтось продався дорожче чи дешевше за очікуване. Тому питання не «як прибрати залишки», а «як зробити їх сумарно найменшими».
Покрути повзунки. Увімкни «показати квадрати» — і побачиш ті самі квадрати, що дали методу ім'я: мінімізувати помилку означає буквально зменшити їхню сумарну площу.
Інтерактив 1 · Підбери пряму
Тягни β₀ і β₁. Бурштинові відрізки — залишки. Пунктир — оптимум за формулою МНК.
03 / Вибір метрикиЧому саме квадрат
Здавалося б, навіщо квадрат? Можна ж просто додати модулі залишків. Обидва варіанти використовують, і різниця між ними — не формальність, а різна поведінка:
У квадрата дві властивості. Перша: він гладкий — має похідну скрізь, тому працює градієнтний спуск і існує замкнена формула. Модуль у нулі зламаний, і це ускладнює оптимізацію. Друга: квадрат непропорційно карає великі промахи. Помилка 10 коштує 100, помилка 20 — вже 400. Учетверо більше за вдвічі більшу помилку.
Друга властивість — це водночас і перевага, і вразливість. Модель, що мінімізує MSE, відчайдушно уникає великих промахів — і тому дозволяє одному викиду перетягнути себе. Посунь викид у інтерактиві нижче й порівняй, як реагують дві прямі.
Інтерактив 2 · MSE проти MAE: хто стійкіший до викидів
Тягни повзунок — він піднімає одну-єдину точку. Дивись, яка пряма за нею побіжить.
| метрика | що це | коли брати |
|---|---|---|
| MSE | середній квадрат залишку | для навчання: гладка, є похідна |
| RMSE | корінь із MSE | для звіту: в одиницях ціни |
| MAE | середній модуль залишку | коли в даних є викиди |
| R² | частка поясненої дисперсії | щоб порівняти з «нічого не роблю» |
04 / R²З чим ми взагалі порівнюємо
MSE = 500 — це добре чи погано? Без контексту сказати неможливо: усе залежить від масштабу цін. Тому потрібна метрика без одиниць, яка порівнює нашу модель із чимось осмисленим. Таким «чимось» беруть найдурнішу можливу модель: завжди прогнозувати середнє.
Тут SS_res — сума квадратів залишків нашої моделі, а
SS_tot — сума квадратів відхилень від середнього, тобто помилка тієї самої
дурної моделі. Обидві величини — це буквально сумарна площа квадратів, тільки відкладених
від різних ліній. Перемикай режим і порівняй їх наочно:
Інтерактив 3 · З чого складається R²
Ліворуч — квадрати від середнього (SStot). Праворуч — від нашої прямої (SSres).
05 / Розв'язокНормальне рівняння крок за кроком
Функція втрат MSE — квадратична, отже опукла: у неї рівно один мінімум, без пасток у вигляді локальних ям. Це рідкісний подарунок. Розберімо, звідки береться формула розв'язку — не як магію, а як чотири звичайні кроки.
Складаємо всі обʼєкти в матрицю X (рядок = обʼєкт, стовпець = ознака,
перший стовпець — одиниці для β₀). Тоді всі прогнози одразу:
Сума квадратів залишків — це квадрат довжини вектора помилок:
У точці мінімуму похідна дорівнює нулю. Беремо градієнт по β і прирівнюємо:
Ділимо на −2 і розкриваємо дужки — отримуємо так зване нормальне рівняння:
Якщо матриця XᵀX оборотна — множимо обидві частини на обернену:
Формула дає точну відповідь за один крок, без жодних гіперпараметрів. Але в ній ховаються дві проблеми. Перша: обернення матриці коштує приблизно як куб кількості ознак — на десятку ознак це миттєво, на десятках тисяч неприйнятно. Друга, підступніша: якщо дві ознаки майже дублюють одна одну, матриця стає майже виродженою, і обернення дає дику чутливість до найменшого шуму в даних.
np.linalg.solve або QR-розклад розвʼязують систему напряму —
це і швидше, і чисельно стійкіше. np.linalg.inv у робочому коді — майже завжди
ознака помилки.06 / ІтераціїГрадієнтний спуск
Другий шлях — не розв'язувати рівняння, а просто котитися вниз схилом функції втрат:
Обчислюємо градієнт (напрямок найшвидшого зростання помилки), робимо крок у
протилежний бік, повторюємо. Розмір кроку η задаємо самі — і саме він вирішує все.
Замалий: збіжність триватиме вічність. Завеликий: кожне оновлення перестрибуватиме мінімум
і відлітатиме далі, ніж було.
Інтерактив 4 · Градієнтний спуск
Ліворуч — карта функції втрат, світле в центрі = мінімум. Праворуч — як падає помилка.
07 / МасштабЧому потрібна стандартизація
Ось пастка, на якій спотикаються майже всі. Якщо ознаки мають різні масштаби — площа в сотнях, кількість кімнат в одиницях — поверхня втрат перестає бути круглою чашею і витягується у довгий вузький яр.
Проблема в тому, що крок η один на всі напрямки. Той крок, що нормальний уздовж пологої осі, виявляється завеликим упоперек крутої — і спуск починає зигзагом відбиватися від стінок яру замість того, щоб іти до дна. Перемкни тумблер і подивись на різницю траєкторій:
Інтерактив 5 · Яр проти чаші
Та сама задача, той самий крок η. Різниця лише в тому, чи стандартизовано ознаку.
08 / РозмірністьКілька ознак: від прямої до площини
Досі в нас була одна ознака. У житті їх десятки. Геометрія при цьому змінюється так: одна ознака дає пряму на площині, дві ознаки — площину в просторі, три і більше — гіперплощину, яку вже не намалюєш.
Але математика не змінюється взагалі. Та сама формула β = (XᵀX)⁻¹Xᵀy
працює для будь-якої кількості ознак — треба лише додати стовпців у матрицю X.
Покрути сцену, щоб побачити, що площина робить те саме, що робила пряма:
Інтерактив 6 · Дві ознаки — площина
Прогноз ціни за площею та віком будинку. Тягни повзунок повороту.
09 / ГнучкістьНелінійність і перенавчання
А якщо залежність насправді крива? Тут стається несподіване: лінійна регресія вміє
описувати криві. Достатньо додати як ознаки степені x:
Модель лишається лінійною за параметрами — а отже, працює та сама формула. Ми просто підсунули їй нові стовпці. Але ось де починається головна драма всього машинного навчання: чим вищий степінь, тим гнучкіша крива — і тим точніше вона підганяється під шум замість справжньої закономірності.
Рухай повзунок степеня й дивись на дві криві помилки. Вони поводяться зовсім по-різному:
Інтерактив 7 · Степінь полінома та перенавчання
Рожеві точки — навчальні, сині — тестові (модель їх ніколи не бачила).
10 / ПриборканняРегуляризація
Подивись на коефіцієнти перенавченої моделі — вони величезні, десятки тисяч, із
чергуванням знаків. Крива робить дикі стрибки, бо великі ваги з протилежними знаками
взаємно гасяться, але найменший зсув по x руйнує цей баланс.
Ідея регуляризації проста: додати штраф за величину ваг прямо у функцію втрат. Тепер моделі невигідно роздувати коефіцієнти без вагомої причини:
Параметр λ керує балансом: нуль — звичайна регресія, велике значення —
всі ваги притиснуті до нуля й модель стає майже прямою. Різниця між L2 і L1: Ridge плавно
стискає всі ваги, а Lasso занулює неважливі повністю — тобто заодно робить відбір ознак.
Інтерактив 8 · Як λ приборкує криву
Степінь фіксовано на 12 — свідомо забагато. Дивись, що робить регуляризація.
11 / СенсЯк читати коефіцієнти
Коефіцієнт β₁ читається так: якщо площа зростає на одиницю, прогноз ціни
змінюється в середньому на β₁ — за умови, що решта ознак не змінилася. Ця остання
обмовка робить лінійну регресію прозорою: можна подивитись на число і сказати, що модель
насправді думає. Градієнтний бустинг чи нейромережа такої розкоші не дають.
Але прозорість зникає, щойно ознаки починають дублювати одна одну. Якщо в датасеті є і «площа в м²», і «площа у футах», модель може приписати першій величезну додатну вагу, а другій — таку саму відʼємну. Прогнози будуть нормальні, інтерпретація — сміття. Це мультиколінеарність, і вона ж робить коефіцієнти нестабільними: прибереш один рядок з даних — знаки перевернуться.
12 / МежіЧотири припущення, які легко порушити
Код виконається на будь-яких даних і видасть числа. Проблема в тому, що ці числа мають сенс лише коли виконуються чотири умови. Їх зручно запамʼятати абревіатурою LINE. Перемикай сценарії — кожен ламає рівно одне припущення.
Інтерактив 9 · Коли пряма бреше
Угорі — дані та підгонка. Унизу — графік залишків: головний діагностичний інструмент.
| літера | припущення | як ламається | що робити |
|---|---|---|---|
| L | Linearity — звʼязок лінійний | залишки лягають дугою | поліноміальні ознаки, інша модель |
| I | Independence — спостереження незалежні | часові ряди, повтори обʼєкта | моделі часових рядів, групова валідація |
| N | Normality — залишки нормальні | ламає довірчі інтервали | трансформація y (напр. log) |
| E | Equal variance — розкид сталий | залишки воронкою | зважена регресія, log-таргет |
13 / ПідсумокНавіщо це знати
Лінійна регресія рідко виграє змагання. Її цінність в іншому — це базова лінія, з якою порівнюють усе решта. Вона вчиться за секунди, чесно каже, що думає, і працює на крихітних вибірках. Якщо важкий бустинг ледве обігнав пряму — це сигнал, що в даних просто немає нелінійної структури, і складна модель лише додає ризику без користі.
А ще вона — найдешевший спосіб зрозуміти механіку, яку далі побачиш скрізь:
- функція втрат — як взагалі вимірюють «поганість» моделі;
- градієнт і крок — як її зменшують, від регресії до мовних моделей;
- перенавчання — чому складніша модель не означає кращу;
- регуляризація — як стримують складність;
- припущення — чому працюючий код ще не означає правильний результат.
Змінюватиметься форма моделі. Цикл лишиться тим самим.
practice.ipynb ти реалізуєш МНК через
NumPy вручну, порівняєш із scikit-learn, напишеш градієнтний спуск із нуля
й перевіриш припущення LINE на реальному датасеті.Далі в темі
Теорію прочитано. Тепер закріпи її на практиці.