У лекції ми лікували перенавчання не спрощенням моделі, а штрафом за величину ваг. Тут ти повториш це руками, а потім знайдеш межу, за якою штраф починає шкодити.
рівень 1Рівень 1 — База
Повтори шлях із практики на своїх даних.
- Візьми
np.random.default_rng(7)(інше зерно, ніж у практиці) і згенеруй 20 навчальних та 300 тестових оголошень тією самою функцієюсправжня_ціна, що в зошиті. - Побудуй ознаки — 15 форм Лежандра — і навчи модель без штрафу. Надрукуй усі 15 ваг.
- Навчи
Ridgeдляalphaз ряду0.001, 0.01, 0.1, 1, 10, 100, 1000і склади таблицю:alpha → найбільша вага → сума модулів ваг → помилка на навчанні → помилка на тесті.
Зроблено, якщо: у таблиці видно, що найбільша вага монотонно спадає зі
зростанням alpha, а помилка на тесті спершу падає, потім росте; ти назвав словами
рядок, де вона мінімальна, і рядок, де модель уже недонавчена.
рівень 2Рівень 2 — Плюс
Порівняй L1 і L2 на задачі, де ознак свідомо забагато.
- До 15 «справжніх» форм додай 10 ознак-сміття: стовпці випадкових чисел, які
ніяк не повʼязані з ціною (
rng.normal(0, 1, розмір)). Разом 25 ознак. - Підбери
alphaкрос-валідацією окремо дляRidgeCVі дляLassoCV(cv=8— вибірка маленька). - Для обох моделей порахуй: скільки ваг дорівнює точно нулю, скільки з них припадає на ознаки-сміття, і яка помилка на тесті.
Зроблено, якщо: ти показав числами, що Lasso обнулив принаймні половину
ознак-сміття, а Ridge не обнулив жодної, і пояснив трьома реченнями, чому так
поводиться модуль і чому — квадрат.
рівень 3Рівень 3 — Виклик
Напиши гребеневу регресію з нуля й дослідь, де вона ламається.
- Реалізуй
мій_ridge(X, y, alpha)через нормальні рівняння: центруй ознаки й відповідь, розвʼяжи(XᵀX + αI) w = Xᵀy, поверни ваги й вільний член. Вільний член не штрафуй. - Переконайся, що твоя реалізація збігається з
sklearn.linear_model.Ridgeдля трьох різнихalpha— черезassert np.allclose(...). - Тепер зламай масштаб: помнож кожен стовпець ознак на свій випадковий множник
із діапазону
10**uniform(-2.5, 2.5). Повтори експеримент для 10 різних наборів множників і побудуй графік: номер набору → найкраща (по всіхalpha) помилка на тесті. Додай горизонтальну лінію — результат зі зрівняними ознаками. - Повтори те саме, обгорнувши модель у
make_pipeline(StandardScaler(), Ridge(...)).
Зроблено, якщо: на першому графіку точки розкидані (частина гірша за лінію,
іноді якась краща), а на другому всі 10 точок лежать на одній висоті; ти пояснив
письмово, чому це аргумент за StandardScaler навіть тоді, коли без нього
«випадково вийшло краще».
Підказки
- Якщо ваги моделі без штрафу вийшли порядку
10⁰, а не10⁶— ти, найпевніше, узяв забагато навчальних точок. Перенавчання починається там, де кількість вільних чисел моделі підбирається до кількості прикладів. Lassoуscikit-learnмінімізує(1/2n)·Σ(y−ŷ)² + α·Σ|w|, аRidge—Σ(y−ŷ)² + α·Σw². Через цей множник1/2nоднаковеalphaозначає для них зовсім різну силу штрафу — сітки для пошуку мають бути різні.- Якщо
Lassoсипле попередженнями про збіжність, збільшmax_iterдо 100 000 і послабtolдо1e-6; ознаки-многочлени сильно корельовані, і покоординатному спуску потрібно більше проходів. - «Точно нуль» перевіряй як
модель.coef_ == 0, а неabs(...) < 1e-6: у ласо нулі справді точні, і в цьому вся суть.