🔴 Сложный ⏱️ 55 минут

Регуляризация (Ridge, Lasso)

📋 Содержание урока

Регуляризация (Ridge, Lasso) 🧲

Если ты дошёл до этого урока через блок про оптимизацию, ты уже один раз видел этот трюк изнутри. В уроке про проксимальные методы ты доказал теорему: проксимальный оператор $L_1$-нормы — это мягкое пороговое отображение $S_\lambda(v)=\mathrm{sign}(v)\max(|v|-\lambda,0)$, которое обнуляет маленькие координаты точно и сдвигает большие на фиксированную величину. Там это было чистой математикой — задачей минимизации $\frac12(x-v)^2+\lambda|x|$, решённой через субдифференциал. Сейчас та же самая формула возвращается, но уже не как абстрактное упражнение по выпуклому анализу, а как рабочий инструмент, которым ты будешь пользоваться в scikit-learn буквально при каждом обучении линейной модели.

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

Ridge-регрессия добавляет штраф $\lambda\sum_i w_i^2$ — квадрат нормы вектора весов. Lasso-регрессия добавляет штраф $\lambda\sum_i |w_i|$ — модуль нормы вектора весов. На первый взгляд это два варианта одной и той же идеи, отличающиеся только показателем степени. На практике это два принципиально разных инструмента. Ridge уменьшает все веса, но почти никогда не обнуляет их полностью — как штраф $\lambda x^2$ из примера про Ridge-подобную функцию в уроке про проксимальные методы, чья сила притяжения к нулю линейно ослабевает по мере приближения к нулю. Lasso, наоборот, зануляет часть весов ровно, потому что штраф $\lambda|x|$ имеет излом в нуле — тот самый излом, из-за которого $|x|$ не дифференцируем в точке $0$ и субдифференциал которого ты уже считал в уроке про субградиентные методы.

Этот урок соединяет две вещи, которые ты изучал порознь: доказанную математику soft thresholding и практическую задачу борьбы с переобучением линейной регрессии. Ты увидишь, почему геометрия штрафа — круг у Ridge, ромб с острыми углами у Lasso — это не просто красивая картинка, а прямое объяснение того, почему sklearn.linear_model.Lasso отбирает признаки, а sklearn.linear_model.Ridge — никогда. И ты научишься осознанно выбирать между ними, а не наугад пробовать оба варианта и смотреть, что покажет лучший результат на валидации.

История

Идея штрафовать «нехорошее» решение добавочным членом в задаче минимизации родилась не в статистике и не в машинном обучении, а в теории некорректно поставленных задач. В 1943 году советский математик Андрей Николаевич Тихонов начал публиковать работы о том, как решать задачи, в которых малое изменение входных данных приводит к произвольно большому изменению решения — например, обратные задачи математической физики, где нужно восстановить причину по наблюдаемому следствию. Такие задачи называются некорректно поставленными по Адамару, и классические методы решения для них просто не работают: решение может не существовать, быть неединственным или быть неустойчивым к шуму. В развёрнутом виде метод, вошедший в историю под названием регуляризации Тихонова, был опубликован в 1963 году: к минимизируемому функционалу добавляется стабилизирующее слагаемое, пропорциональное квадрату нормы решения, что делает задачу корректной и устойчивой к малым возмущениям данных. Формально это в точности $L_2$-регуляризация, которую ты увидишь ниже под именем Ridge.

Параллельно и по другим мотивам к той же самой формуле пришли статистики. В 1970 году Артур Хёрл (Arthur Hoerl) и Роберт Кеннард (Robert Kennard) опубликовали статью «Ridge Regression: Biased Estimation for Nonorthogonal Problems», где решали конкретную прикладную проблему: при сильной мультиколлинеарности признаков матрица $X^\top X$ становится почти вырожденной, обычная формула МНК $(X^\top X)^{-1}X^\top y$ даёт огромные, неустойчивые, знакопеременные коэффициенты, а добавление $\lambda I$ к $X^\top X$ перед обращением («гребень» — ridge — на диагонали матрицы, отсюда и название) решает проблему обусловленности напрямую. Хёрл и Кеннард сознательно жертвовали несмещённостью оценки МНК ради резкого снижения её дисперсии — ранний и очень наглядный пример того, что в машинном обучении называют bias-variance trade-off.

Lasso появился на четверть века позже и с принципиально другой мотивацией — не устойчивость, а интерпретируемость и отбор признаков. В 1996 году Роберт Тибширани (Robert Tibshirani) опубликовал статью «Regression Shrinkage and Selection via the Lasso», где показал, что замена квадратичного штрафа на штраф по модулю коэффициентов даёт метод, одновременно решающий две задачи: сжатие весов (shrinkage, как у Ridge) и отбор значимых признаков (selection, чего Ridge не делает никогда). Название LASSO — акроним от Least Absolute Shrinkage and Selection Operator. Почти сразу выяснилось, что у метода есть слабое место — на группах сильно скоррелированных признаков Lasso ведёт себя нестабильно, произвольно выбирая одного «представителя» группы и обнуляя остальных. В 2005 году Хуэй Зоу (Hui Zou) и Тревор Хасти (Trevor Hastie) предложили решение — Elastic Net, комбинацию $L_1$- и $L_2$-штрафов, которая сохраняет способность Lasso к отбору признаков, но заимствует у Ridge устойчивость на коррелированных группах. Сегодня все три метода — стандартные функции scikit-learn, glmnet и практически любой библиотеки линейных моделей, а параметр силы регуляризации $\lambda$ (в sklearn он называется alpha) — один из первых гиперпараметров, который перебирают при обучении любой линейной модели.

Проблема переобучения: зачем нужна регуляризация

Интуиция

Метод наименьших квадратов ищет веса, которые минимизируют ошибку ровно на тех данных, которые ему показали, — и ничего сверх этого. Если признаков относительно немного, а зависимость действительно близка к линейной, это прекрасно работает: минимизация ошибки на обучении и минимизация ошибки на новых данных примерно совпадают. Но стоит числу признаков вырасти, признакам начать сильно коррелировать друг с другом, или зависимости стать сложнее линейной (полиномиальные признаки из прошлого урока — прямой тому пример), и минимизация обучающей ошибки начинает находить решения, которые подстраиваются под конкретный шум конкретной выборки, а не под настоящую закономерность. Веса при этом разрастаются: модель начинает «выкручивать» коэффициенты в большую и малую сторону, компенсируя один признак другим, чтобы выжать из обучающих данных последнюю долю точности — именно этой ценой покупается неустойчивость на новых данных.

Формальное определение

Обычная задача МНК ищет веса $w \in \mathbb{R}^p$, минимизирующие сумму квадратов ошибок:

$$w_{\text{МНК}} = \arg\min_w \|y - Xw\|_2^2 = \arg\min_w \sum_{i=1}^n (y_i - x_i^\top w)^2$$

