Почему линейная регрессия без ограничений часто начинает вредить самой себе
Когда признаков много, а данные шумные, обычная линейная регрессия охотно подстраивается под случайные детали выборки. Коэффициенты начинают раздуваться, модель становится хрупкой, а небольшое изменение данных дает другое решение. Именно здесь появляются Ridge и Lasso. Обе модели берут ту же идею регрессии, но добавляют ограничение на веса. По сути они говорят: объясняй данные, но не делай это слишком дорогой ценой сложности.
Эта идея важна не только для линейных моделей. Через нее легче понять, как вообще работает регуляризация в ML. Мы не просто минимизируем ошибку. Мы минимизируем ошибку с учетом цены за избыточную гибкость модели.
Как различаются Ridge и Lasso
Ridge использует L2-регуляризацию и плавно сжимает коэффициенты к нулю. Он редко зануляет их полностью, зато делает решение устойчивее и хорошо работает, когда много коррелирующих признаков. Lasso использует L1-регуляризацию и способен обнулять часть коэффициентов. Поэтому его часто используют как способ одновременно учить модель и отбирать признаки. Это не значит, что Lasso всегда лучше для интерпретации. Иногда он становится слишком нестабильным на сильно коррелирующих данных, и тогда Ridge оказывается надежнее.
$$ J_{ridge}(w) = J(w) + \lambda \sum_{j=1}^{m} w_j^2 $$В Ridge к исходной функции потерь добавляется штраф за большие веса. Модель все еще хочет уменьшить ошибку, но теперь ей приходится платить за слишком длинный вектор коэффициентов.
J_{ridge}(w)— регуляризованная функция потерь для RidgeJ(w)— исходная ошибка без регуляризации\lambda— сила штрафа за сложностьw_j— вес j-го признакаm— число параметров модели
Для Lasso формула похожа, но вместо квадратов коэффициентов используется сумма модулей. Именно эта геометрическая разница и приводит к тому, что часть коэффициентов может стать нулевой. Визуально Ridge чаще «сжимает шар», а Lasso задает более угловатое ограничение, которое охотнее прижимает параметры к осям.
Как это чувствуется в реальной задаче
Если у тебя много похожих признаков, Ridge помогает распределить влияние между ними мягко и устойчиво. Если признаков слишком много и часть выглядит лишней, Lasso может помочь вычистить пространство признаков. Но выбирать между ними нужно не по легенде, а по поведению на валидации и устойчивости решения.
import pandas as pd # готовим маленький табличный пример с коррелирующими признаками
from sklearn.linear_model import Ridge, Lasso # сравниваем две формы регуляризации на одной задаче
data = pd.DataFrame({ # задаем признаки и таргет для регрессионной постановки
'x1': [1, 2, 3, 4, 5, 6], # первый числовой признак
'x2': [2, 4, 6, 8, 10, 12], # второй признак, сильно связанный с первым
'y': [3, 5, 7, 9, 11, 13] # целевая переменная
})
X = data[['x1', 'x2']] # выделяем матрицу признаков
y = data['y'] # сохраняем target отдельно
ridge = Ridge(alpha=1.0) # задаем Ridge с L2-регуляризацией
lasso = Lasso(alpha=0.1) # задаем Lasso с L1-регуляризацией
ridge.fit(X, y) # обучаем Ridge на данных
lasso.fit(X, y) # обучаем Lasso на тех же данных
print({'ridge_coef': ridge.coef_.round(3).tolist()}) # смотрим, как Ridge распределил веса
print({'lasso_coef': lasso.coef_.round(3).tolist()}) # смотрим, занулил ли Lasso часть коэффициентовДаже на маленьком примере видно, что регуляризация — это не абстрактная добавка к формуле, а реальный способ управлять поведением модели. И чем раньше это становится понятным, тем легче читать более сложные методы обучения.