Course
Итак, вы обучили модель, которая почти идеально предсказывает на обучающей выборке, но проваливается на новых данных? Мы все через это проходили.
Это и есть высокоуровневое определение переобучения. Модель не выучила реальную закономерность, а просто запомнила обучающие данные. В продакшене, где появляются новые и невиданные ранее данные, такая модель будет давать прогнозы, которым вы не доверяете. Чем сильнее реальные данные расходятся с обучающими, тем хуже результат.
Регуляризация решает эту проблему, добавляя штраф к функции потерь. Этот штраф препятствует излишней сложности модели. Иными словами, это механизм, который не даёт модели подгоняться под каждую точку данных и заставляет её обобщать.
В этой статье я объясню интуицию регуляризации, наиболее распространённые методы — L1, L2 и Elastic Net — и как выбрать подходящий для вашей задачи.
Если вы хотите понять, почему и как модели машинного обучения проваливаются в продакшене, прочитайте наш пост Компромисс между смещением и разбросом.
Что такое регуляризация в машинном обучении
Регуляризация — это приём, при котором к функции потерь добавляется штрафной член, сдерживающий сложность модели.
Без штрафного члена модель достаточно гибкая, чтобы подогнаться под обучающие данные как угодно тесно — включая шум и выбросы. Регуляризация вводит цену за такую гибкость. Чем сложнее стремится стать модель, тем выше штраф.
Обычная функция потерь модели измеряет разницу между предсказанными и истинными значениями. Регуляризация добавляет к этому уравнению дополнительный член, который растёт по мере увеличения коэффициентов модели. Теперь модель должна балансировать между двумя целями: хорошо подойти к обучающим данным и держать коэффициенты маленькими.
Именно этот баланс управляет гибкостью модели.
Слишком гибкая модель может «выкрутиться» в любую форму, чтобы подогнаться под обучающие данные. Регуляризация сглаживает её до более простой формы — той, которая с большей вероятностью сохранится на невиданных раньше данных.
Зачем нужна регуляризация
Любая обучаемая вами модель находится где-то между двумя непригодными моделями: слишком простой и слишком сложной.
Слишком простая модель не «видит» настоящих закономерностей в данных. Она упускает сигнал. Это недообучение — модель показывает плохие результаты и на обучении, и на новых данных.
Слишком сложная модель делает наоборот. Она подгоняется под каждую мелочь в обучающих данных, включая шум. Это переобучение — модель отлично работает на обучении, но проваливается на новых данных, потому что запомнила не то.
Возьмём полиномиальную регрессию как конкретный пример. Полином степени 3, проведённый через данные с плавной кривой, скорее всего уловит правильную закономерность. Но полином степени 15 на тех же данных приведёт к переобучению — кривая проходит через каждую точку, но делает случайные предсказания между ними.
Диаграмма ниже показывает, как это выглядит на практике.

Модель нужной сложности и слишком сложная модель
Это и есть компромисс между смещением и разбросом.
Простые модели имеют высокое смещение — они делают сильные допущения и пропускают реальные паттерны. Сложные модели имеют высокий разброс — они слишком чувствительны к конкретным обучающим выборкам, и небольшие изменения данных приводят к очень разным моделям.
Регуляризация помогает получить лучшее из обоих миров. Она не устраняет сложность полностью, но наказывает её. В результате у модели больше шансов выучить настоящий сигнал.
Как работает регуляризация
Любая модель обучается, минимизируя функцию потерь — меру того, насколько её предсказания ошибочны. Без регуляризации единственная задача модели — минимизировать эту ошибку. Она сделает всё возможное, включая разрастание коэффициентов, чтобы подогнаться под обучающие данные, но не обобщать.
Регуляризация меняет целевую функцию. Вместо минимизации одной лишь ошибки модель теперь минимизирует следующее:

Как работает регуляризация
Штрафной член — это функция коэффициентов модели. Большие коэффициенты увеличивают штраф. Чтобы держать общую стоимость низкой, модель вынуждена удерживать коэффициенты маленькими — а значит, находить более простые и лучше обобщающие решения.
Параметр λ (лямбда) определяет, насколько важен штраф. Большая λ сильнее подталкивает модель к простоте. Меньшая λ позволяет модели больше сосредоточиться на подгонке данных. Ниже, в разделе «Выбор силы регуляризации», вы увидите, как это настраивать.
Виды регуляризации в машинном обучении
Есть несколько способов штрафовать сложность модели. Каждый по-разному воздействует на коэффициенты, поэтому лучше подходит для разных ситуаций.
Регуляризация L2 (регрессия Ridge)
L2 штрафует квадрат значения каждого коэффициента. Чем больше коэффициент, тем сильнее он увеличивает штраф — и тем активнее модель старается его уменьшить.