При $X^\top X$ обратимой аналитическое решение: $w_{\text{МНК}} = (X^\top X)^{-1}X^\top y$.

Проблема заключается именно в этой формуле. Если столбцы $X$ сильно коррелируют (мультиколлинеарность) или признаков больше, чем наблюдений ($p > n$), матрица $X^\top X$ становится плохо обусловленной или вовсе необратимой: её наименьшие собственные значения близки к нулю (или равны нулю), а обращение матрицы с маленькими собственными значениями умножает шум в данных на огромные коэффициенты $1/\sigma_{\min}$. Результат — веса, которые прекрасно подгоняются под обучающую выборку и никак не обобщаются.

Примеры

Пример 1: полином высокой степени. Из прошлого урока ты уже видел этот случай: для 6 точек данных полином степени 5 даёт ровно $6$ параметров на $6$ наблюдений — задача интерполяции, а не регрессии. Матрица признаков $X = [1, x, x^2, x^3, x^4, x^5]$ становится почти вырожденной, потому что столбцы $x, x^2, x^3, \dots$ сильно коррелируют друг с другом на ограниченном диапазоне значений $x$ (это тот же эффект мультиколлинеарности, только созданный самим построением признаков, а не природой данных). Коэффициенты полинома при этом получаются огромными по модулю и разного знака, компенсирующими друг друга почти до сокращения — классический признак того, что модель запомнила шум, а не закономерность.

Пример 2: мультиколлинеарные признаки в реальных данных. Пусть ты предсказываешь цену квартиры по площади в квадратных метрах и одновременно по площади в квадратных футах. Эти два признака связаны почти линейно (константный множитель $10{,}76$), и МНК не может однозначно решить, какому из них приписать вес: любая пара коэффициентов $(w_1, w_2)$, для которой $w_1 + 10{,}76\, w_2$ равна нужному суммарному эффекту площади, даёт одинаковую ошибку на обучении. Матрица $X^\top X$ в этом направлении почти вырождена, и МНК может выбрать сколь угодно большие $w_1 = 1000$, $w_2 = -93$ вместо разумных $w_1 = 0{,}05$, $w_2 = 0$ — обе пары дают похожую ошибку на обучающих данных, но только вторая устойчива к шуму.

Пример 3: число признаков больше числа наблюдений. В биоинформатике типична ситуация, когда экспрессия $20\,000$ генов измерена всего для $200$ пациентов. Здесь $p \gg n$, матрица $X^\top X$ размера $20\,000 \times 20\,000$ имеет ранг не выше $200$ и принципиально необратима — у задачи МНК бесконечно много точных решений с нулевой ошибкой на обучении, и без дополнительного ограничения непонятно, какое из них выбрать. Именно в таких задачах регуляризация не опция, а необходимость: без неё классический МНК попросту не определён.

Почему это важно

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

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

Интуиция

Идея Ridge предельно прямолинейна: добавить к функции потерь штраф за суммарный «размер» вектора весов, измеренный квадратом евклидовой нормы. Модель по-прежнему хочет минимизировать ошибку на обучении, но теперь у неё появляется вторая цель — держать веса маленькими, — и итоговое решение балансирует между этими двумя целями. Чем больше $\lambda$, тем сильнее перевешивает вторая цель, и тем ближе итоговые веса к нулю. Но, как ты уже видел на примере проксимального оператора квадратичного штрафа в уроке про проксимальные методы, сила притяжения квадратичного штрафа к нулю линейно ослабевает по мере приближения к нулю — а значит, полного обнуления при конечном $\lambda$ ждать не стоит.

Формальное определение

Функция потерь Ridge-регрессии:

$$L_{\text{Ridge}}(w) = \|y - Xw\|_2^2 + \lambda \sum_{i=1}^p w_i^2 = \|y-Xw\|_2^2 + \lambda\|w\|_2^2$$

где $\lambda \ge 0$ — параметр силы регуляризации (гиперпараметр).

Ridge — единственный из трёх рассматриваемых методов, у которого есть аналитическое решение в замкнутой форме, и вывести его — вопрос одной производной. Приравнивая градиент к нулю:

$$\nabla_w L_{\text{Ridge}}(w) = -2X^\top(y-Xw) + 2\lambda w = 0$$$$X^\top y = X^\top X w + \lambda w = (X^\top X + \lambda I) w$$$$w_{\text{Ridge}} = (X^\top X + \lambda I)^{-1} X^\top y$$

Это и есть формула «гребня»: к диагонали матрицы $X^\top X$ прибавляется $\lambda I$ прежде, чем матрицу обращать. Ключевое наблюдение: даже если $X^\top X$ вырождена или почти вырождена (случай мультиколлинеарности из предыдущего раздела), матрица $X^\top X + \lambda I$ при любом $\lambda > 0$ строго положительно определена и гарантированно обратима — её наименьшее собственное значение не меньше $\lambda$. Ridge не просто штрафует большие веса — он буквально чинит численную неустойчивость обращения матрицы, из-за которой МНК ломался в примерах 2 и 3 предыдущего раздела.

Эквивалентная формулировка через ограничение (её и называют геометрической интерпретацией Ridge): минимизация $\|y-Xw\|_2^2$ при условии $\|w\|_2^2 \le t$ для некоторого $t \ge 0$, связанного с $\lambda$ через условия Каруша — Куна — Таккера. Множество $\{w : \|w\|_2^2 \le t\}$ в пространстве весов — это шар (круг в двумерном случае, сфера в трёхмерном, гипершар в общем случае): гладкая, без единого угла или излома, поверхность.

Примеры

Пример 1: устойчивость к мультиколлинеарности. Вернёмся к площади квартиры в квадратных метрах ($x_1$) и квадратных футах ($x_2 = 10{,}76\, x_1$). Без регуляризации МНК не может однозначно разделить эффект между $w_1$ и $w_2$ — задача вырождена. С Ridge-штрафом $\lambda(w_1^2+w_2^2)$ у задачи появляется единственный ответ: среди всех пар $(w_1,w_2)$ с одинаковой обучающей ошибкой штраф $w_1^2+w_2^2$ минимален у той пары, которая распределяет суммарный эффект поровну между коррелирующими признаками (по неравенству о среднем квадратичном сумма квадратов при фиксированной сумме минимальна, когда слагаемые равны). Ridge не просто численно решает задачу — он выбирает конкретное, статистически осмысленное решение среди бесконечного множества формально равнозначных.

Пример 2: явный числовой расчёт (ортогональный случай). Пусть признаки уже стандартизированы и взаимно ортогональны, так что $X^\top X = I$. Тогда формула Ridge упрощается ровно так же, как упрощался проксимальный шаг в уроке про проксимальные методы при $X^\top X=I$: $(I+\lambda I)w = X^\top y = w_{\text{МНК}}$, откуда

$$w_{\text{Ridge}} = \frac{w_{\text{МНК}}}{1+\lambda}$$

