Регуляризация L1 vs L2 на собеседовании Data Scientist

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Зачем регуляризация

Регуляризация — добавление штрафа за сложность модели в loss-функцию. Без неё линейная регрессия на 100 признаках с 50 наблюдениями уверенно переобучится: на трейне MSE = 0, на тесте — ужас.

Главная боль без регуляризации — модель идеальная на трейне, бесполезная на проде. Решение «больше данных» — не всегда возможно. Решение «выкинуть половину фич» — теряем сигнал. Регуляризация даёт компромисс: оставить все признаки, но «придавить» коэффициенты.

На собесе DS L1/L2 спрашивают почти всегда. Уровень от «что такое регуляризация» (junior) до «почему L1 порождает sparse-модель геометрически» (middle+).

L2 (Ridge)

L2-регуляризация добавляет к loss квадрат нормы коэффициентов:

Loss = MSE + λ · Σ wᵢ²

λ — гиперпараметр силы регуляризации. λ=0 — обычная регрессия. λ→∞ — все коэффициенты к нулю.

Эффект: все коэффициенты уменьшаются, но не зануляются. Это shrinkage — «усадка» коэффициентов.

Когда полезно:

  • Мультиколлинеарность (сильно скоррелированные признаки)
  • Признаков много, но все примерно одинаково информативны
  • Хочется устойчивую модель без отбора признаков

Аналитическое решение для линейной регрессии:

w = (XᵀX + λI)⁻¹ Xᵀy

Добавление λI делает матрицу XᵀX + λI обратимой даже при мультиколлинеарности — это второй практический плюс L2.

В sklearn:

from sklearn.linear_model import Ridge
model = Ridge(alpha=1.0)  # alpha = λ
model.fit(X_train, y_train)

L1 (Lasso)

L1-регуляризация — модуль вместо квадрата:

Loss = MSE + λ · Σ |wᵢ|

Эффект: коэффициенты не только уменьшаются, но и зануляются при достаточно большом λ. Получается sparse-модель — часть признаков буквально удалена из неё.

Когда полезно:

  • Признаков много, нужен отбор
  • Интерпретируемость важна (модель из 5 признаков понятнее, чем из 500)
  • Подозреваем, что только часть признаков релевантна

Минусы:

  • При сильно скоррелированных признаках Lasso «случайно» выбирает один из группы (не предсказуемо)
  • Нет аналитического решения, нужен оптимизатор (coordinate descent)

В sklearn:

from sklearn.linear_model import Lasso
model = Lasso(alpha=0.1)
model.fit(X_train, y_train)
print(np.sum(model.coef_ != 0))  # сколько фич осталось

Почему L1 даёт sparsity

Геометрический ответ — самый частый вопрос на собесе.

Регуляризация — это задача оптимизации с ограничением: минимизировать MSE при ограничении нормы w.

  • L2: ограничение Σ wᵢ² ≤ C — это круг (в 2D) или сфера в N-мерном.
  • L1: ограничение Σ |wᵢ| ≤ C — это ромб (в 2D), вершины на осях.

Кривая постоянного MSE — эллипс. Решение задачи — точка касания эллипса с областью допустимых значений.

  • С кругом (L2) точка касания почти всегда не на оси → коэффициенты ненулевые, но маленькие.
  • С ромбом (L1) точка касания часто в вершине ромба → коэффициент по этой оси нулевой.

Это и есть «L1 даёт sparse» — геометрически ромб «цепляется» углами, в этих точках одна или несколько координат равны нулю.

Альтернативное объяснение через производную: производная |w| в точке 0 разрывна (subgradient), поэтому оптимизатор может «остановиться» строго на нуле. Производная в нуле = 0 — оптимизатор «проскакивает», коэффициент уменьшается, но не зануляется.

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

ElasticNet

Комбинация L1 и L2:

Loss = MSE + λ · [α · Σ |wᵢ| + (1-α) · Σ wᵢ²]

α — баланс между L1 и L2. α=1 — Lasso, α=0 — Ridge.

