Лінійна регресія рідко виграє змагання — її цінність у тому, що вона прозора. Домашнє завдання про це: не «навчити модель», а зрозуміти, що саме вона порахувала і чи можна їй вірити.
рівень 1Рівень 1 — База
Повтори весь пайплайн практики на іншому датасеті — і подивись на залишки.
- Візьми
sklearn.datasets.load_diabetes()— він іде разом зіscikit-learnі нічого не тягне з мережі — або будь-який власний CSV із числовою ціллю. - Обери одну ознаку, навчи МНК через нормальне рівняння на чистому NumPy
і звір коефіцієнти з
LinearRegression— різниця має бути на рівні 10⁻⁸. - Порахуй MSE, RMSE, MAE і R². Окремо порахуй R² моделі, яка завжди прогнозує середнє.
- Побудуй графік залишків: по горизонталі — прогноз, по вертикалі — залишок.
Зроблено, якщо: є assert np.allclose(наші_коефіцієнти, sklearn_коефіцієнти),
який проходить, і словесний висновок про графік залишків: чи це безструктурна хмара
навколо нуля, чи видно дугу, воронку або викиди. Назви літеру з LINE, яку порушено.
рівень 2Рівень 2 — Плюс
Покажи, що R² не можна використовувати для вибору кількості ознак.
- До реальних ознак свого датасету по черзі додавай стовпці чистого шуму
(
rng.normal(0, 1, n)) — від 0 до 30 штук. - Для кожної кількості порахуй звичайний R² на навчальній вибірці і скоригований
(adjusted) R² за формулою
1 − (1 − R²)·(n − 1)/(n − p − 1). - Окремо порахуй R² на відкладеній тестовій вибірці.
- Побудуй три криві на одному графіку.
Зроблено, якщо: на графіку звичайний навчальний R² монотонно росте, скоригований перестає рости й починає падати, а тестовий падає найшвидше. Назви кількість шумових стовпців, після якої скоригований R² уперше пішов униз, і поясни в одному реченні, чому звичайний R² росте навіть від чистого шуму.
рівень 3Рівень 3 — Виклик
Побудуй шлях регуляризації (regularization path) і зрозумій різницю між Ridge і Lasso.
- Візьми датасет із щонайменше 8 ознаками, обовʼязково їх стандартизуй.
- Реалізуй Ridge самостійно за формулою
β = (XᵀX + λI)⁻¹Xᵀy. Вільний член не штрафуй — для цього достатньо відняти середнє від y і від кожної ознаки. - Для λ від 10⁻⁴ до 10⁴ (логарифмічна сітка з 50 точок) побудуй графік: кожен коефіцієнт — окрема лінія, вісь λ логарифмічна.
- Зроби те саме для
sklearn.linear_model.Lassoі намалюй обидві картинки поруч. - Для обох знайди λ з найкращою помилкою на крос-валідації.
Зроблено, якщо: видно якісну різницю між картинками — у Ridge усі коефіцієнти
плавно осідають до нуля, у Lasso вони по черзі точно занулюються. Назви, які саме
ознаки Lasso вимкнув першими, які лишив останніми, і чи збігається цей порядок
із твоїм уявленням про їхню важливість. Перевір assert-ом, що твоя реалізація
Ridge збігається з sklearn.linear_model.Ridge при однаковому λ.
Підказки
- Рівень 1. Якщо на графіку залишків видно воронку — розкид росте разом із
прогнозом, — спробуй навчити модель на
np.log(y)замістьyі подивись, чи вирівнялась картинка. - Рівень 2. Не забудь, що скоригований R² потребує
p— кількості ознак без вільного члена. І будуй усі три криві по одній і тій самій послідовності датасетів, інакше порівняння не має сенсу. - Рівень 3.
sklearn.linear_model.Ridgeза замовчуванням не штрафує вільний член, а формула(XᵀX + λI)⁻¹Xᵀyштрафує все. Тому перед звіркою або прибери стовпець одиниць і центруй дані, або передайfit_intercept=Falseі додай стовпець одиниць сам — але тоді відповідний елемент у λI постав нулем.