Если говорить совсем практично, L1 нужна там, где признаков много, часть из них шумная, часть дублирует друг друга, а модель хочется сделать не только точной, но и компактной. В 2026 году это по-прежнему актуально: табличные модели, линейные модели для NLP, кредитный скоринг, интерпретируемые risk-модели, классический ML на широких feature spaces и даже некоторые прокси-задачи в production, где важны простота и устойчивость.
Очень полезно думать о L1 не как о “математическом аксессуаре”, а как о способе заставить модель быть строже к самой себе. Без регуляризации модель легко начинает использовать слишком много признаков, даже если их вклад сомнителен. С L1 она получает стимул оставлять только то, что действительно оправдывает своё существование. Это особенно хорошо чувствуется, если до этого уже было интуитивно понятно, что такое overfitting и почему модель начинает цепляться за шум.
Почему вообще возникает проблема слишком больших и лишних коэффициентов
Когда модель минимизирует только ошибку на обучении, она часто готова использовать почти любую структуру в данных. Если признаков много, если среди них есть шум, если часть признаков коррелирует друг с другом, модель может “размазать” решение по большому числу коэффициентов. Формально loss уменьшается, но модель становится менее устойчивой, хуже переносится на новые данные и труднее интерпретируется.
Регуляризация появляется именно как ответ на эту проблему. Мы говорим модели: мало просто хорошо объяснить train. Нужно сделать это ещё и достаточно экономно. То есть не использовать слишком сложное решение, если более простое почти не хуже.
Главная идея L1: штраф за сумму модулей коэффициентов
L1-регуляризация добавляет к основной функции потерь штраф, пропорциональный сумме абсолютных значений параметров. Это выглядит компактно, но именно эта форма и создаёт знаменитую склонность к sparsity.
(\mathcal{L}(\mathbf{w}) = \mathcal{L}_{data}(\mathbf{w}) + \lambda \sum_{j=1}^{p} |w_j|)
Раздел математики: теория оптимизации и линейная алгебра.
Что означает каждый символ:
(\mathcal{L}(\mathbf{w})) — полная функция потерь модели с регуляризацией.
(\mathcal{L}_{data}(\mathbf{w})) — исходная потеря по данным: например, MSE или log-loss.
(\mathbf{w}) — вектор параметров модели.
(w_j) — j-й коэффициент модели.
(p) — число признаков или параметров.
(\lambda) — сила регуляризации, то есть цена за большие коэффициенты.
Формула показывает, что модель минимизирует не только ошибку на данных, но и сумму модулей коэффициентов. Чем больше (\lambda), тем сильнее модель наказывается за использование большого числа ненулевых весов.
Численный пример: пусть базовая потеря модели равна 12, а коэффициенты равны ((2,-1,0.5)). Тогда сумма модулей равна (|2|+|-1|+|0.5|=3.5). Если (\lambda=0.4), штраф равен (0.4 \cdot 3.5 = 1.4), и полная потеря становится (12 + 1.4 = 13.4).
Эта формула важна в ML тем, что меняет саму цель оптимизации. Модель больше не ищет просто наилучшее приближение к train. Она ищет наилучшее приближение среди решений, которые остаются достаточно компактными.

