Теорія
Множинна лінійна регресія
Множинна регресія: як відокремити вплив кількох драйверів одночасно і не потрапити у дві класичні пастки — перенавчання та мультиколінеарність.
~10 хв читання · 11 вправ · 250 балів
Перед початком
Більше ніж одна причина
Повертаємося до продуктової команди Котокорму: із замовленнями ще не закінчено. Один предиктор — непоганий початок, але реальні замовлення залежать від реклами, святкових тижнів і, можливо, ціни — усього одночасно.
У цьому уроці ти побудуєш одне рівняння з кількома предикторами, розбереш, що означає кожен коефіцієнт, коли решту зафіксовано, і познайомишся з двома класичними пастками: моделлю, яка надто добре підганяє минуле, і предикторами, що перекривають один одного.
Множинна регресія: одне рівняння, кілька предикторів
Замовлення рідко залежать від однієї речі. Множинна регресія підбирає одне рівняння з кількома предикторами одразу:

ŷ = b0 + b1x1 + b2x2 + … + bkxk
Її так само підбирають методом найменших квадратів: коефіцієнти обирають разом, щоб сума квадратів залишків була якомога меншою.
Ключ до читання — фраза «за незмінних інших предикторів». У рівнянні orders = b0 + b1 × ad_spend + b2 × is_holiday_week b1 — прогнозована зміна замовлень на кожен додатковий долар реклами, коли статус свята не змінюється. Він порівнює тижні, однакові за всіма іншими предикторами рівняння.