Возьмём вектор МНК-коэффициентов $w_{\text{МНК}} = (3;\ 0{,}4;\ -2;\ 0{,}15)$ и $\lambda=1$. Тогда $w_{\text{Ridge}} = w_{\text{МНК}}/2 = (1{,}5;\ 0{,}2;\ -1;\ 0{,}075)$ — каждая координата ровно вдвое меньше по модулю, знак сохранён, и ни одна координата не обнулилась, включая самую маленькую ($0{,}15 \to 0{,}075$). Это прямая иллюстрация мультипликативного сжатия: чем больше $\lambda$, тем сильнее делитель $1+\lambda$, но числитель никогда не становится нулём при конечном $\lambda$ и ненулевом $w_{\text{МНК}}$.

Пример 3: почему $\lambda=0$ и $\lambda\to\infty$ — предельные случаи. При $\lambda=0$ формула $w_{\text{Ridge}}=(X^\top X)^{-1}X^\top y$ в точности совпадает с обычным МНК — регуляризация исчезает, если её сила равна нулю. При $\lambda\to\infty$ в формуле $(X^\top X+\lambda I)^{-1}X^\top y$ слагаемое $\lambda I$ доминирует над $X^\top X$, и $w_{\text{Ridge}}\to 0$ — модель вырождается в константу (предсказывает среднее значение целевой переменной независимо от признаков). Ridge непрерывно интерполирует между этими двумя крайностями, и выбор $\lambda$ — это по существу выбор точки на этом отрезке между «доверять только данным» и «не доверять данным вовсе».

Почему это важно

Ridge — это правильный выбор, когда ты веришь, что все признаки хоть немного информативны, но их совместное влияние оценивается неустойчиво из-за корреляций или недостатка данных. В sklearn.linear_model.Ridge эта регуляризация включена буквально одним аргументом (alpha), и на практике она почти всегда снижает дисперсию модели ценой небольшого смещения — классический выигрышный размен bias-variance trade-off, уже знакомый тебе по уроку про переобучение и недообучение.

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

Интуиция

Lasso меняет в формуле Ridge всего один символ — степень штрафа с квадрата на модуль, — но последствия этой замены фундаментальны, и ты уже знаешь, почему. В уроке про проксимальные методы ты доказал: штраф $\lambda|x|$ имеет излом в нуле, и его «сила притяжения» к нулю не ослабевает по мере приближения к нулю, в отличие от $\lambda x^2$. Именно поэтому существует целая зона входных значений, для которых итоговый ответ — точный, а не приближённый ноль. В контексте регрессии это означает буквально следующее: Lasso не просто уменьшает вес слабого признака — он выключает этот признак из модели полностью, приравнивая его коэффициент к $0$, а значит, модель после обучения физически не использует этот столбец данных при предсказании.

Формальное определение

Функция потерь Lasso-регрессии:

$$L_{\text{Lasso}}(w) = \|y-Xw\|_2^2 + \lambda\sum_{i=1}^p |w_i| = \|y-Xw\|_2^2+\lambda\|w\|_1$$

В отличие от Ridge, у Lasso нет аналитического решения в замкнутой форме для общего случая — $L_1$-норма не дифференцируема в точках, где какая-то координата равна нулю, и производная функции потерь не приравнивается к нулю простым алгебраическим уравнением. Именно поэтому для Lasso используются либо проксимальный градиентный метод (ISTA/FISTA из урока про проксимальные методы), либо покоординатный спуск (следующий за проксимальными методами урок), а scikit-learn по умолчанию решает Lasso именно покоординатным спуском.

Но в важном частном случае ортогональных стандартизированных признаков ($X^\top X = I$) решение выписывается явно, и это тот самый пример, который ты уже разобрал в уроке про проксимальные методы «изнутри». При $X^\top X=I$ задача минимизации $\|y-Xw\|_2^2+\lambda\|w\|_1$ распадается на независимые одномерные задачи по каждой координате — ровно тот же аргумент про сумму независимых слагаемых, что и в разделе про векторный прокс $L_1$-нормы. Для каждой координаты $j$ решение — это в точности прокс модуля, применённый к соответствующему МНК-коэффициенту:

$$w_{\text{Lasso},\,j} = S_{\lambda/2}(w_{\text{МНК},\,j}) = \mathrm{sign}(w_{\text{МНК},\,j})\max\!\left(|w_{\text{МНК},\,j}| - \frac{\lambda}{2},\ 0\right)$$

(Коэффициент $\lambda/2$, а не $\lambda$, возникает из-за того, что здесь функция потерь записана как $\|y-Xw\|_2^2$ без множителя $\frac12$ перед квадратичным членом — при перегруппировке в форму $\frac12(w-w_{\text{МНК}})^2 + \frac{\lambda}{2}|w|$, к которой применима доказанная в уроке про проксимальные методы теорема, эффективный порог оказывается вдвое меньше номинального $\lambda$. Библиотеки вроде scikit-learn используют собственную нормировку функции потерь именно для того, чтобы избежать таких множителей — подробности нормировки конкретной библиотеки всегда стоит сверять в документации, но качественное поведение — точное обнуление малых коэффициентов — от нормировки не зависит.)

Геометрическая интерпретация Lasso зеркальна геометрии Ridge: минимизация $\|y-Xw\|_2^2$ при условии $\|w\|_1 \le t$. Множество $\{w : \|w\|_1 \le t\}$ в двумерном случае — это ромб с вершинами в точках $(\pm t, 0)$ и $(0, \pm t)$: у него есть острые углы ровно на осях координат, там, где одна из координат равна нулю.

Примеры

Пример 1: ручной расчёт на том же ортогональном примере, что и для Ridge. Возьмём тот же вектор МНК-коэффициентов $w_{\text{МНК}} = (3;\ 0{,}4;\ -2;\ 0{,}15)$, что и в примере 2 раздела про Ridge, и применим формулу мягкого порогового отображения с порогом $\lambda=1$ (используем прямую формулу $S_\lambda$ из урока про проксимальные методы, без дополнительного деления на 2 — считаем, что нормировка функции потерь уже учтена):

$$S_1(3)=2,\qquad S_1(0{,}4)=0,\qquad S_1(-2)=-1,\qquad S_1(0{,}15)=0$$$$w_{\text{Lasso}} = (2;\ 0;\ -1;\ 0)$$

Сравни это построчно с результатом Ridge для тех же данных и того же $\lambda$: $w_{\text{Ridge}} = (1{,}5;\ 0{,}2;\ -1;\ 0{,}075)$. Обе регуляризации сжали большие коэффициенты ($3\to 2$ у Lasso, $3\to1{,}5$ у Ridge), но только Lasso обнулил маленькие коэффициенты $0{,}4$ и $0{,}15$ полностью, тогда как Ridge лишь уменьшил их вдвое, сохранив ненулевыми. Это не совпадение и не артефакт конкретных чисел — это прямое следствие теоремы о soft thresholding, доказанной для произвольного $v$ и $\lambda$.

