Машинное обучение

Регуляризация: L1, L2, ElasticNet

От некорректных задач к отбору признаков

Регуляризация появилась задолго до машинного обучения. В 1943 году советский математик Андрей Тихонов ввёл стабилизирующий штраф для решения некорректных обратных задач - именно эту идею мы сегодня знаем как регуляризацию Тихонова (L2-штраф). В 1970 году Артур Хоэрл и Роберт Кеннард перенесли её в статистику под названием ridge regression, укротив неустойчивые коэффициенты, вызванные мультиколлинеарностью. А в 1996 году Роберт Тибширани опубликовал LASSO, заменив квадратичный штраф на штраф по модулю - так веса смогли обнуляться полностью. Эта одна замена превратила регуляризацию в инструмент отбора признаков и изменила подход к построению моделей в высоких размерностях.

Полиномиальная регрессия 20-й степени на обучающих данных показывает идеальный результат - ошибка почти ноль. Но на новых данных модель выдаёт абсурд: предсказывает отрицательную цену дома и зарплату в миллиард. Веса модели раздулись до тысяч и миллионов, пытаясь пройти через каждую точку. Как сделать модель разумной, не отказываясь от сложных признаков? Что если добавить в функцию потерь штраф за большие веса?

  • **Netflix рекомендательная система** использует ElasticNet регуляризацию при обучении на матрице из 200+ млн пользователей и тысяч фильмов - без неё модель запоминала бы шум в рейтингах вместо реальных предпочтений
  • **Геномика:** при анализе связи генов с заболеваниями Lasso отбирает 50--100 значимых генов из 20 000+, делая результат интерпретируемым для врачей и экономя годы лабораторных проверок
  • **Финансовый скоринг** в банках использует Ridge регуляризацию, чтобы модель оценки кредитного риска не переобучалась на исторических данных кризисных периодов и стабильно работала в новых экономических условиях

Предварительные знания

  • Polynomial Regression

L2 регуляризация (Ridge)

В предыдущем уроке мы видели, как полиномиальная регрессия высокой степени идеально проходит через все точки обучающей выборки, но выдаёт абсурдные предсказания на новых данных. Причина - **слишком большие веса**: модель подстраивает коэффициенты с огромными значениями (тысячи, миллионы), чтобы пройти через каждую точку. Регуляризация решает эту проблему, добавляя **штраф за большие веса** прямо в функцию потерь.

**Ridge regression** (L2 регуляризация) - самый простой вид регуляризации. Идея: к обычной функции потерь MSE добавляется слагаемое, которое растёт при увеличении весов. Модель теперь оптимизирует компромисс - одновременно минимизирует ошибку на данных *и* держит веса маленькими.

Почему квадрат весов? L2 штраф наказывает большие веса **непропорционально сильнее** маленьких. Вес 10 получает штраф 100, а вес 100 - штраф 10 000. Это заставляет модель **равномерно сжимать** все веса к нулю, но не обнулять полностью. Результат: вместо одного огромного веса w=5000 и одного маленького w=0.001, Ridge создаёт два умеренных: w=15 и w=12.

**Мультиколлинеарность и Ridge.** Когда признаки сильно коррелированы (например, площадь дома в м2 и площадь в ft2), обычная линейная регрессия выдаёт нестабильные веса: малейшее изменение данных кардинально меняет коэффициенты. Ridge решает эту проблему - L2 штраф стабилизирует решение, распределяя веса между коррелированными признаками.

Что происходит с весами модели при добавлении L2 регуляризации (Ridge)?

L1 регуляризация (Lasso)

Ridge сжимает все веса, но оставляет их ненулевыми. А что, если у нас 500 признаков, и только 20 из них реально важны? Было бы полезно, чтобы модель сама *выбросила* ненужные, поставив их веса в точный ноль. Именно это делает **Lasso** (Least Absolute Shrinkage and Selection Operator) - L1 регуляризация.

Почему модуль обнуляет веса, а квадрат - нет? Дело в градиенте. Производная w^2 = 2w, и она стремится к нулю вместе с весом: чем меньше w, тем слабее штраф тянет его к нулю. Поэтому Ridge замедляется и никогда не дотягивает вес до точного нуля. Производная |w| = sign(w) - это *константа* (+1 или -1), не зависящая от величины w. Штраф тянет к нулю с одинаковой силой, будь вес 1000 или 0.001. Поэтому Lasso доводит маленькие веса до точного нуля.

**Ограничение Lasso:** если признаки сильно коррелированы (мультиколлинеарность), Lasso произвольно выбирает один из группы, а остальные обнуляет. Какой именно - зависит от случайности в данных. Поэтому Lasso нестабилен при коррелированных признаках: на разных подвыборках он выбирает разные признаки из коррелированной группы.

**Sparse models в продакшене.** Lasso создаёт *разреженные* (sparse) модели - из сотен или тысяч признаков остаётся несколько десятков. Это ценно не только для интерпретируемости, но и для скорости: модель с 10 признаками предсказывает в 50 раз быстрее, чем с 500. В real-time системах (реклама, fraud detection) каждая миллисекунда на счету.

Почему Lasso (L1) обнуляет некоторые веса, а Ridge (L2) - нет?

ElasticNet: комбинация L1 и L2

Ridge стабилен, но не делает feature selection. Lasso делает feature selection, но нестабилен при коррелированных признаках. **ElasticNet** объединяет оба подхода: добавляет L1 *и* L2 штраф одновременно, получая лучшее от обоих миров.

