# 3. L1, L2, Elastic Net, early stopping и bias–variance > Регуляризация сознательно ограничивает подгонку train-данных, чтобы уменьшить ошибку на новых объектах. ## Мотивация Гибкая модель может запомнить шум: train loss падает, validation loss растёт. Регуляризация кодирует предпочтение простых параметров, а early stopping ограничивает время подгонки. Цена — дополнительное смещение; выгода — меньшая чувствительность к конкретной выборке. ## Интуиция L2 плавно сжимает все веса, особенно большие. L1 имеет излом в нуле и способна занулять коэффициенты. Elastic Net сочетает разреженность L1 со стабильностью L2 при коррелированных признаках. Early stopping прекращает движение до того, как модель подстроится под мелкие особенности train. Bias–variance — не выбор «одного добра»: оптимум балансирует систематическую ошибку, изменчивость и неустранимый шум. ## Определения и обозначения Для параметров \(\mathbf w\in\mathbb R^d\): \[ J(\mathbf w)=\hat R(\mathbf w)+ \lambda_1\|\mathbf w\|_1+ \frac{\lambda_2}{2}\|\mathbf w\|_2^2. \] L1: \(\lambda_1>0,\lambda_2=0\); L2: наоборот; Elastic Net: обе положительны. Смещение \(b\) обычно не штрафуют. В sklearn параметр `alpha` может обозначать общую силу штрафа, а `l1_ratio` — долю L1; соглашения о множителях различаются. ## Вывод ключевых формул Для ridge-регрессии \[ J(\mathbf w)=\frac1{2n}\|\mathbf X\mathbf w-\mathbf y\|_2^2+ \frac\lambda2\|\mathbf w\|_2^2. \] Градиент: \[ \nabla J=\frac1n\mathbf X^\top(\mathbf X\mathbf w-\mathbf y)+\lambda\mathbf w. \] Приравнивая нулю, \[ (\mathbf X^\top\mathbf X+n\lambda\mathbf I)\mathbf w =\mathbf X^\top\mathbf y. \] Добавка к диагонали улучшает обусловленность и даёт единственное решение при \(\lambda>0\), но вычислять обратную матрицу явно не следует — используют линейный решатель. Для одномерного L1 и квадратичной потери \[ \min_w\frac12(w-z)^2+\lambda|w|. \] При \(w>0\): \(w-z+\lambda=0\), значит \(w=z-\lambda\), допустимо при \(z>\lambda\). При \(w<0\): \(w=z+\lambda\), допустимо при \(z<-\lambda\). В нуле субградиент \(\partial|w|=[-1,1]\). Итого soft-threshold: \[ w^\star=\operatorname{sign}(z)\max(|z|-\lambda,0). \] Это объясняет точные нули L1. Для квадратичной ошибки прогноза в точке \(\mathbf x\), усреднённой по возможным train-выборкам: \[ \mathbb E[(Y-\hat f(\mathbf x))^2] =\sigma_\varepsilon^2+ (\mathbb E\hat f(\mathbf x)-f(\mathbf x))^2+ \mathbb E[(\hat f(\mathbf x)-\mathbb E\hat f(\mathbf x))^2]. \] Слагаемые — шум, bias² и variance. ## Разобранный пример **Дано.** Ортогональный признак даёт ненормированный коэффициент \(z=0{,}8\), \(\lambda=0{,}3\). **Решение.** L1: \(w=0{,}8-0{,}3=0{,}5\). Для сопоставимой одномерной L2-задачи \(\frac12(w-z)^2+\frac\lambda2w^2\): \(w-z+\lambda w=0\), поэтому \(w=z/(1+\lambda)=0{,}8/1{,}3\approx0{,}615\). Если \(z=0{,}2\), L1 даст ноль, L2 — \(0{,}154\). **Проверка:** L1 создаёт разреженность, L2 только сжимает конечный коэффициент. ## Связь с Python и sklearn ```python import numpy as np from sklearn.datasets import make_regression from sklearn.linear_model import ElasticNet, Ridge from sklearn.model_selection import train_test_split from sklearn.pipeline import make_pipeline from sklearn.preprocessing import StandardScaler from sklearn.metrics import mean_squared_error X, y = make_regression(n_samples=600, n_features=30, n_informative=6, noise=20, random_state=42) X_tr, X_va, y_tr, y_va = train_test_split( X, y, test_size=0.3, random_state=42 ) for model in [ Ridge(alpha=10.0), ElasticNet(alpha=0.1, l1_ratio=0.7, max_iter=20_000) ]: pipe = make_pipeline(StandardScaler(), model) pipe.fit(X_tr, y_tr) pred = pipe.predict(X_va) coef = pipe[-1].coef_ print(type(model).__name__, mean_squared_error(y_va, pred), "zeros", np.sum(np.isclose(coef, 0))) ``` Масштабирование находится внутри pipeline, поэтому оценивается только по train. `alpha` выбирают кросс-валидацией, а test оставляют для единственной итоговой оценки. ## Early stopping После каждой эпохи измеряют validation loss, сохраняют лучшие параметры и останавливаются, если улучшения больше `min_delta` нет `patience` эпох. Возвращать нужно лучшую сохранённую модель, а не последнюю. Validation-набор участвует в выборе времени остановки и больше не является независимым test. В линейных итерационных задачах ранняя остановка подавляет направления, которые обучаются медленно, и действует как неявная регуляризация. ## Типичные ошибки и ограничения - Применять штраф до масштабирования: коэффициенты разных единиц штрафуются несопоставимо. - Штрафовать intercept без причины. - Выбирать \(\lambda\) по test или preprocessing до разбиения — leakage. - Считать L1 надёжным селектором среди сильно коррелированных признаков; выбор может быть нестабилен. - Отождествлять малый коэффициент с малой причинной важностью. - Останавливать по шумной train-метрике или не восстанавливать лучший checkpoint. - Думать, что регуляризация исправляет неверные признаки, сдвиг распределения или плохую разметку. ## Краткое резюме - L2 стабильно сжимает веса, L1 создаёт точные нули, Elastic Net сочетает свойства. - Ridge добавляет \(\lambda\mathbf I\) к кривизне. - Early stopping требует отдельной validation-метрики и сохранения лучшей модели. - Сила регуляризации выбирает баланс bias–variance по данным. ## Связанные материалы - Практика: [`../assignments/03_regularization.md`](../assignments/03_regularization.md). - Оптимизаторы: [`02_optimizers.md`](02_optimizers.md). - Pipeline без leakage: [`../../05_data_and_visualization/notes/03_feature_engineering_pipelines_leakage.md`](../../05_data_and_visualization/notes/03_feature_engineering_pipelines_leakage.md). - Термины: [`glossary.md`](glossary.md).