Домашнє завдання

Регуляризація

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


рівень 1Рівень 1 — База

Повтори шлях із практики на своїх даних.

  1. Візьми np.random.default_rng(7) (інше зерно, ніж у практиці) і згенеруй 20 навчальних та 300 тестових оголошень тією самою функцією справжня_ціна, що в зошиті.
  2. Побудуй ознаки — 15 форм Лежандра — і навчи модель без штрафу. Надрукуй усі 15 ваг.
  3. Навчи Ridge для alpha з ряду 0.001, 0.01, 0.1, 1, 10, 100, 1000 і склади таблицю: alpha → найбільша вага → сума модулів ваг → помилка на навчанні → помилка на тесті.

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


рівень 2Рівень 2 — Плюс

Порівняй L1 і L2 на задачі, де ознак свідомо забагато.

  1. До 15 «справжніх» форм додай 10 ознак-сміття: стовпці випадкових чисел, які ніяк не повʼязані з ціною (rng.normal(0, 1, розмір)). Разом 25 ознак.
  2. Підбери alpha крос-валідацією окремо для RidgeCV і для LassoCV (cv=8 — вибірка маленька).
  3. Для обох моделей порахуй: скільки ваг дорівнює точно нулю, скільки з них припадає на ознаки-сміття, і яка помилка на тесті.

Зроблено, якщо: ти показав числами, що Lasso обнулив принаймні половину ознак-сміття, а Ridge не обнулив жодної, і пояснив трьома реченнями, чому так поводиться модуль і чому — квадрат.


рівень 3Рівень 3 — Виклик

Напиши гребеневу регресію з нуля й дослідь, де вона ламається.

  1. Реалізуй мій_ridge(X, y, alpha) через нормальні рівняння: центруй ознаки й відповідь, розвʼяжи (XᵀX + αI) w = Xᵀy, поверни ваги й вільний член. Вільний член не штрафуй.
  2. Переконайся, що твоя реалізація збігається з sklearn.linear_model.Ridge для трьох різних alpha — через assert np.allclose(...).
  3. Тепер зламай масштаб: помнож кожен стовпець ознак на свій випадковий множник із діапазону 10**uniform(-2.5, 2.5). Повтори експеримент для 10 різних наборів множників і побудуй графік: номер набору → найкраща (по всіх alpha) помилка на тесті. Додай горизонтальну лінію — результат зі зрівняними ознаками.
  4. Повтори те саме, обгорнувши модель у make_pipeline(StandardScaler(), Ridge(...)).

Зроблено, якщо: на першому графіку точки розкидані (частина гірша за лінію, іноді якась краща), а на другому всі 10 точок лежать на одній висоті; ти пояснив письмово, чому це аргумент за StandardScaler навіть тоді, коли без нього «випадково вийшло краще».


Підказки