Главное преимущество ElasticNet над чистым Lasso проявляется при **группах коррелированных признаков**. Допустим, три признака x1, x2, x3 сильно коррелированы и все полезны. Lasso произвольно выберет один (скажем, x1) и обнулит x2 и x3. ElasticNet благодаря L2 компоненте распределит веса между всеми тремя: w1=0.4, w2=0.35, w3=0.38 - стабильнее и интерпретируемее.

**Когда что использовать:** - **Ridge** - если все признаки потенциально важны и нужна стабильная модель. Типичный выбор по умолчанию. - **Lasso** - если большинство признаков предположительно бесполезны и нужен автоматический отбор. Хорош для интерпретируемости. - **ElasticNet** - если признаков много, часть из них коррелированы, и нужен баланс между отбором и стабильностью. Лучший выбор при неопределённости.

На практике ElasticNet c l1_ratio в диапазоне 0.1--0.5 часто работает лучше чистого Lasso. Библиотека glmnet (R) и sklearn (Python) используют ElasticNet как обобщение: Ridge и Lasso - просто частные случаи с l1_ratio=0 и l1_ratio=1.

Три признака x1, x2, x3 сильно коррелированы между собой, и все три влияют на целевую переменную. Какой метод регуляризации лучше справится с этой ситуацией?

Подбор lambda (alpha)

Мы узнали три типа регуляризации, но ключевой вопрос остался открытым: **как выбрать значение lambda?** Этот гиперпараметр (в sklearn называется alpha) управляет балансом между подгонкой к данным и простотой модели. Слишком маленький lambda - регуляризация не работает, overfitting. Слишком большой - модель игнорирует данные, underfitting.

Золотой стандарт подбора lambda - **cross-validation** (перекрёстная проверка). Данные делятся на K частей (folds). Для каждого значения lambda модель K раз обучается на K-1 частях и проверяется на оставшейся. Выбирается lambda с наименьшей средней ошибкой валидации. В sklearn это делается автоматически.

**Стандартизация обязательна!** Регуляризация штрафует веса по абсолютной величине. Если признак "зарплата" в диапазоне 30000--200000, а "возраст" - 18--80, то вес зарплаты будет в тысячи раз меньше просто из-за масштаба, и регуляризация накажет его несправедливо слабо. Всегда используйте StandardScaler *перед* регуляризацией, чтобы все признаки были в одном масштабе.

Чем сильнее регуляризация (больше lambda), тем лучше модель - нужно ставить lambda как можно больше, чтобы избежать overfitting

Слишком сильная регуляризация приводит к underfitting - модель становится слишком простой и не улавливает реальные закономерности в данных. Оптимальный lambda находится через cross-validation и зависит от конкретного датасета

Регуляризация - это не "чем больше, тем лучше", а баланс. При lambda = 0 модель переобучается, при lambda -> infinity все веса = 0 и модель ничего не предсказывает. Оптимум где-то посередине, и единственный надёжный способ его найти - перекрёстная проверка (cross-validation)

Что произойдёт, если установить lambda (alpha) = 0 в Ridge или Lasso?

Ключевые идеи

  • **Ridge (L2)** добавляет штраф SUM(w_i^2) - равномерно сжимает все веса к нулю, но не обнуляет; стабилен при мультиколлинеарности
  • **Lasso (L1)** добавляет штраф SUM(|w_i|) - обнуляет неважные веса полностью, выполняя автоматический feature selection; нестабилен при коррелированных признаках
  • **ElasticNet** комбинирует L1 и L2, параметр l1_ratio управляет балансом; лучший выбор при неопределённости и коррелированных признаках
  • **lambda (alpha)** - гиперпараметр силы регуляризации: 0 = overfitting, infinity = underfitting; оптимум находят через cross-validation (RidgeCV, LassoCV, ElasticNetCV)
  • Регуляризация - это ответ на вопрос "как обуздать жадность модели": штраф за большие веса не даёт полиномиальной регрессии раздувать коэффициенты до абсурда, как мы обсуждали в начале

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

Регуляризация - центральная идея в ML, связывающая линейные модели с глубоким обучением и feature engineering:

  • Линейная регрессия — Базовая модель, к которой Ridge, Lasso и ElasticNet добавляют штрафные слагаемые для борьбы с overfitting
  • Полиномиальная регрессия — Показала проблему overfitting при высокой степени полинома - именно её решает регуляризация, не убирая признаки, а ограничивая веса
  • Градиентный спуск — Метод оптимизации, которым на практике обучаются Ridge, Lasso и ElasticNet при больших данных (вместо аналитического решения)
  • Feature Engineering — Lasso и ElasticNet автоматически отбирают признаки - это часть процесса feature engineering, где ручной и автоматический отбор дополняют друг друга

Вопросы для размышления

  • Если Lasso обнулил 95 из 100 признаков, значит ли это, что обнулённые признаки бесполезны? Или они могли быть обнулены из-за корреляции с оставшимися?
  • В нейронных сетях с миллионами параметров тоже используется регуляризация (L2 = weight decay). Почему dropout считается альтернативой L2 регуляризации, хотя работает совсем по-другому?
  • Стандартизация признаков обязательна перед регуляризацией. Но если применить StandardScaler, теряется интерпретируемость весов в исходных единицах. Как решить эту дилемму?

Связанные уроки

  • ml-06-linear-regression — Ridge и Lasso - расширения линейной регрессии с штрафом
  • ml-07-polynomial-regression — Overfitting при сложных моделях - главный мотив регуляризации
  • ml-09-gradient-descent — Регуляризированные модели оптимизируются градиентным спуском
  • stat-03-mle
  • cvx-01
Регуляризация: L1, L2, ElasticNet

0

1

Войти