Пример 2: полное численное сравнение Ridge и Lasso на реалистичных данных. Возьмём данные о десяти квартирах с четырьмя признаками: площадь (м²), число комнат, расстояние до метро пешком (мин), и заведомо нерелевантный признак — последняя цифра телефона продавца (случайный шум, не связанный с ценой). Цена реально зависит от площади, числа комнат и (слабо) от расстояния до метро; признак «телефон» в модель добавлен намеренно, чтобы посмотреть, что с ним сделает каждый метод. После стандартизации всех признаков и обучения МНК получаем коэффициенты (в порядке площадь / комнаты / метро / телефон):

$$w_{\text{МНК}} = (2{,}003;\ 0{,}983;\ -0{,}260;\ 0{,}071)$$

Признак «телефон» получил небольшой, но ненулевой коэффициент $0{,}071$ — чистый шум подгонки под обучающую выборку. Прогоним Ridge и Lasso с одинаковыми значениями $\lambda$ на этих же данных:

lambda = 0.3
Ridge: (1.737,  1.199, -0.232,  0.070)
Lasso: (1.750,  1.053, -0.114,  0.000)

lambda = 1.0
Ridge: (1.539,  1.290, -0.187,  0.080)
Lasso: (1.479,  0.946,  0.000,  0.000)

lambda = 5.0
Ridge: (1.203,  1.150, -0.073,  0.088)
Lasso: (0.390,  0.000,  0.000,  0.000)

Картина исключительно наглядная. При слабой регуляризации ($\lambda=0{,}3$) Lasso уже полностью выключил нерелевантный признак «телефон» (коэффициент ровно $0$), но пока сохранил ослабленный, но живой эффект расстояния до метро ($-0{,}114$) — модель избирательно убирает именно шум, а не всё подряд. При умеренной регуляризации ($\lambda=1{,}0$) Lasso убирает уже оба слабых признака и оставляет только два самых сильных предиктора — площадь и число комнат. При сильной регуляризации ($\lambda=5{,}0$) в модели остаётся только площадь. Ridge на протяжении всего этого пути ни разу не даёт точного нуля ни для одного признака, включая заведомо бесполезный «телефон» — при $\lambda=5$ его коэффициент даже не стремится монотонно к нулю ($0{,}070\to0{,}080\to0{,}088$), он просто остаётся маленьким, но упрямо ненулевым числом.

Пример 3: чтение полученной Lasso-модели как отбора признаков. Практический вывод из примера 2 прямой: обучив Lasso с $\lambda=1{,}0$ на данных о квартирах, можно буквально прочитать из ненулевых коэффициентов, какие признаки модель считает значимыми — площадь и комнаты, и явно исключить метро и телефон из дальнейшего анализа, ничего не теряя в качестве предсказания (поскольку именно эта комбинация минимизирует регуляризованную функцию потерь). Ridge такого прочтения не даёт в принципе: даже посмотрев на обученные коэффициенты Ridge, нельзя сказать «этот признак не нужен» — там просто нет ни одного строго нулевого значения, на которое можно было бы указать.

Почему это важно

Способность Lasso точно обнулять коэффициенты — не приятный побочный эффект, а прямое, доказанное следствие излома штрафа $|x|$ в нуле, ровно то же самое доказательство, которое ты уже разобрал в уроке про проксимальные методы. На практике это превращает Lasso в инструмент одновременно регуляризации и отбора признаков: при работе с сотнями или тысячами потенциальных предикторов (геномика, текстовые признаки, автоматически сгенерированные фичи) Lasso не просто улучшает обобщающую способность модели — он говорит тебе, какие признаки вообще стоит оставить в пайплайне, что напрямую упрощает интерпретацию и последующее сопровождение модели.

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

Интуиция

У Lasso есть слабое место, которое становится заметным именно на группах сильно скоррелированных признаков: продолжая пример с площадью в квадратных метрах и квадратных футах, Lasso не распределяет эффект поровну между дублирующими друг друга признаками (как это по симметрии делает Ridge), а произвольно выбирает одного «представителя» группы и обнуляет остальных — причём то, какой именно признак «выживет», может измениться от небольшого шума в данных или от случайности разбиения на train/test. Elastic Net решает эту проблему прямолинейно: он добавляет к $L_1$-штрафу ещё и $L_2$-штраф, так что общая функция потерь наследует у Lasso способность обнулять по-настоящему бесполезные признаки, а у Ridge — устойчивость и «справедливое» распределение веса внутри коррелирующих групп.

Формальное определение

Функция потерь Elastic Net:

$$L_{\text{EN}}(w) = \|y-Xw\|_2^2 + \lambda\Bigl(\alpha\|w\|_1 + (1-\alpha)\|w\|_2^2\Bigr)$$

где $\lambda \ge 0$ — общая сила регуляризации, а $\alpha \in [0,1]$ — доля $L_1$-штрафа (l1_ratio в sklearn.linear_model.ElasticNet).

При $\alpha=1$ Elastic Net в точности сводится к Lasso, при $\alpha=0$ — в точности к Ridge; промежуточные значения $\alpha$ дают континуум между этими двумя крайностями. С точки зрения проксимальных методов из урока 291 это ровно тот же пример эластичной сети, который там уже разбирался: $L_2$-слагаемое дифференцируемо всюду и идёт в гладкую часть задачи $f$ (просто добавляется к градиенту), а $L_1$-слагаемое остаётся негладким и по-прежнему обрабатывается прокс-оператором — сам прокс не усложняется, меняется только формула градиентного шага.

Примеры

Пример 1: спасение группы коррелированных признаков. Продолжим пример с площадью в квадратных метрах ($x_1$) и квадратных футах ($x_2$). Чистый Lasso может отдать весь эффект площади признаку $x_1$, обнулив $x_2$, а при повторном обучении на слегка другой выборке — сделать ровно наоборот. Elastic Net с $\alpha=0{,}5$ распределит эффект между $x_1$ и $x_2$ более устойчиво (за счёт $L_2$-части), но при этом, если в модель добавить третий, по-настоящему нерелевантный признак вроде «телефона» из предыдущего примера, Elastic Net всё равно его обнулит (за счёт $L_1$-части) — комбинация штрафов даёт лучшее из обоих миров именно для этого сценария.

Пример 2: выбор l1_ratio как ещё одного гиперпараметра. В sklearn.linear_model.ElasticNetCV перебираются одновременно alpha (сила общей регуляризации) и l1_ratio (баланс между $L_1$ и $L_2$) — сетка значений l1_ratio обычно включает крайние точки $0{,}1$ (почти чистый Ridge) и $0{,}9$–$1{,}0$ (почти чистый Lasso), а также несколько промежуточных значений вроде $0{,}5$ или $0{,}7$. На практике l1_ratio около $0{,}5$–$0{,}7$ часто оказывается разумным выбором по умолчанию, когда заранее неизвестно, сильно ли признаки коррелируют друг с другом.