У цьому головний виграш порівняно з простою регресією. Якщо Котокорм більше витрачає у святкові тижні, проста регресія на рекламних витратах віддасть рекламі заслугу й за частину святкових замовлень. Прапорець свята розділяє ці два ефекти.
Два застереження. «За незмінних» — властивість рівняння, а не збору даних: ніхто нічого не заморожував. І рівняння враховує лише предиктори, які є в моделі; змішувальний чинник, якого ти не додав, і далі просочується в коефіцієнти.
- Так«Серед тижнів з однаковим статусом свята кожен додатковий долар прогнозує на 0,05 замовлення більше.»
- Не так«b1 = 0,05 — сукупний ефект реклами, включно зі святковим сплеском.»
Святкова частина — у b2, а не в b1.
Прогноз із предиктором 0/1
Деякі предиктори — це факти «так/ні»: чи тиждень святковий, чи бачив користувач новий кошик, чи має клієнт передплату. Регресія працює з ними як зі змінними 0/1: 1, коли факт правдивий, 0 — коли ні.
Тоді коефіцієнт такої змінної — фіксована надбавка. У рівнянні
orders = 12 + 0,05 × ad_spend + 4 × is_holiday_week
святковий тиждень додає 4 прогнозовані замовлення до того, що прогнозують рекламні витрати, за будь-якого рівня витрат. На графіку святкові й звичайні тижні отримують дві паралельні прямі на відстані 4 замовлень.
Щоб спрогнозувати, підстав кожен предиктор і додай доданки. Для святкового тижня з ad_spend = 400:
12 + 0,05 × 400 + 4 × 1 = 12 + 20 + 4 = 36 замовлень.
Рахуй доданок за доданком і записуй кожен; із кількома предикторами один легко загубити. І стеж за одиницями: ad_spend тут у доларах, тож 400 означає 400 дол., а не 400 сотень.
Фіксована надбавка — це припущення. Якби свята робили рекламу ефективнішою, знадобився б додатковий доданок взаємодії; це рівняння такого не покаже.
- Так12 + 0,05 × 400 + 4 × 1 = 36 замовлень
- Не так12 + 0,05 × 400 = 32 замовлення для святкового тижня
Забуто святковий доданок.
Коли прапорець дорівнює 0
Для звичайного тижня прапорець свята дорівнює 0, тож його доданок зникає: 4 × 0 = 0. Прогноз дають лише вільний член і рекламні витрати. Для ad_spend = 600:
12 + 0,05 × 600 + 4 × 0 = 12 + 30 + 0 = 42 замовлення.
Тут змінюється зміст вільного члена. У цьому рівнянні 12 — прогноз для звичайного тижня з нульовими рекламними витратами: опорна група — «не свято». Коефіцієнт свята показує, наскільки святкові тижні відрізняються від цієї опори.
Та сама логіка працює для категорій із більш ніж двома значеннями, як-от канал трафіку. Один канал обирають опорним і додають змінну 0/1 для кожного іншого; кожен коефіцієнт тоді — різниця з опорним каналом. Ніколи не додавай змінну для кожної категорії плюс вільний член: змінні завжди в сумі даватимуть 1, і модель не зможе відділити їх від вільного члена.
Дві помилки, яких варто уникати: додавати надбавку «про всяк випадок», коли прапорець 0, і читати 12 як типові замовлення, хоча це крайній випадок, якого ніхто міг і не спостерігати.
- Так12 + 0,05 × 600 + 4 × 0 = 42 замовлення
- Не так12 + 0,05 × 600 + 4 = 46 замовлень для звичайного тижня
Додає святкову надбавку, коли прапорець 0.
Як чесно порівнювати коефіцієнти
Спокуса — ранжувати предиктори за розміром коефіцієнтів. Це майже завжди вводить в оману, бо кожен коефіцієнт несе одиниці свого предиктора.
У рівнянні orders = 12 + 0,05 × ad_spend + 4 × is_holiday_week 0,05 — це замовлення на долар, а 4 — замовлення на святковий тиждень. Казати, що другий «у 80 разів більший», означає порівнювати долари з тижнями. Вимірюй витрати в сотнях доларів — і коефіцієнт стане 5, тобто більшим за 4, хоча насправді нічого не змінилося.
Два чесні способи порівняння:
- реалістичні зміни. Помнож кожен коефіцієнт на зміну, яка справді трапляється. Типовий крок бюджету в 100 дол. дає 0,05 × 100 = 5 замовлень; святковий тиждень — 4. Ефекти схожі;
- стандартизовані коефіцієнти. Спершу переведи кожен предиктор в одиниці стандартного відхилення, тоді кожен коефіцієнт означає «ефект зміни на одне стандартне відхилення».
Але й тоді більший ефект — не обов'язково кращий важіль. Запитай також, скільки коштує кожна зміна, чи можна її зробити і чи стабільний коефіцієнт, адже корельовані предиктори можуть його розхитати.
- Так«+100 дол. реклами ≈ +5 замовлень; святковий тиждень ≈ +4 замовлення.»
- Не так«4 значно більше за 0,05, тож свята — наш головний драйвер.»
Порівнює числа в різних одиницях.
Чому R² не падає, коли додаєш предиктори
На даних, на яких модель підібрано, R² може лише зрости або лишитися тим самим, коли додаєш предиктор, хай яким марним він є.
Причина проста. Метод найменших квадратів обирає коефіцієнти, що роблять суму квадратів залишків якомога меншою. Маючи нову колонку, він завжди може поставити її коефіцієнт рівно на нуль і повернути старе прилягання. Тож нове прилягання щонайменше таке саме, а на практиці випадкова колонка майже завжди трохи корелює з рештками шуму, тож R² підповзає вгору.
Додай погоду в іншому місті, числа вчорашньої лотереї й сон офісного кота — і R² на минулих двадцяти тижнях зросте. Прогнози на наступний місяць не покращаться; найчастіше вони погіршаться.
Тому сам R² — поганий спосіб обирати між моделями з різною кількістю предикторів. Це виправляють два інструменти:
- скоригований R² та інформаційні критерії (AIC, BIC), які беруть ціну за кожен зайвий предиктор;
- поділ на навчальну і тестову вибірки, що перевіряє модель на даних, яких вона не бачила.
- Так«R² зріс з 0,88 до 0,89 після 6 нових предикторів; перевір скоригований R² і тестову вибірку, перш ніж їх лишати.»
- Не так«R² зріс, отже, нові предиктори корисні.»
На навчальних даних R² зростає навіть від шуму.
Скоригований R²
Скоригований R² виправляє R² на кількість предикторів, тож модель отримує вищий бал, лише якщо новий предиктор допомагає більше, ніж дала б випадковість:
R²adj = 1 − (1 − R²) × (n − 1) / (n − k − 1)
де n — кількість спостережень, а k — кількість предикторів (без вільного члена).
Для моделі з R² = 0,90, k = 5 предикторами і n = 20 тижнями:
- n − 1 = 19 і n − k − 1 = 14, тож штрафний множник 19 / 14 ≈ 1,357;
- 1 − R² = 0,10, і 0,10 × 1,357 ≈ 0,136;
- R²adj = 1 − 0,136 ≈ 0,86.
Штраф зростає, коли k наближається до n. З 15 предикторами на 20 тижнях той самий R² = 0,90 дав би 1 − 0,10 × 19 / 4 = 0,525. Малий розрив між R² і скоригованим R² означає, що предиктори відпрацьовують своє; великий — що деякі просто їдуть пасажирами.
Дві помилки: брати n − k замість n − k − 1 і забувати відняти від 1 наприкінці. Для безнадійної моделі скоригований R² може стати навіть від'ємним, і це корисний сигнал тривоги.
- Так1 − 0,10 × 19 / 14 ≈ 0,86
- Не так0,10 × 19 / 14 ≈ 0,14, «скоригований R² — 0,14»
Зупиняється, не віднявши від 1.
Дві пастки й дві перевірки
Множинна регресія має дві класичні пастки, і їх легко сплутати.
- Мультиколінеарність — проблема між предикторами. Коли два предиктори тісно рухаються разом, як рекламні витрати й глибина знижки, які піднімають в ті самі тижні, модель не може визначити, кому належить заслуга. Їхні коефіцієнти стають нестійкими: кілька нових тижнів даних можуть сильно їх зсунути чи навіть змінити знак.
- Перенавчання — проблема надмірної гнучкості. Із багатьма предикторами й небагатьма спостереженнями модель починає підганяти шум саме цих тижнів. На даних, на яких її підібрано, вона виглядає чудово, а на нових розчаровує.
Дві перевірки спрямовані на перенавчання:
- поділ на навчальну і тестову вибірки: підбери модель на одній частині даних, скажімо на 80% тижнів, і виміряй точність на 20%, яких модель не бачила;
- інформаційний критерій (AIC, BIC): показник, що винагороджує добре прилягання, але знімає бали за кожен зайвий предиктор. Менше — краще; він для порівняння моделей, підібраних на тих самих даних.
Для мультиколінеарності перша перевірка простіша: подивись на кореляції між предикторами, перш ніж читати їхні коефіцієнти.
- Так«Рекламні витрати й глибина знижки корелюють на 0,9, тож я не читатиму їхні коефіцієнти окремо.»
- Не так«Модель перенавчена, бо реклама й знижка корелюють.»
Плутає дві пастки: корельовані предиктори — це мультиколінеарність.
Як обирати модель за тестовою вибіркою
Прогноз завжди стосується даних, яких модель не бачила. Поділ на навчальну і тестову вибірки імітує це ще до того, як ти покладешся на модель:
- Відклади частину даних, часто останні 20% тижнів, як тестову вибірку.
- Підбери кожну модель-кандидата лише на решті, навчальних, даних.
- Порівняй моделі на тестовій вибірці й обери найкращу там.
Читай обидва результати разом. Модель із R² = 0,95 на навчальній і 0,55 на тестовій вивчила особливості своїх навчальних тижнів: класичне перенавчання. Модель із 0,85 і 0,82 на папері менш вражає, але тримається, тож запускати варто її. Невелике падіння від навчальної до тестової — норма; велике — сигнал тривоги.
Для даних у часі ділимо за часом (навчаємо на раніших тижнях, тестуємо на пізніших), а не випадково, щоб тестова вибірка імітувала справжнє майбутнє.
Бережи тестову вибірку чесною: якщо безкінечно підкручувати модель, доки тестовий результат не стане гарним, тестова вибірка непомітно перетворюється на навчальну. Спершу визнач кандидатів, тоді дивись.
- ТакНавчальна 0,85 / тестова 0,82 краща за навчальну 0,95 / тестову 0,55.
- Не так«Модель A має R² = 0,95 на наших даних, тож прогнозуватиме найкраще.»
Оцінює прогноз за даними, які модель уже бачила.
Як жити з корельованими предикторами
Мультиколінеарність означає, що два чи більше предикторів сильно корелюють між собою. У Котокормі глибина знижки зростає в ті самі тижні, що й рекламні витрати, тож у даних майже немає тижнів із великою рекламою й малою знижкою чи навпаки. Моделі нічим розділити їхні ефекти.