Регуляризация L2
Ключевое слово здесь — «сжимает». L2 тянет все коэффициенты к нулю, но почти никогда не доводит их до точного нуля. Все признаки остаются в модели, просто с меньшими весами. Поэтому Ridge — хороший выбор по умолчанию, когда вы считаете, что большинство признаков релевантны, и хотите стабильную, предсказуемую модель.
Регуляризация L1 (регрессия Lasso)
L1 штрафует абсолютное значение каждого коэффициента, а не квадрат.

Регуляризация L1
Эта небольшая разница имеет большой эффект. L1 может «дожимать» коэффициенты до точного нуля, то есть исключать признаки из модели. Это можно считать автоматическим отбором признаков. Иными словами, Lasso может упростить модель, удаляя нерелевантные признаки.
Регуляризация L1 против L2
Ключевое различие — разреженность. L1 даёт разреженные модели — в модель попадает только часть признаков. L2 даёт плотные модели — все признаки остаются, но с меньшими весами.
Это влияет и на интерпретируемость. Модель Lasso с 5 активными признаками проще объяснить, чем Ridge с 50 признаками, каждый из которых немного влияет. Но Ridge обычно стабильнее, если признаки коррелированы между собой: он распределяет вес между ними, а не выбирает один произвольно.
Краткий обзор различий:

L1 против L2
Если хотите сравнить их в Python, посмотрите наш туториал по Lasso и Ridge в Python.
Регуляризация Elastic Net
Elastic Net объединяет L1 и L2 в один штрафной член.