Почему это важно

Elastic Net нужен не всегда — если признаков немного и они слабо коррелируют, разница между ним и чистым Lasso или Ridge на практике невелика. Но в задачах с большим числом признаков, среди которых заведомо есть группы дублирующих друг друга или сильно связанных величин (например, разные агрегаты одной и той же метрики за разные окна времени), Elastic Net систематически даёт более устойчивый набор отобранных признаков от запуска к запуску, чем чистый Lasso, не жертвуя при этом способностью отсекать по-настоящему бесполезные столбцы данных.

Подбор λ: регуляризация как гиперпараметр

Интуиция

Параметр $\lambda$ нельзя вывести из данных напрямую тем же способом, что и веса $w$ — минимизация функции потерь по $\lambda$ при фиксированных весах тривиально даёт $\lambda=0$ (без регуляризации ошибка на обучении всегда минимальна или почти минимальна). Поэтому $\lambda$ — это гиперпараметр, и оценивать его нужно не на обучающей выборке, а на данных, которые модель не видела во время подбора весов — ровно та проблема и ровно то решение, которые ты уже разбирал в уроке про кросс-валидацию.

Формальное определение

Схема подбора $\lambda$ через k-fold кросс-валидацию: для каждого кандидата $\lambda$ из заданной сетки значений обучающая выборка разбивается на $k$ фолдов; модель обучается $k$ раз, каждый раз на $k-1$ фолдах, и валидируется на оставшемся; итоговая оценка качества для данного $\lambda$ — среднее значение метрики (обычно MSE или $R^2$) по всем $k$ прогонам. Выбирается $\lambda$, минимизирующий усреднённую ошибку валидации.

В scikit-learn эта схема реализована готовыми классами RidgeCV, LassoCV и ElasticNetCV, которые перебирают сетку значений $\lambda$ автоматически и эффективно (в частности, LassoCV использует то, что путь коэффициентов Lasso по $\lambda$ кусочно-линеен, и умеет вычислять решения для целой сетки значений $\lambda$ значительно быстрее, чем при обучении с нуля для каждого значения по отдельности).

from sklearn.linear_model import RidgeCV, LassoCV
import numpy as np

alphas = np.logspace(-3, 3, 50)  # сетка от 0.001 до 1000

ridge_cv = RidgeCV(alphas=alphas, cv=5)
ridge_cv.fit(X_train, y_train)
print("Лучшая alpha для Ridge:", ridge_cv.alpha_)

lasso_cv = LassoCV(alphas=alphas, cv=5, max_iter=10000)
lasso_cv.fit(X_train, y_train)
print("Лучшая alpha для Lasso:", lasso_cv.alpha_)
print("Отобранные признаки:", np.where(lasso_cv.coef_ != 0)[0])

Примеры

Пример 1: логарифмическая сетка значений. Сетку значений $\lambda$ почти всегда задают логарифмически равномерной (np.logspace(-3, 3, 50) даёт $50$ точек от $0{,}001$ до $1000$), а не линейно равномерной. Причина в том, что поведение модели чувствительно к порядку величины $\lambda$, а не к его абсолютному значению: разница между $\lambda=0{,}001$ и $\lambda=0{,}01$ на практике часто существеннее, чем разница между $\lambda=500$ и $\lambda=1000$, где обе модели уже почти вырождены.

Пример 2: кривая валидации против $\lambda$. Если построить график средней ошибки кросс-валидации в зависимости от $\lambda$ (по логарифмической шкале), типичная кривая имеет характерную U-образную форму: при малых $\lambda$ модель почти совпадает с необрегуляризованным МНК и переобучается (ошибка на валидации выше, чем могла бы быть), при больших $\lambda$ модель чрезмерно упрощается и недообучается (ошибка на валидации снова растёт, потому что модель уже мало отличается от константы), а где-то посередине лежит минимум — это ровно тот же bias-variance trade-off, который ты уже видел применительно к степени полинома в предыдущем уроке, только теперь роль «сложности модели» играет обратная величина $\lambda$.

Пример 3: разная стоимость подбора для Ridge и Lasso. Для Ridge аналитическая формула $w_{\text{Ridge}}=(X^\top X+\lambda I)^{-1}X^\top y$ позволяет для фиксированного разложения матрицы пересчитывать решение для разных $\lambda$ почти бесплатно (через одно сингулярное разложение $X$), поэтому RidgeCV по умолчанию использует эффективную leave-one-out схему без явного повторного обучения на каждом фолде. Для Lasso явной формулы нет, и LassoCV вынужден пересчитывать покоординатный спуск для каждого значения $\lambda$ отдельно (хотя и переиспользуя решение с предыдущего $\lambda$ как стартовую точку — так называемый warm start, что заметно ускоряет проход по всей сетке).

Почему это важно

Выбор $\lambda$ на глаз или по значению «по умолчанию» — распространённая практическая ошибка: слишком маленькое $\lambda$ не решает исходную проблему переобучения вовсе, а слишком большое превращает содержательную модель в константу. Кросс-валидация превращает подбор $\lambda$ из гадания в измеримую процедуру, а готовые классы RidgeCV/LassoCV/ElasticNetCV делают эту процедуру настолько дешёвой в реализации, что не использовать её — практически всегда упущенная возможность улучшить качество модели бесплатно, без единой новой строчки признаковой инженерии.

Практика: 30 заданий

Базовые задания (1–10)

Задание 1: Дан коэффициент МНК $w_{\text{МНК}}=4{,}0$ для одного ортогонального признака. Вычисли Ridge-коэффициент при $\lambda=1$.


Задание 2: Для того же $w_{\text{МНК}}=4{,}0$ вычисли Lasso-коэффициент через мягкое пороговое отображение с порогом $\lambda=1$.


Задание 3: Для $w_{\text{МНК}}=0{,}6$ и $\lambda=1$ вычисли и Ridge-, и Lasso-коэффициенты. Сравни результаты.


Задание 4: Дан вектор МНК-коэффициентов $w_{\text{МНК}}=(5;\ 0{,}3;\ -1{,}8;\ -0{,}2)$ на ортогональных признаках, $\lambda=1$. Вычисли $w_{\text{Ridge}}$ покоординатно.


Задание 5: Для того же вектора $w_{\text{МНК}}=(5;\ 0{,}3;\ -1{,}8;\ -0{,}2)$ вычисли $w_{\text{Lasso}}$ с порогом $\lambda=1$.


Задание 6: Запиши функцию потерь Ridge-регрессии для трёх признаков с весами $w_1,w_2,w_3$ и параметром $\lambda$.


Задание 7: Опиши словами и уравнением область ограничения $\|w\|_2^2\le t$ для двух весов $w_1,w_2$ при $t=4$. Как называется эта геометрическая фигура?