Почему именно L1 порождает sparsity
Здесь начинается самая интересная часть. И L1, и L2 штрафуют большие веса, но делают это по-разному. L2 тянет коэффициенты к нулю плавно, а L1 делает ноль особенно “привлекательной” точкой. Это связано с геометрией функции штрафа: у модуля есть излом в нуле. Именно этот излом и делает зануление естественным результатом оптимизации.
Интуитивно L1 говорит модели так: если признак не даёт достаточно пользы, чтобы оправдать даже небольшой ненулевой вес, проще вообще убрать его из решения. И это очень отличается от L2, где модель чаще предпочитает оставить много маленьких, но не нулевых коэффициентов. Именно поэтому рядом особенно полезен и разбор Ridge и Lasso в регрессии, где разница между двумя типами штрафа видна уже на уровне прикладочного выбора модели.
Soft-thresholding как локальная механика L1
В задачах типа lasso очень полезно понимать soft-thresholding. Он хорошо показывает, как именно коэффициенты при L1-регуляризации либо уменьшаются, либо обнуляются.
(S(z,\lambda)=\mathrm{sign}(z)\max(|z|-\lambda,0))
Раздел математики: математический анализ и теория оптимизации.
Что означает каждый символ:
(S(z,\lambda)) — soft-thresholding оператор.
(z) — “сырой” коэффициент или промежуточная оценка веса до порогового сжатия.
(\lambda) — порог регуляризации.
(\mathrm{sign}(z)) — знак числа (z).
(\max(|z|-\lambda,0)) — правило, которое либо уменьшает модуль коэффициента на (\lambda), либо зануляет его.
Эта формула очень важна, потому что она показывает локальную механику L1: если модуль коэффициента меньше порога, он становится ровно нулём. Если больше — выживает, но уменьшается.
Численный пример: если (z=0.8) и (\lambda=0.5), то (S(0.8,0.5)=0.3). Если же (z=0.3), то (S(0.3,0.5)=0). Именно так и появляется sparsity.
С точки зрения машинного обучения это означает следующее: L1 не просто делает модель “чуть менее агрессивной”, а действительно меняет структуру решения. Часть признаков перестаёт участвовать в модели совсем.
Геометрический смысл L1
Геометрия здесь особенно красива. Если смотреть на пространство коэффициентов, то L1-регуляризация задаёт ограничение в форме ромба в двумерном случае и соответствующего многогранника в больших размерностях. У этого тела есть острые углы на осях. А именно в этих углах и лежат решения, где один или несколько коэффициентов равны нулю.
Именно поэтому L1 так естественно порождает sparsity. Оптимизация часто приходит в точки касания именно на осях координат. Для L2 геометрия другая: там ограничение круглое, гладкое, и зануление происходит гораздо реже.
Эта геометрическая интерпретация полезна не только как красивая картинка. Она действительно объясняет поведение алгоритма. Ноль для L1 не случайный побочный эффект, а естественный результат формы допустимой области решения.
Почему L1 полезна в реальном ML
Первая практическая польза — отбор признаков. Если признаков очень много, L1 помогает автоматически убрать часть слабых или шумных. Вторая — интерпретируемость. Модель с меньшим числом активных коэффициентов легче объяснять. Третья — устойчивость к широким sparse-пространствам, например в текстовых задачах или в инженерных feature tables с большим числом категориальных производных признаков.
Но важно не романтизировать L1. Она не “лучше всегда”. Если признаки сильно коррелируют, L1 может нестабильно выбирать между ними, зануляя одни и оставляя другие почти случайно внутри группы похожих признаков. Поэтому на практике часто рядом появляется Elastic Net как компромисс между L1 и L2.
Связь L1 с feature selection
Полезно понимать, что L1 — это не буквальная замена ручному отбору признаков, а встроенный в оптимизацию механизм структурного сжатия модели. Она не просто говорит “эти признаки полезны, а эти нет”, а делает это в контексте общей loss function и конкретного набора данных. Поэтому её решение зависит от масштаба признаков, корреляций и значения (\lambda). И если признаки вообще собраны непрозрачно, полезно отдельно понимать feature lineage, потому что sparsity ничего не говорит о корректности происхождения самих фич.
Именно здесь появляется инженерная зрелость: прежде чем радоваться sparsity, нужно убедиться, что признаки масштабированы разумно, а регуляризация настроена не наугад.