Когда: скоррелированные группы признаков, нужен отбор, но Lasso ведёт себя плохо.

ElasticNet выбирает группу скоррелированных признаков целиком (не «случайно одного»), что предсказуемее Lasso.

from sklearn.linear_model import ElasticNet
model = ElasticNet(alpha=0.1, l1_ratio=0.5)  # l1_ratio = α

Когда что выбирать

Кейс Выбор
Все признаки релевантны, мультиколлинеарность Ridge
Признаков сотни, нужен отбор Lasso
Скоррелированные группы признаков, нужен отбор ElasticNet
Хочется простую интерпретируемую модель Lasso
Стабильность важнее sparsity Ridge
Не уверены ElasticNet с CV по α и λ

Подбор λ:

  • Cross-validation (RidgeCV, LassoCV, ElasticNetCV в sklearn)
  • Поиск по логарифмической сетке: np.logspace(-4, 2, 50)
  • Брать λ с минимальной CV-ошибкой или «1-SE rule» (большее λ в пределах одной стандартной ошибки от минимума — более устойчивая модель)

Частые ошибки

Не нормировать признаки. L1/L2 штрафуют коэффициенты — но коэффициент для «зарплата в рублях» в миллион раз больше, чем для «возраст в годах». Без нормировки регуляризация неравноправна. Перед Ridge/Lasso — StandardScaler.

Применять регуляризацию к intercept. Свободный член (b) обычно не штрафуют — он отражает базовый уровень. В sklearn по умолчанию intercept не регуляризуется (fit_intercept=True отдельно от регуляризации).

Lasso на скоррелированных признаках. Lasso выберет один признак из группы, остальные занулит. На разных folds — разные «победители». Нестабильность интерпретации.

Считать, что регуляризация заменяет EDA. Регуляризация поможет, если модель переобучается. Не поможет, если в данных шум, утечки, неверная спецификация.

λ от балды. Без CV выбирают λ «средненькое значение из примера». Подбирать через LassoCV/RidgeCV с cv=5.

Регуляризация в дереве. Дерево/RF/бустинги имеют свои механизмы регуляризации (max_depth, min_samples_leaf, learning_rate). L1/L2 — для линейных и нейросетей.

Регуляризация в нейросетях через L2 без bias decay. Стандартный L2 в torch.optim — weight_decay. Часто корректно — не штрафовать bias и normalization-параметры.

Связанные темы

FAQ

Что больше штрафует — L1 или L2?

Зависит от значений коэффициентов. При маленьких wᵢ (< 1) wᵢ² < |wᵢ| — L2 штрафует слабее. При больших wᵢ (> 1) — L2 штрафует сильнее. Поэтому L2 «больше давит» на крупные коэффициенты, L1 — равномерно по всем.

Можно ли использовать L1 в нейросети?

Можно (через weight_decay или ручной штраф), но обычно используют L2. L1 в нейросетях даёт sparsity на уровне весов, что само по себе бесполезно — нейросеть не становится меньше. Полезные приходящие на смену технологии — pruning и distillation.

Какая дефолтная альфа в sklearn для Ridge?

alpha=1.0. Не значит, что подходит — всегда подбирать через CV. Для нормированных признаков диапазон поиска обычно 1e-4 … 100.

Регуляризация — это то же, что dropout?

Концептуально похоже (борьба с переобучением), технически разное. Dropout случайно выключает нейроны при тренировке — это стохастическая регуляризация. L1/L2 — добавка к loss, детерминистическая.

Что такое early stopping и регуляризация?

Early stopping — остановка обучения, когда валидационная ошибка перестаёт улучшаться. Это форма регуляризации (ограничение «времени» обучения), но не L1/L2. На практике — комбинируют: L2 + early stopping, дополняют друг друга.

Это официальная информация?

Нет. Статья основана на классических работах по регуляризации (Tibshirani 1996 для Lasso, Hoerl-Kennard 1970 для Ridge, Zou-Hastie 2005 для ElasticNet) и документации sklearn.


Тренируйте Data Science — откройте тренажёр с 1500+ вопросами для собесов.