Задание 8: Опиши уравнением область ограничения $\|w\|_1\le t$ для двух весов при $t=2$, и найди координаты всех вершин этой фигуры.


Задание 9: Что происходит с $w_{\text{Ridge}}$ и $w_{\text{Lasso}}$ при $\lambda=0$?


Задание 10: Верно ли утверждение: «при достаточно большом конечном $\lambda$ Ridge-коэффициент может стать точно нулём, если исходный МНК-коэффициент был ненулевым»? Обоснуй ответ.


Продвинутые задания (11–20)

Задание 11: Выведи формулу $w_{\text{Ridge}}=(X^\top X+\lambda I)^{-1}X^\top y$, взяв градиент $L_{\text{Ridge}}(w)=\|y-Xw\|_2^2+\lambda\|w\|_2^2$ по $w$ и приравняв его к нулю.


Задание 12: Объясни, почему матрица $X^\top X+\lambda I$ при $\lambda>0$ всегда обратима, даже если $X^\top X$ вырождена.


Задание 13: Используя данные о квартирах из примера этого урока (МНК-коэффициенты площадь/комнаты/метро/телефон $=(2{,}003;\ 0{,}983;\ -0{,}260;\ 0{,}071)$), объясни, почему Lasso при $\lambda=0{,}3$ занулил именно признак «телефон», а не «метро», хотя оба коэффициента малы.


Задание 14: Для тех же данных о квартирах: при $\lambda=5{,}0$ у Ridge коэффициент признака «телефон» равен $0{,}088$ — он даже немного вырос по модулю по сравнению с $\lambda=0{,}3$ (было $0{,}070$). Как это соотносится с утверждением «Ridge всегда монотонно сжимает каждый вес по мере роста $\lambda$»?


Задание 15: Elastic Net задан формулой $L_{\text{EN}}(w)=\|y-Xw\|_2^2+\lambda(\alpha\|w\|_1+(1-\alpha)\|w\|_2^2)$. Чему равен $L_{\text{EN}}$ при $\alpha=1$ и при $\alpha=0$?


Задание 16: На кривой валидации (ошибка кросс-валидации в зависимости от $\log\lambda$) наблюдается характерная U-образная форма. Объясни в терминах bias-variance trade-off, что происходит в каждой из двух ветвей этой кривой.


Задание 17: Почему для Ridge сетку значений $\lambda$ обычно задают логарифмически (np.logspace), а не линейно равномерно?


Задание 18: Почему LassoCV в scikit-learn обычно медленнее RidgeCV при переборе одной и той же сетки значений $\lambda$?


Задание 19: Признаки в датасете не были стандартизированы перед обучением Ridge: один признак измерен в миллионах рублей, другой — в квадратных метрах (числа порядка десятков). Как это исказит результат регуляризации?


Задание 20: Для регрессии с числом признаков $p=20\,000$ и числом наблюдений $n=200$ (типичная генетическая задача) объясни, почему обычный МНК здесь принципиально не определён, а Ridge — определён всегда.


Задания-челленджи (21–30)

Задание 21: Докажи, что $w_{\text{Ridge}}=(X^\top X+\lambda I)^{-1}X^\top y$ — глобальный минимум $L_{\text{Ridge}}(w)$, а не просто стационарная точка.


Задание 22: Почему для Lasso при $p>n$ (признаков больше, чем наблюдений) решение может быть не единственным, тогда как Ridge всегда даёт единственное решение при том же соотношении $n$ и $p$?


Задание 23: Путь регуляризации Lasso (значения $w(\lambda)$ как функция $\lambda$) известен как кусочно-линейный. Основываясь на формуле мягкого порогового отображения для ортогонального случая, объясни, почему это разумно ожидать.


Задание 24: Объясни, почему leave-one-out кросс-валидация для подбора $\lambda$ у Ridge вычислительно значительно дешевле, чем для Lasso, если использовать сингулярное разложение $X$.


Задание 25: Используя связь с уроком про проксимальные методы, объясни, почему покоординатный спуск (следующий урок курса) — естественный алгоритм именно для Lasso, а не для Ridge.


Задание 26: Почему стандартная рекомендация — не регуляризовать свободный член (intercept) $w_0$ модели, штрафуя только веса при признаках?


Задание 27: Сформулируй, почему Elastic Net при сильно коррелированных признаках даёт более устойчивый (менее чувствительный к шуму в данных) отбор признаков, чем чистый Lasso, опираясь на геометрию области ограничения.


Задание 28: В формальном разделе про Lasso порог мягкого отображения был указан как $\lambda/2$, а не $\lambda$, при функции потерь $\|y-Xw\|_2^2+\lambda\|w\|_1$ (без множителя $\frac12$ перед квадратичным членом). Объясни происхождение этого множителя $\frac12$.


Задание 29: Почему разреженность решения, которую даёт Lasso, называют встроенной в процесс оптимизации, а не отдельным этапом предобработки данных — сравни с ручным отбором признаков «по одному» перед обучением обычной МНК-регрессии?


Задание 30: Обобщи в двух-трёх предложениях: чем регуляризация Ridge/Lasso, разобранная в этом уроке, отличается по цели от полиномиальной регрессии (урок 311) и что их всё же объединяет в контексте борьбы с переобучением?


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

Ошибка 1. Считают, что Ridge и Lasso — это «один и тот же метод регуляризации, просто с разным значением степени в штрафе», и что усиление Ridge рано или поздно тоже даст нулевые коэффициенты.

Как выглядит: «если увеличить alpha у Ridge до очень большого значения, часть коэффициентов тоже станет нулевой, просто нужно подождать».

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

Как правильно: формула $w_{\text{Ridge}}=w_{\text{МНК}}/(1+\lambda)$ даёт ровно ноль только при уже нулевом $w_{\text{МНК}}$ и ни при каком конечном $\lambda$ не занулит ненулевой коэффициент точно; обнуление возможно только у штрафа с изломом в нуле, то есть у $L_1$-части Lasso или Elastic Net.

Ошибка 2. Забывают стандартизировать признаки перед обучением Ridge или Lasso.

Как выглядит: обучают регуляризованную модель на признаках в исходных единицах измерения (рубли, метры, годы) без предварительного StandardScaler.

Почему возникает: обычный МНК инвариантен к масштабу признаков (перемасштабирование признака компенсируется обратным перемасштабированием его веса без изменения предсказаний), и легко по инерции считать, что регуляризованные версии ведут себя так же.

Как правильно: штраф $\lambda\sum w_i^2$ или $\lambda\sum|w_i|$ штрафует веса по абсолютной величине, не зная о масштабе соответствующего признака — без стандартизации регуляризация несправедливо сильнее давит на признаки с маленьким числовым диапазоном, искажая как значения весов, так и (для Lasso) то, какие признаки будут обнулены.

Ошибка 3. Подбирают $\lambda$ по ошибке на обучающей выборке, а не на кросс-валидации.