Как L1 связана с оптимизацией
В задачах оптимизации L1 сложнее, чем L2, потому что модуль не дифференцируем в нуле. Но именно эта недифференцируемость и создаёт нужный эффект. Алгоритм должен работать с субградиентами, coordinate descent или проксимальными методами. Это очень важный пример того, как математическая тонкость напрямую рождает прикладное свойство модели.
С точки зрения обучения это означает: L1 не просто штрафует веса, а меняет сам тип оптимизационной поверхности. И именно поэтому поведение модели с L1 качественно отличается от “обычного shrinkage”.
Какие ошибки делают чаще всего
Первая ошибка — применять L1 к непромасштабированным признакам и затем удивляться странному отбору. Вторая — считать, что зануление автоматически означает “признак бесполезен вообще”. Третья — путать sparsity с устойчивой интерпретацией, особенно при сильной корреляции признаков. Четвёртая — выбирать слишком большое (\lambda) и получать чрезмерно бедную модель. Пятая — не проверять качество на валидации, а ориентироваться только на красоту обнулённых коэффициентов. Здесь как раз полезно отдельно держать в голове и кросс-валидацию, потому что без неё очень легко принять эффект удачного split за реальную устойчивость модели.
Есть и более тонкая ошибка: использовать L1 как универсальный ответ на проблему переобучения. Она полезна, но её нужно выбирать под задачу. Иногда лучше сработает L2, иногда Elastic Net, а иногда проблема вообще не в коэффициентах, а в данных, leakage или плохой постановке эксперимента. В этом смысле рядом очень полезно держать и разбор data leakage во временных признаках, потому что красивая регуляризация не спасает модель, если в train уже просочилось будущее.
Python: как посмотреть sparsity в lasso-регрессии
import numpy as np # Подключаем numpy для работы с массивами.
from sklearn.datasets import make_regression # Импортируем генератор синтетических данных.
from sklearn.preprocessing import StandardScaler # Импортируем масштабирование признаков.
from sklearn.linear_model import Lasso # Импортируем Lasso как реализацию L1-регуляризации.
from sklearn.pipeline import Pipeline # Импортируем Pipeline для аккуратной сборки этапов.
X, y = make_regression( # Генерируем синтетическую регрессионную задачу.
n_samples=500, # Задаем число объектов.
n_features=20, # Задаем число признаков.
n_informative=5, # Указываем, что реально полезны только 5 признаков.
noise=10, # Добавляем шум в данные.
random_state=42 # Фиксируем случайность для воспроизводимости.
)
model = Pipeline([ # Собираем пайплайн.
("scaler", StandardScaler()), # Сначала масштабируем признаки, чтобы L1 работала корректнее.
("lasso", Lasso(alpha=0.1)) # Затем обучаем Lasso-модель с L1-регуляризацией.
])
model.fit(X, y) # Обучаем пайплайн на данных.
coef = model.named_steps["lasso"].coef_ # Достаем коэффициенты обученной Lasso-модели.
non_zero = np.sum(coef != 0) # Считаем число ненулевых коэффициентов.
print("Coefficients:", coef) # Печатаем сами коэффициенты модели.
print("Non-zero coefficients:", non_zero) # Печатаем количество признаков, которые пережили регуляризацию.Этот пример хорош тем, что сразу показывает практический эффект L1. После обучения часть коэффициентов часто становится ровно нулевой. Это и есть живая sparsity, а не абстрактная теория из формулы.

Что важно вынести из темы
Регуляризация L1 в Data Science нужна там, где модели полезно быть не только точной, но и экономной в использовании признаков. Она добавляет штраф за сумму модулей коэффициентов и тем самым создаёт естественную склонность к sparsity. Это делает её особенно ценной в широких feature spaces, интерпретируемых моделях и задачах, где важен встроенный структурный отбор признаков.
Если сформулировать совсем коротко, L1 говорит модели: используй только то, что действительно оправдано. Именно поэтому она остаётся актуальной и в 2026 году — не как старый учебниковый трюк, а как живая инженерная идея о компактности, устойчивости и дисциплине решения.
Kaggle notebook по теме:
https://www.kaggle.com/code/residentmario/soft-thresholding-with-lasso-regression