Регуляризация Elastic Net
Идея — получить лучшее от обоих: отбор признаков у L1 и стабильность у L2. Это полезно, когда признаки коррелированы, но вы всё равно хотите часть из них отбросить. Одна лишь Lasso склонна выбирать один признак из группы коррелированных и игнорировать остальные. Elastic Net чаще сохраняет несколько из них, при этом убирая нерелевантные.
Регуляризация в разных моделях
Регуляризация встречается во многих моделях машинного обучения, но в разных формах. Давайте посмотрим, каких.
Линейная регрессия — где большинство впервые сталкивается с регуляризацией. Добавив L2 к линейной регрессии, вы получаете Ridge, добавив L1 — Lasso. Математика та же, что описана выше: штрафной член добавляется к методу наименьших квадратов.
Логистическая регрессия работает аналогично. Функция потерь меняется — это кросс-энтропия вместо квадратичной ошибки — но штрафной член идентичен. В большинстве библиотек по умолчанию к логистической регрессии применяется L2, поэтому в scikit-learn вы увидите параметр C. Это обратная величина к λ, так что меньшее C означает более сильную регуляризацию.
Нейронные сети используют пару разных подходов:
- Weight decay: L2-регуляризация, применённая к весам сети — работает так же, только в куда большем масштабе
- Dropout: во время обучения случайно отключает долю нейронов на каждом проходе, что мешает сети чрезмерно полагаться на какой-то один путь через слои.
Оба метода уменьшают переобучение, но разными способами.
Деревья решений вообще не используют штрафы в функции потерь. Вместо этого они контролируют сложность через «обрезку» — ограничивая глубину дерева или удаляя ветви, которые недостаточно улучшают качество предсказаний. Такие гиперпараметры, как max_depth и min_samples_split в scikit-learn — это параметры регуляризации, даже если они так не называются.
Регуляризация и компромисс смещения-разброса
Регуляризация — это всегда компромисс.
Добавляя штрафной член, вы ограничиваете возможности модели. Она больше не может настолько плотно подгоняться под обучающие данные. Это ограничение вносит смещение — модель по замыслу делает немного неверные допущения, потому что вы велели ей быть проще.
Но то же ограничение снижает разброс. Модель, которая не может подогнаться под каждую точку, менее чувствительна к конкретной обучающей выборке. Обучив её на слегка других данных, вы получите похожий результат. Эта стабильность и нужна, чтобы модель не проваливалась в продакшене.
Без регуляризации вы получаете очень гибкую модель с низким смещением (мало допущений и отличная подгонка обучающих данных) и высоким разбросом (небольшие изменения обучающих данных дают очень разные модели, то есть ей нельзя доверять на новых данных).
Регуляризация сдвигает баланс. Небольшое увеличение смещения в обмен на сильное снижение разброса обычно даёт лучшую работу на невиданных данных. Это компромисс, и почти всегда оправданный.
Выбор силы регуляризации
Как специалисту по машинному обучению, вам предстоит задать силу регуляризации после выбора её типа.
Эта сила управляется гиперпараметром — обычно это lambda (λ) в математической записи или alpha в scikit-learn. Это множитель перед штрафным членом. Меняя его, вы меняете, насколько сильно модель подталкивается к простоте.
Если ошибиться в любую сторону, в продакшене возникнут проблемы:
- Слишком низкая: штраф слишком слаб, чтобы иметь значение. Модель переобучается, как будто регуляризации нет вовсе.
- Слишком высокая: штраф доминирует. Модель настолько зажата, что не может уловить реальные закономерности. Это недообучение.
Правильное значение находится где-то посередине, и универсального ответа нет. Всё зависит от ваших данных, модели и уровня шума.
Стандартный способ поиска — кросс-валидация. Вы делите обучающие данные на фолды, обучаете модель на разных их комбинациях и измеряете валидационное качество для набора значений alpha. Значение, дающее лучшую среднюю валидационную метрику, и берёте.
В scikit-learn RidgeCV и LassoCV делают это автоматически — проводят кросс-валидацию по сетке значений alpha и выбирают лучшее.
from sklearn.linear_model import RidgeCV
model = RidgeCV(alphas=[0.01, 0.1, 1.0, 10.0], cv=5)
model.fit(X_train, y_train)
print(model.alpha_)
Выведенное значение alpha покажет лучший результат по кросс-валидации. Начните с широкого диапазона, а затем сузьте его, когда поймёте, где находится оптимум.
Итоги
Регуляризация — это способ не дать модели быть «слишком умной» во вред самой себе.
Она штрафует сложность, заставляя модель находить решения, которые обобщают, а не запоминают обучающие данные. L2 сохранит все признаки и снизит их влияние. L1 удалит нерелевантные признаки. Elastic Net объединяет оба подхода. И в линейных моделях, логистической регрессии, нейросетях и ансамблевых моделях эта идея проявляется в разных формах, и не всегда называется «регуляризацией».
Самое важное — выбранная техника и заданная сила. Поэтому экспериментируйте. Пробуйте разные подходы с разными значениями параметров. Не останавливайтесь на первом попавшемся варианте.
Ваши данные подскажут, что работает.
Если хотите увидеть больше техник регуляризации в деле, запишитесь на наш трек Machine Learning Scientist in Python. В нём 85 часов материалов, которые помогут вам подготовиться к работе.
FAQs
Что такое регуляризация в машинном обучении?
Регуляризация — это приём, при котором к функции потерь модели добавляется штрафной член, ограничивающий сложность. Она предотвращает переобучение, заставляя модель держать коэффициенты маленькими, что приводит к более простым решениям, лучше обобщающимся на новые данные.
Когда мне использовать регуляризацию?
Используйте регуляризацию всякий раз, когда модель хорошо работает на обучающих данных, но плохо — на валидационных или тестовых. Такой разрыв — признак переобучения. Это также хорошая практика по умолчанию при работе с высокоразмерными данными или когда число признаков сопоставимо или превышает число наблюдений.
Всегда ли регуляризация улучшает качество модели?
Не всегда. Если ваша модель уже недообучена, добавление регуляризации лишь усугубит ситуацию, ещё больше упрощая решения. Важно найти баланс — регуляризация помогает, когда модель слишком сложна, а не когда она слишком проста.
В чём разница между alpha в Lasso и C в логистической регрессии?
Оба параметра управляют силой регуляризации, но действуют в противоположных направлениях. alpha в Lasso масштабирует штраф: большее значение — сильнее регуляризация. C в логистической регрессии scikit-learn — это величина, обратная силе штрафа, поэтому меньшее C означает более сильную регуляризацию. Если переключаетесь между ними, помните: увеличение alpha и уменьшение C дают одинаковый эффект.
Можно ли использовать регуляризации L1 и L2 вместе?
Да — именно это делает Elastic Net. Он объединяет оба штрафных члена в одной целевой функции, одновременно давая отбор признаков L1 и стабильность L2. Это полезно, когда признаки коррелированы, но вы всё же хотите немного «проредить» их: одна лишь Lasso обычно произвольно оставляет один признак из коррелированной группы, а остальные отбрасывает.