Как выглядит: перебирают сетку $\lambda$ и выбирают то значение, при котором MSE на train минимальна.

Почему возникает: кажется естественным доверять тому же критерию (ошибка на данных, на которых модель обучалась), который используется для подбора самих весов $w$.

Как правильно: ошибка на обучении при $\lambda\to0$ монотонно убывает (регуляризация по определению может только повысить ошибку на train по сравнению с чистым МНК) — минимизация train-ошибки по $\lambda$ тривиально даёт $\lambda=0$, что сводит на нет саму цель регуляризации; $\lambda$ нужно подбирать по ошибке кросс-валидации, как в уроке 306.

Ошибка 4. Интерпретируют нулевой коэффициент Lasso как доказательство того, что признак вообще не связан с целевой переменной.

Как выглядит: «Lasso обнулил коэффициент при этом признаке, значит признак точно бесполезен и его можно удалить из всех будущих анализов».

Почему возникает: обнуление выглядит как окончательный, математически строгий вердикт, а не как результат конкретной оптимизационной задачи с конкретным $\lambda$ на конкретной выборке.

Как правильно: обнуление означает лишь то, что при данном значении $\lambda$ и данном наборе остальных признаков этот признак не добавляет прироста качества, достаточного, чтобы преодолеть порог регуляризации — при другом $\lambda$, на другой выборке, или в присутствии/отсутствии коррелирующих признаков тот же признак может получить ненулевой коэффициент; нулевой вес Lasso — статистическое, а не причинно-следственное утверждение.

Ошибка 5. Используют чистый Lasso по умолчанию на данных с большим числом сильно коррелированных признаков, не рассматривая Elastic Net.

Как выглядит: автоматически ставят Lasso вместо ElasticNet для любой задачи с многими признаками, потому что «Lasso делает отбор признаков, а значит он лучше».

Почему возникает: способность к отбору признаков действительно ценное свойство, и легко упустить из виду его оборотную сторону — нестабильность выбора внутри коррелированных групп.

Как правильно: если среди признаков заведомо есть сильно коррелированные группы, чистый Lasso может произвольно и нестабильно выбирать одного «представителя» группы от выборки к выборке; Elastic Net с l1_ratio порядка $0{,}5$–$0{,}7$ обычно даёт более устойчивый и воспроизводимый набор отобранных признаков.

Ошибка 6. Путают параметр alpha в scikit-learn с коэффициентом смешивания в Elastic Net.

Как выглядит: при вызове ElasticNet(alpha=0.5) ожидают получить «равную смесь» Ridge и Lasso.

Почему возникает: в Ridge и Lasso параметр называется alpha и означает общую силу регуляризации $\lambda$, а в ElasticNet есть сразу два параметра — alpha (общая сила, тот же $\lambda$) и отдельно l1_ratio (доля $L_1$-части, обозначенная в этом уроке как $\alpha$ в формуле Elastic Net) — совпадение имени alpha в разных классах с разным математическим смыслом легко перепутать.

Как правильно: для управления балансом между $L_1$ и $L_2$ в ElasticNet нужно менять именно l1_ratio, а не alpha; при l1_ratio=0.5 получается равное по формуле смешение штрафов, а alpha всегда означает только общий масштаб регуляризации.

Главное запомнить

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

  • Ridge (L2): $L(w)=\|y-Xw\|_2^2+\lambda\|w\|_2^2$, аналитическое решение $w_{\text{Ridge}}=(X^\top X+\lambda I)^{-1}X^\top y$ — гарантированно определено и единственно при любом $\lambda>0$, даже если МНК не определён.

  • Ridge уменьшает все веса пропорционально, но не обнуляет их точно ни при каком конечном $\lambda$ — квадратичный штраф гладкий в нуле, и сила его притяжения к нулю линейно ослабевает вблизи нуля.

  • Lasso (L1): $L(w)=\|y-Xw\|_2^2+\lambda\|w\|_1$ — не имеет аналитического решения в общем случае; в ортогональном случае решение по каждой координате в точности совпадает с мягким пороговым отображением $S_\lambda$, доказанным в уроке про проксимальные методы.

  • Lasso даёт разреженные решения — часть весов обнуляется точно, а не приближённо — потому что штраф $|x|$ имеет постоянный по модулю наклон вплоть до самого нуля, в отличие от ослабевающего наклона $x^2$.

  • Геометрически область ограничения Ridge — гладкий круг (шар), у Lasso — ромб (многогранник) с острыми углами точно на осях координат; решение задачи с ограничением чаще касается границы именно в угле у Lasso, что и даёт нулевые координаты.

  • Elastic Net комбинирует оба штрафа ($\alpha=1$ — чистый Lasso, $\alpha=0$ — чистый Ridge) и решает главную слабость Lasso — нестабильный отбор внутри сильно коррелированных групп признаков.

  • Параметр силы регуляризации $\lambda$ — гиперпараметр, который нельзя подбирать по ошибке на обучении (минимизация там тривиально даёт $\lambda=0$); подбор делается через k-fold кросс-валидацию (RidgeCV, LassoCV, ElasticNetCV).

  • Признаки обязательно стандартизируют перед Ridge/Lasso/Elastic Net — иначе штраф несправедливо сильнее давит на признаки с меньшим числовым масштабом.

  • Выбор между методами прикладной: Lasso — когда нужен явный отбор признаков среди многих потенциально бесполезных; Ridge — когда веришь, что все признаки хоть немного значимы, но нужна устойчивость к мультиколлинеарности; Elastic Net — компромисс при сильно коррелированных группах признаков.

Связь с темами курса

Что нужно было знать до этого урока

Центральная математическая опора этого урока — доказанная в уроке 291 теорема о мягком пороговом отображении: прокс-оператор $L_1$-нормы, $\mathrm{prox}_{\lambda|\cdot|}(v)=S_\lambda(v)$, доказанный там через условие оптимальности $0\in\partial h(x^\star)$ по трём случаям знака. В этом уроке та же самая формула появилась снова, но уже не как абстрактная задача минимизации $\frac12(x-v)^2+\lambda|x|$, а как явное решение Lasso-регрессии для ортогонального дизайна признаков — прямое переиспользование готового результата в новом прикладном контексте. Не менее важна интуиция о том, почему $|x|$ негладкая функция с постоянным по модулю наклоном в обе стороны от нуля — этот факт восходит ещё к уроку 290 про субградиентные методы, где впервые вычислялся субдифференциал $\partial|0|=[-1,1]$. Также урок опирается на переобучение и bias-variance разложение из урока 304 (переобучение как рост дисперсии оценки при недостатке ограничений на модель) и на схему кросс-валидации из урока 306, без которой подбор гиперпараметра $\lambda$ был бы не строгой процедурой, а гаданием.

Что изучить дальше