Що вона ламає, а що ні:
- ламає: окремі коефіцієнти. Вони стають нестійкими, їхня невизначеність роздувається, а знаки можуть змінюватися. «У знижки більший коефіцієнт» — небезпечний висновок;
- не ламає: загальні прогнози, поки предиктори й далі рухаються разом так, як раніше. Модель усе ще знає, що «тижні великого промо» дають більше замовлень.
Поширені способи виправлення:
- вилучити один із корельованих предикторів і пояснювати інший як представника обох;
- об'єднати їх в один показник, наприклад інтенсивність промо;
- застосувати покрокову регресію, що додає чи прибирає предиктори по одному за критерієм якості, хоча на малих даних її може обманути випадковість;
- найкраще — створити варіацію: провести кілька тижнів із рекламою, але без глибшої знижки, і навпаки.
- Так«Модель добре прогнозує промо-тижні, але розділити заслугу між рекламою і знижками я не можу; проведімо кілька тижнів лише з одним із них.»
- Не так«Коефіцієнт реклами став від'ємним, отже, реклама шкодить замовленням.»
Змінений знак — симптом мультиколінеарності, а не знахідка.
Готові потренуватися?
Виконайте вправи уроку й отримайте 250 балів, коли пройдете його вперше.
Розпочати вправи