Следующий урок 313 про логистическую регрессию покажет, что вся регуляризационная машинерия этого урока — Ridge, Lasso, Elastic Net, подбор $\lambda$ через кросс-валидацию — переносится на задачи классификации почти без изменений: в sklearn.linear_model.LogisticRegression параметры penalty='l1'/'l2'/'elasticnet' добавляют ровно те же штрафы к логарифмическому правдоподобию, что и в этом уроке к сумме квадратов ошибок. А чуть раньше, в уроке 292 про покоординатный спуск, тот факт, что soft thresholding возникает не только из проксимального градиентного шага, но и из точной покоординатной минимизации Lasso, объясняет, почему именно покоординатный спуск — стандартный решатель Lasso по умолчанию в scikit-learn, а не проксимальный градиентный метод из урока 291.

Ridge и Lasso — не соревнование, а два разных инструмента

Стоит явно закрыть вопрос, который часто формулируют неправильно: «что лучше, Ridge или Lasso?» Правильный вопрос — не «что лучше», а «что нужно решить в конкретной задаче». Если цель — снизить дисперсию оценки коэффициентов и справиться с мультиколлинеарностью, не выбрасывая ни одного признака (например, в эконометрике, где каждый предиктор имеет содержательный экономический смысл и его полное исключение нежелательно), Ridge — прямой и предсказуемый выбор с гарантированным аналитическим решением. Если же цель — не только регуляризовать, но и явно понять, какие из потенциально многих признаков модель считает значимыми (геномика, текстовые n-граммы, автоматически сгенерированные признаки), разреженность Lasso превращается из побочного эффекта в главную практическую ценность. А когда среди признаков заведомо есть сильно коррелированные группы и при этом всё равно нужен отбор, Elastic Net снимает главное противоречие между этими двумя целями за счёт одновременного использования обоих штрафов.

Где это нужно в жизни

🏠 Оценка недвижимости и эконометрика. Модели ценообразования с десятками потенциально коррелированных признаков (площадь, число комнат, этаж, район, расстояние до метро, год постройки) — классический сценарий для Ridge, где важно сохранить интерпретацию каждого признака, но снизить неустойчивость коэффициентов из-за корреляций между ними.

🧬 Геномика и биоинформатика. Задачи вида «предсказать исход лечения по экспрессии $20\,000$ генов у $200$ пациентов» — типичный случай $p\gg n$, где Lasso не просто улучшает качество, а единственно делает задачу вообще разрешимой и одновременно указывает на конкретные гены-кандидаты для дальнейшего биологического исследования.

📝 Обработка текста. При использовании мешка слов или n-грамм как признаков (десятки тысяч потенциальных столбцов, из которых реально значимы немногие) Lasso и Elastic Net регулярно применяются именно ради отбора признаков — итоговая модель использует лишь малую долю словаря, что ускоряет инференс и упрощает интерпретацию.

⚙️ Пайплайны производственного ML. RidgeCV/LassoCV/ElasticNetCV — стандартный первый шаг baseline-модели (базовой, отправной модели для сравнения) почти в любом табличном ML-проекте: они дёшевы в обучении, дают интерпретируемые коэффициенты и — в случае Lasso — встроенный отбор признаков ещё до перехода к более сложным моделям вроде градиентного бустинга.

Интересные факты

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

  • Название LASSO — не случайное слово, а акроним: Least Absolute Shrinkage and Selection Operator, специально придуманный Робертом Тибширани в 1996 году так, чтобы одновременно отразить обе функции метода — сжатие коэффициентов (shrinkage) и отбор признаков (selection).

  • Путь коэффициентов Lasso в зависимости от $\lambda$ кусочно-линеен — это свойство используется в алгоритме LARS (Least Angle Regression), который умеет вычислить весь путь регуляризации целиком за вычислительную стоимость, сравнимую с одним обучением обычной МНК-регрессии, вместо того чтобы решать задачу заново для каждого значения $\lambda$ из сетки по отдельности.

  • В одной и той же задаче с ортогональными стандартизированными признаками Ridge и Lasso сводятся к двум формулам буквально в одну строку каждая — $w/(1+\lambda)$ и $S_\lambda(w)$, — и вся принципиальная разница в поведении двух самых используемых методов регуляризации в машинном обучении помещается в сравнение этих двух коротких выражений.

Лайфхаки

  • Начинай с RidgeCV или LassoCV (или ElasticNetCV) практически в любой задаче табличной регрессии с числовыми признаками — это дешёвая и надёжная базовая модель (baseline), которая сразу же покажет, есть ли в данных сильная мультиколлинеарность или явно бесполезные признаки, ещё до перехода к более тяжёлым моделям.

  • Если главная цель — отбор признаков и интерпретируемость итоговой модели, выбирай Lasso; если признаков не так много, все считаются содержательно значимыми и просто нужна устойчивость коэффициентов — выбирай Ridge; если признаков много и среди них заведомо есть коррелированные группы, начинай сразу с Elastic Net, а не выбирай между Ridge и Lasso вслепую.

  • Всегда стандартизируй признаки (StandardScaler) перед Ridge/Lasso/Elastic Net и делай это внутри Pipeline, а не вручную до разбиения на train/test — иначе легко случайно «подсмотреть» статистики теста при масштабировании — это называют утечкой данных (data leakage).

  • Если Lasso зануляет неожиданно много или неожиданно мало признаков, прежде чем менять модель, проверь масштаб alpha относительно масштаба целевой переменной и признаков — одна и та же по смыслу сила регуляризации может требовать очень разных числовых значений alpha в зависимости от того, как отмасштабированы данные.

  • Не интерпретируй нулевой коэффициент Lasso как окончательное доказательство «признак не важен» — перепроверь устойчивость отбора через несколько разных разбиений на train/test или через ElasticNet, особенно если среди признаков могут быть скрытые корреляции.

  • Держи в голове флагманскую пару формул этого урока — $w/(1+\lambda)$ для Ridge и $S_\lambda(w)$ для Lasso на ортогональных признаках — как быстрый ментальный тест: если предложенный кем-то штраф гладкий в нуле (как квадрат), он не даст точного обнуления вне зависимости от заявлений о его «разреженности»; излом в нуле обязателен.

Урок про проксимальные методы доказал абстрактную теорему о мягком пороговом отображении, ничего не говоря про регрессию напрямую. Этот урок показал, что та же самая теорема, без единого изменения в формуле, — это и есть математическое ядро одного из самых используемых инструментов практического машинного обучения: способа сказать модели «доверяй данным, но не слишком» и получить взамен либо устойчивые, либо ещё и разреженные, интерпретируемые веса. В следующем уроке ты увидишь, как ровно та же самая идея штрафа на веса переносится с задачи регрессии на задачу классификации — логистическая регрессия с $L_1$- и $L_2$-регуляризацией устроена математически почти идентично тому, что было разобрано здесь.

Понял тему? Закрепи в боте! 🚀

Попрактикуйся на задачах и получи персональные рекомендации от AI

💪 Начать тренировку
💬 Есть вопрос? Спроси бота!