Содержание курса 08 / 27

08 / 27 · Линейная регрессия

Регуляризация

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

На этой странице 12

Заметка об оптимизаторах завершила механику: метод наименьших квадратов можно обучить при любом числе примеров и признаков. Проблема теперь не в том, чтобы обучить модель, а в том, чтобы доверять результату. Заметка о методе наименьших квадратов показала два почти одинаковых признака, коэффициенты которых от одной реализации шума к другой скакали между −9.90-9.90 и 11.8811.88, и R2R^2 на обучении, который с 40 бесполезными признаками поднялся до 0.920.92, а R2R^2 на валидации упал ниже нуля. Эта заметка меняет не оптимизатор, а целевую функцию: она добавляет штраф, который делает большие веса дорогими. Штраф обменивает небольшое смещение на сильное уменьшение разброса, имеет байесовскую интерпретацию как априорное распределение, а в форме L1 отбирает признаки, обнуляя веса в точности.

Обозначения. Как и в заметке о методе наименьших квадратов, X∈Rn×dX \in \mathbb R^{n \times d} — матрица признаков, y∈Rny \in \mathbb R^n — целевые значения. Во всей заметке признаки стандартизованы (среднее 0, дисперсия 1), а целевая переменная центрирована, поэтому свободный член не нужен: он равен yˉ\bar y и никогда не штрафуется. λ≥0\lambda \ge 0 — сила штрафа, ∥w∥22=∑jwj2\lVert w\rVert_2^2 = \sum_j w_j^2 и ∥w∥1=∑j∣wj∣\lVert w\rVert_1 = \sum_j \lvert w_j\rvert. p=rank⁡X≤min⁡(n,d)p = \operatorname{rank} X \le \min(n, d) — ранг матрицы признаков. Её сингулярное разложение — X=UΣV⊤X = U\Sigma V^\top, где у U∈Rn×pU \in \mathbb R^{n \times p} и V∈Rd×pV \in \mathbb R^{d \times p} ортонормированные столбцы uju_j и vjv_j, а Σ\Sigma — диагональная матрица с сингулярными числами σ1≥⋯≥σp>0\sigma_1 \ge \dots \ge \sigma_p > 0 (всегда с индексом, в отличие от уровня шума σ\sigma), так что ненулевые собственные числа X⊤XX^\top X равны σj2\sigma_j^2. S(z,a)=sign⁡(z)max⁡(∣z∣−a,0)S(z, a) = \operatorname{sign}(z)\max(\lvert z\rvert - a, 0) — функция мягкого порогового отсечения (soft thresholding).

Гребневая регрессия: штраф на величину весов#

Гребневая регрессия (ridge regression; Hoerl and Kennard, 1970) минимизирует квадратичную ошибку плюс квадрат длины вектора весов:

w^λ=arg⁡min⁡w  ∥y−Xw∥2+λ∥w∥22.\hat w_\lambda = \arg\min_w \; \lVert y - Xw\rVert^2 + \lambda\lVert w\rVert_2^2 .

Градиент равен 2X⊤(Xw−y)+2λw2X^\top(Xw - y) + 2\lambda w, и, приравняв его к нулю, получаем

w^λ=(X⊤X+λI)−1X⊤y.\hat w_\lambda = (X^\top X + \lambda I)^{-1}X^\top y .

Собственные числа матрицы X⊤X+λIX^\top X + \lambda I равны σj2+λ\sigma_j^2 + \lambda (и λ\lambda вдоль направлений, где данных нет), все они не меньше λ\lambda. При любом λ>0\lambda > 0 она положительно определена и обратима: решение существует и единственно даже при коллинеарных признаках или при числе признаков больше числа примеров — в тех случаях, где метод наименьших квадратов ломался. Масштаб важен: штраф одинаково относится к весу 1 у признака, измеренного в метрах, и у признака, измеренного в миллиметрах, поэтому признаки сначала стандартизуют, а статистики вычисляют только по обучающим данным.

Разобранный пример. Один признак x=(−1,0,1)x = (-1, 0, 1) и центрированная целевая переменная y=(−2,0,2)y = (-2, 0, 2): x⊤x=2x^\top x = 2 и x⊤y=4x^\top y = 4. Метод наименьших квадратов даёт w=4/2=2w = 4/2 = 2; гребневая регрессия с λ=2\lambda = 2 даёт 4/(2+2)=14/(2 + 2) = 1, вдвое меньше. Теперь продублируем признак, X=[x,x]X = [x, x]. У метода наименьших квадратов бесконечно много решений — все (w1,w2)(w_1, w_2) с w1+w2=2w_1 + w_2 = 2. У гребневой регрессии решение одно: по симметрии w1=w2=aw_1 = w_2 = a, и первое уравнение системы (X⊤X+2I)w=X⊤y(X^\top X + 2I)w = X^\top y имеет вид 4a+2a=44a + 2a = 4, так что a=2/3a = 2/3. Штраф делит вес поровну между одинаковыми признаками — это разбиение с наименьшей нормой.

На почти одинаковых признаках из заметки о методе наименьших квадратов (корреляция 0.99990.9999, истинные веса (1,1)(1, 1)) три новые реализации шума дают веса по методу наименьших квадратов (4.81,−2.86)(4.81, -2.86), (−15.84,17.95)(-15.84, 17.95) и (−0.11,2.09)(-0.11, 2.09), а гребневая регрессия с λ=1\lambda = 1 — (0.99,0.95)(0.99, 0.95), (0.97,1.13)(0.97, 1.13) и (0.98,0.99)(0.98, 0.99) (раздел «Код»).

Какие направления она сжимает#

Подставим сингулярное разложение. Поскольку X⊤X=VΣ2V⊤X^\top X = V\Sigma^2V^\top и X⊤y=VΣU⊤yX^\top y = V\Sigma U^\top y, прогнозы равны

Xw^λ=∑j=1puj σj2σj2+λ uj⊤y.X\hat w_\lambda = \sum_{j=1}^p u_j\, \frac{\sigma_j^2}{\sigma_j^2 + \lambda}\, u_j^\top y .

Метод наименьших квадратов проецирует yy на каждое главное направление данных uju_j и сохраняет проекцию полностью. Гребневая регрессия умножает её на σj2/(σj2+λ)\sigma_j^2/(\sigma_j^2 + \lambda): направления, в которых признаки сильно меняются (σj2≫λ\sigma_j^2 \gg \lambda), сохраняются почти без изменений, а направления малой дисперсии (σj2≪λ\sigma_j^2 \ll \lambda) сжимаются почти до нуля (Hastie, Tibshirani and Friedman, 2009, раздел 3.4.1). Это ровно те направления, из-за которых метод наименьших квадратов был неустойчив, потому что дисперсия коэффициентов метода наименьших квадратов вдоль vjv_j равна σ2/σj2\sigma^2/\sigma_j^2. Сумма множителей, df⁡(λ)=∑jσj2/(σj2+λ)\operatorname{df}(\lambda) = \sum_j \sigma_j^2/(\sigma_j^2 + \lambda), равна следу матрицы-шляпы гребневой регрессии и называется эффективным числом степеней свободы (effective degrees of freedom): pp при λ=0\lambda = 0 и стремится к 0 при λ→∞\lambda \to \infty.

На данных о диабете (442 пациента, 10 стандартизованных признаков) собственные числа X⊤XX^\top X меняются от 1778.71778.7 до 34.634.6 и 3.83.8. Наименьшее отвечает комбинации, в которой преобладают измерения сыворотки крови s1 и s2 с корреляцией 0.900.90. При λ=10\lambda = 10 наибольшее направление сохраняется с множителем 0.9940.994, два наименьших — с 0.7760.776 и 0.2750.275, а df⁡=8.83\operatorname{df} = 8.83; при λ=100\lambda = 100 получаем df⁡=6.59\operatorname{df} = 6.59; при λ=1000\lambda = 1000 — 2.512.51.

Сжатие вносит смещение: E[w^λ]=(X⊤X+λI)−1X⊤X w≠wE[\hat w_\lambda] = (X^\top X + \lambda I)^{-1}X^\top X\, w \ne w. Дисперсии оно убирает гораздо больше, поэтому среднеквадратичная ошибка может уменьшиться — это компромисс из заметки об оценках, который заметка о смещении и разбросе применяет ко всем моделям курса.

Байесовская интерпретация#

Штраф — это априорное распределение. При гауссовском шуме с дисперсией σ2\sigma^2 и независимых априорных распределениях wj∼N(0,τ2)w_j \sim N(0, \tau^2) отрицательный логарифм апостериорной плотности равен целевой функции гребневой регрессии, делённой на 2σ22\sigma^2, с λ=σ2/τ2\lambda = \sigma^2/\tau^2; априорное распределение Лапласа p(wj)∝e−∣wj∣/bp(w_j) \propto e^{-\lvert w_j\rvert/b} даёт штраф L1 лассо (см. ниже) с λ=2σ2/b\lambda = 2\sigma^2/b. Вывод приведён в разделе о MAP-оценке заметки о байесовском выводе. Здесь стоит отметить два следствия:

  • Сильный штраф — уверенное априорное убеждение, что веса малы; λ→0\lambda \to 0 — плоское априорное распределение, которое возвращает метод наименьших квадратов.
  • Для гауссовского априорного распределения апостериорное тоже гауссовское, поэтому w^λ\hat w_\lambda — одновременно его мода и среднее, а апостериорная ковариационная матрица σ2(X⊤X+λI)−1\sigma^2(X^\top X + \lambda I)^{-1} даёт неопределённости. Для априорного распределения Лапласа оценка лассо — только мода; апостериорное распределение приписывает нулевую вероятность тому, что вес в точности равен 0, так что разреженность, о которой пойдёт речь ниже, — свойство оптимизации, а не апостериорного распределения.

Форма с ограничением: почему L1 даёт нули#

Для каждого λ\lambda существует радиус tt, при котором задача со штрафом имеет то же решение, что и задача с ограничением,

min⁡w∥y−Xw∥2при условии∥w∥2≤t(гребневая)или∥w∥1≤t(лассо),\min_w \lVert y - Xw\rVert^2 \quad \text{при условии} \quad \lVert w\rVert_2 \le t \quad (\text{гребневая}) \qquad \text{или} \quad \lVert w\rVert_1 \le t \quad (\text{лассо}) ,

по лагранжевой двойственности выпуклых задач: λ\lambda — множитель ограничения, и меньшему tt соответствует большее λ\lambda. Форма с ограничением объясняет разное поведение двух штрафов.

Рисунок

Почему лассо обнуляет веса, а гребневая регрессия нет

Линии уровня и допустимые множества L2 и L1Две панели. В каждой — наклонные эллипсы вокруг точки ŵ в первом квадранте. Слева затенённый круг, жирный эллипс касается его в точке с двумя положительными координатами. Справа затенённый ромб, жирный эллипс касается его верхнего угла на оси w₂.гребневая: ‖w‖₂ ≤ 1w₁w₂ŵ (МНК)w = (0.54, 0.85)лассо: ‖w‖₁ ≤ 1w₁w₂ŵ (МНК)w = (0, 1)Линии уровня и допустимые множества L2 и L1Две панели. В каждой — наклонные эллипсы вокруг точки ŵ в первом квадранте. Слева затенённый круг, жирный эллипс касается его в точке с двумя положительными координатами. Справа затенённый ромб, жирный эллипс касается его верхнего угла на оси w₂.гребневая: ‖w‖₂ ≤ 1w₁w₂ŵ (МНК)w = (0.54, 0.85)лассо: ‖w‖₁ ≤ 1w₁w₂ŵ (МНК)w = (0, 1)
Задача с ограничением в двух измерениях. Эллипсы — линии уровня квадратичной функции потерь вокруг решения МНК ŵ = (0.8, 2.2); затенено допустимое множество: круг ‖w‖₂ ≤ 1 для гребневой регрессии и ромб ‖w‖₁ ≤ 1 для лассо. Решение — точка, где самый маленький эллипс касается множества (жирная линия). Граница круга гладкая, эллипс касается её в точке общего положения, (0.54, 0.85), и оба веса ненулевые. У ромба есть углы на осях; эллипс, подходящий с широкого диапазона направлений, первым задевает угол (0, 1), и вес w₁ становится ровно нулём. Значения потерь в решениях: 1.133 и 1.520.

Линии уровня квадратичной ошибки — эллипсы вокруг решения метода наименьших квадратов w^\hat w. Решение задачи с ограничением — точка допустимого множества на самой низкой линии уровня, то есть точка, где растущий эллипс впервые касается множества. Шар L2 круглый, поэтому точка касания оказывается там, куда её помещает форма эллипса, и в общем случае все координаты ненулевые. Шар L1 — ромб (кросс-политоп в dd измерениях), углы которого лежат на осях, и эти углы выступают: эллипс, подходящий с широкого диапазона направлений, первым задевает угол, а в углу часть координат в точности равна нулю. На рисунке это условие видно как вычисление: в углу (0,1)(0, 1) антиградиент функции потерь равен (1.4,1.6)(1.4, 1.6) и лежит строго между нормалями (1,1)(1, 1) и (−1,1)(-1, 1) двух сходящихся там рёбер, поэтому никакое движение вдоль границы ромба не уменьшает потери.

Лассо#

Лассо (lasso; Tibshirani, 1996) — задача со штрафом L1:

w^=arg⁡min⁡w  ∥y−Xw∥2+λ∥w∥1.\hat w = \arg\min_w \; \lVert y - Xw\rVert^2 + \lambda\lVert w\rVert_1 .

Она выпукла, но недифференцируема там, где вес равен нулю, и в общем случае не имеет замкнутой формулы. При ортонормированных признаках, X⊤X=IX^\top X = I, формула есть. Обозначим z=X⊤yz = X^\top y — в этом случае это решение метода наименьших квадратов; тогда ∥y−Xw∥2=∥y∥2−2w⊤z+∥w∥2\lVert y - Xw\rVert^2 = \lVert y\rVert^2 - 2w^\top z + \lVert w\rVert^2, и целевая функция распадается на отдельные задачи по координатам, min⁡wjwj2−2zjwj+λ∣wj∣\min_{w_j} w_j^2 - 2z_jw_j + \lambda\lvert w_j\rvert. При wj>0w_j > 0 производная 2wj−2zj+λ2w_j - 2z_j + \lambda обращается в ноль в точке wj=zj−λ/2w_j = z_j - \lambda/2, которая положительна, только если zj>λ/2z_j > \lambda/2; симметрично для wj<0w_j < 0; в остальных случаях минимум в 0. Вместе:

w^jlasso=S(zj,λ/2),w^jridge=zj1+λ.\hat w_j^{\text{lasso}} = S(z_j, \lambda/2), \qquad \hat w_j^{\text{ridge}} = \frac{z_j}{1 + \lambda} .

Гребневая регрессия уменьшает каждый коэффициент в одно и то же число раз; лассо вычитает одну и ту же величину из модуля каждого коэффициента и обнуляет те, что меньше λ/2\lambda/2.

Разобранный пример. Ортонормированные признаки с z=(3,1,−0.5)z = (3, 1, -0.5) и λ=2\lambda = 2. Лассо даёт (S(3,1),S(1,1),S(−0.5,1))=(2,0,0)(S(3, 1), S(1, 1), S(-0.5, 1)) = (2, 0, 0): два признака отброшены. Гребневая регрессия даёт (3,1,−0.5)/3=(1,0.333,−0.167)(3, 1, -0.5)/3 = (1, 0.333, -0.167): все три сохранены, но уменьшены. Lasso из scikit-learn минимизирует 12n∥y−Xw∥2+α∥w∥1\frac{1}{2n}\lVert y - Xw\rVert^2 + \alpha\lVert w\rVert_1, поэтому его α\alpha в единицах этой заметки равно λ/(2n)\lambda/(2n); с таким пересчётом он возвращает (2,0,0)(2, 0, 0) (раздел «Код»).

Покоординатный спуск (coordinate descent). Для общей матрицы XX будем минимизировать по одному весу за раз при фиксированных остальных. Одномерная задача совпадает с ортонормированной, только zz заменяется на корреляцию признака jj с частичным остатком (partial residual) r(j)=y−∑k≠jxkwkr^{(j)} = y - \sum_{k \ne j}x_k w_k:

wj←S(xj⊤r(j), λ/2)xj⊤xj.w_j \leftarrow \frac{S\big(x_j^\top r^{(j)},\ \lambda/2\big)}{x_j^\top x_j} .

Циклический обход координат для лассо сходится (Friedman et al., 2007), а вычисление решений для убывающей последовательности λ\lambda, каждое из которых стартует с предыдущего, дёшево даёт весь путь регуляризации (regularization path); так и делает scikit-learn. Родственный метод делает градиентный шаг по квадратичной ошибке, а затем применяет мягкое пороговое отсечение ко всем координатам (проксимальный градиентный метод); алгоритм регрессии наименьших углов (least angle regression) вычисляет путь точно, потому что он кусочно-линеен по λ\lambda (Efron et al., 2004).

Где начинается путь. В точке w=0w = 0 условие оптимальности через субградиент имеет вид ∣2xj⊤y∣≤λ\lvert 2x_j^\top y\rvert \le \lambda для всех jj. Поэтому все веса равны нулю при λ≥λmax⁡=2max⁡j∣xj⊤y∣\lambda \ge \lambda_{\max} = 2\max_j\lvert x_j^\top y\rvert, и первым входит признак, сильнее всех коррелирующий с целевой переменной. На данных о диабете λmax⁡=39 921\lambda_{\max} = 39\,921, и достигается он на bmi.

Рисунок

Пути коэффициентов гребневой регрессии и лассо

Пути регуляризации на данных о диабетеДве панели с десятью кривыми коэффициентов. Слева гребневые кривые плавно сходятся к нулю при росте λ. Справа кривые лассо по очереди упираются в ноль и остаются в нём; последней обнуляется кривая bmi.гребневая: ‖y − Xw‖² + λ‖w‖²−40−200204010⁻¹10¹10³10⁵λsexbmis1s2s5лассо: ‖y − Xw‖² + λ‖w‖₁−40−200204010²10³10⁴λsexbmis1s2s5Пути регуляризации на данных о диабетеДве панели с десятью кривыми коэффициентов. Слева гребневые кривые плавно сходятся к нулю при росте λ. Справа кривые лассо по очереди упираются в ноль и остаются в нём; последней обнуляется кривая bmi.гребневая: ‖y − Xw‖² + λ‖w‖²−40−200204010⁻¹10¹10³10⁵λsexbmis1s2s5лассо: ‖y − Xw‖² + λ‖w‖₁−40−200204010²10³10⁴λsexbmis1s2s5
Данные о диабете (442 пациента, 10 стандартизованных признаков), коэффициенты как функции силы штрафа λ в логарифмическом масштабе; слева от каждой панели — решение МНК. Гребневая регрессия сжимает все коэффициенты плавно, и ни один не становится нулём; первыми сжимаются направления малой дисперсии, поэтому противоположные коэффициенты сильно коррелированных s1 и s2 (−37.7 и 22.7) быстро сближаются. Лассо обнуляет коэффициенты по одному: при λ ≥ 2·max|xⱼᵀy| = 39 921 все веса равны нулю, а при уменьшении λ признаки входят в модель в порядке bmi, s5, bp, s3, sex, s6, s1, s4, s2, age. Пунктир — λ, выбранная кросс-валидацией: 1 для гребневой регрессии (почти МНК) и 884 для лассо, где ненулевых весов 7.

Два пути на рисунке показывают разницу на реальных данных. Гребневая регрессия стягивает противоположные коэффициенты коррелированной пары s1 и s2 (−37.7-37.7 и 22.722.7 в методе наименьших квадратов) друг к другу, а затем оба к нулю; ни один коэффициент никогда не становится в точности нулём. Лассо при уменьшении λ\lambda добавляет признаки по одному, в порядке bmi, s5, bp, s3, sex, s6, s1, s4, s2, age, и при значении, выбранном кросс-валидацией, оставляет семь из десяти.

Коррелированные признаки: эластичная сеть#

Отбор лассо неустойчив внутри группы коррелированных признаков. Когда два признака несут один и тот же сигнал, штраф L1 одинаков при любом разбиении веса между ними, ∣a∣+∣b∣=∣a+b∣\lvert a\rvert + \lvert b\rvert = \lvert a + b\rvert для весов одного знака, а квадратичная ошибка почти не различает разбиения, поэтому лассо склонно оставить один признак и отбросить другой, причём какой именно — зависит от шума. На двух копиях одного сигнала с корреляцией 0.9990.999 плюс бесполезный признак три реализации данных дают веса лассо (1.46,0,0)(1.46, 0, 0), (0,1.40,0)(0, 1.40, 0) и (0.60,0.76,0)(0.60, 0.76, 0) (α=0.5\alpha = 0.5 в scikit-learn).

Эластичная сеть (elastic net; Zou and Hastie, 2005) добавляет гребневый член: λ1∥w∥1+λ2∥w∥22\lambda_1\lVert w\rVert_1 + \lambda_2\lVert w\rVert_2^2. Квадратичный член строго выпуклый, поэтому предпочитает равное разбиение, и теорема 1 статьи ограничивает разность весов двух признаков величиной, кратной 1−ρ\sqrt{1 - \rho}, где ρ\rho — их корреляция: это эффект группировки (grouping effect). Те же три реализации дают (0.76,0.76,0)(0.76, 0.76, 0), (0.72,0.74,0)(0.72, 0.74, 0) и (0.71,0.72,0)(0.71, 0.72, 0) (в scikit-learn α=0.5\alpha = 0.5 и l1_ratio=0.5), и бесполезный признак по-прежнему удалён.

Выбор штрафа по валидации#

Сила штрафа — гиперпараметр, и заметка о валидации даёт процедуру: обучить модель для сетки значений λ\lambda в логарифмическом масштабе, оценить ошибку каждой кросс-валидацией, оставить лучшую, а итоговое качество сообщить по вложенной схеме или на тестовой выборке, поскольку лучшая из многих кросс-валидационных оценок оптимистична. У гребневой регрессии есть короткий путь: её прогнозы линейны по yy, y^=Hλy\hat y = H_\lambda y, а остаток при исключении одного объекта (leave-one-out) равен (yi−y^i)/(1−hii)(y_i - \hat y_i)/(1 - h_{ii}), так что кросс-валидация с исключением по одному стоит одного обучения на каждое λ\lambda (Hastie, Tibshirani and Friedman, 2009, раздел 7.10.1, формула 7.51); этим пользуется RidgeCV из scikit-learn.

Насколько помогает регуляризация, зависит от того, сколько признаков приходится на один пример. На данных о диабете R2R^2 на 5-кратной кросс-валидации:

ПризнакиЧислоМНКГребневая, лучшая λ\lambdaЛассо, лучшее α\alpha
исходные100.4890.4890.4900.490 (λ=1\lambda = 1)0.4900.490 (α=1\alpha = 1)
со всеми произведениями степени 2650.4120.4120.4750.475 (λ=100\lambda = 100)0.4900.490 (α=2\alpha = 2)
со всеми произведениями до степени 3285−41.7-41.70.4410.441 (λ=300\lambda = 300)0.4700.470 (α=3\alpha = 3)

При десяти признаках и 442 пациентах дисперсия метода наименьших квадратов уже мала, и штраф ничего не меняет. При 285 признаках и примерно 350 обучающих пациентах в каждом фолде метод наименьших квадратов подгоняется под шум настолько сильно, что его R2R^2 на валидации равен −41.7-41.7; гребневая регрессия и лассо возвращают его к 0.440.44 и 0.470.47. На этих данных добавленные признаки несут мало сигнала, и лучшие регуляризованные модели лишь сравниваются с простой линейной моделью на исходных десяти; регуляризация делает много признаков безопасными, но не полезными.

Другие способы ограничить модель действуют как штрафы и появятся в курсе позже: ранняя остановка градиентного спуска (примерно штраф L2 с λ≈1/(ητ)\lambda \approx 1/(\eta\tau) после τ\tau шагов), дропаут и аугментация данных — все в заметке об обучении, а также стрижка (pruning) в заметке о решающих деревьях. Затухание весов (weight decay) — уменьшение каждого веса на фиксированную долю на каждом шаге — для обычного SGD совпадает со штрафом L2; с адаптивными оптимизаторами вроде Adam они различаются, и на практике используют развязанную форму, AdamW (затухание весов при Adam). Затухание весов регуляризует дообучение языковых моделей, а штраф L1 на активации делает разреженный автоэнкодер разреженным.

Что изменилось#

Метод наименьших квадратовГребневая регрессияЛассо
Целевая функция∥y−Xw∥2\lVert y - Xw\rVert^2+ λ∥w∥22+\,\lambda\lVert w\rVert_2^2+ λ∥w∥1+\,\lambda\lVert w\rVert_1
Решение(X⊤X)−1X⊤y(X^\top X)^{-1}X^\top y, если существует(X⊤X+λI)−1X⊤y(X^\top X + \lambda I)^{-1}X^\top y, всегдазамкнутой формулы нет; покоординатный спуск
Коллинеарные признаки или d>nd > nне единственно, неустойчивоединственно, вес делитсяпрогнозы единственны, отбор внутри групп неустойчив
Нулине навязываютсяне навязываются (только случайно)точные нули: отбор признаков
Априорное распределениеплоскоегауссовскоеЛапласа (как MAP)
Гиперпараметрнетλ\lambda, кросс-валидациейλ\lambda, кросс-валидацией
Смещение и разброснесмещённый, большой разброссмещённая, меньший разброссмещённое, меньший разброс

Ограничения#

  • Штраф зависит от единиц измерения. Признаки нужно стандартизовать, и результат меняется с выбранным масштабированием.
  • Смещение. Оба штрафа сжимают и большие истинные коэффициенты; оценки лассо для оставленных признаков смещены к нулю, и обычное лекарство — заново обучить метод наименьших квадратов на отобранных признаках.
  • Лассо оставляет не больше nn признаков, когда d>nd > n и признаки находятся в общем положении, например взяты из непрерывного распределения: тогда решение с вероятностью единица единственно и имеет не больше nn ненулевых весов (Tibshirani, 2013). При точно продублированных столбцах подгонка остаётся единственной, а веса — нет: любое разделение веса между двумя копиями с одинаковым знаком даёт ту же подгонку и тот же штраф. Внутри сильно коррелированных групп выбор произволен; эластичная сеть смягчает оба ограничения.
  • Отбор — не статистический вывод. Признак, отброшенный лассо, всё ещё может быть важен, а стандартные ошибки, вычисленные после отбора, занижены.
  • Ещё один гиперпараметр. λ\lambda стоит цикла кросс-валидации, а для честной оценки ошибки тогда нужна вложенная.

Что нужно запомнить#

  • Гребневая регрессия: w^λ=(X⊤X+λI)−1X⊤y\hat w_\lambda = (X^\top X + \lambda I)^{-1}X^\top y, единственное решение при любом λ>0\lambda > 0; она сжимает каждое главное направление с множителем σj2/(σj2+λ)\sigma_j^2/(\sigma_j^2 + \lambda), сильнее всего — направления малой дисперсии; df⁡(λ)=∑jσj2/(σj2+λ)\operatorname{df}(\lambda) = \sum_j \sigma_j^2/(\sigma_j^2 + \lambda).
  • Штрафы — это априорные распределения: гауссовское даёт гребневую регрессию с λ=σ2/τ2\lambda = \sigma^2/\tau^2, распределение Лапласа даёт лассо как MAP-оценку.
  • У шара L1 углы на осях, поэтому лассо обнуляет веса в точности; при ортонормированных признаках оно применяет к коэффициентам метода наименьших квадратов мягкое пороговое отсечение с порогом λ/2\lambda/2, а гребневая регрессия делит их на 1+λ1 + \lambda.
  • Все веса лассо равны нулю при λ≥2max⁡j∣xj⊤y∣\lambda \ge 2\max_j\lvert x_j^\top y\rvert; путь вычисляется покоординатным спуском с тёплым стартом (warm start).
  • Эластичная сеть добавляет член L2, чтобы коррелированные признаки делили вес между собой.
  • Стандартизуйте признаки, не штрафуйте свободный член, выбирайте λ\lambda кросс-валидацией и сообщайте качество по вложенной кросс-валидации.

Код#

Разобранные примеры, гребневая регрессия на коллинеарных признаках, множители сжатия и путь лассо на данных о диабете, кросс-валидация с полиномиальными признаками и эластичная сеть. Напечатанные числа получены с NumPy 2.1.3 и scikit-learn 1.9.1, и при max_iter=50_000 ни одна подгонка лассо не выдаёт предупреждения о сходимости:

import numpy as np, warnings
from sklearn.datasets import load_diabetes
from sklearn.linear_model import Ridge, Lasso, ElasticNet, LinearRegression, lasso_path
from sklearn.model_selection import KFold, cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
warnings.filterwarnings('ignore', category=FutureWarning)   # только уведомление scikit-learn 1.9 об n_alphas; предупреждения о сходимости остаются
rng = np.random.default_rng(0)
ridge = lambda X, y, lam: np.linalg.solve(X.T @ X + lam * np.eye(X.shape[1]), X.T @ y)

# разобранный пример: x = (-1, 0, 1), центрированный y = (-2, 0, 2); затем тот же признак дважды
x = np.array([[-1.], [0], [1]]); y = np.array([-2., 0, 2])
print(ridge(x, y, 1e-12), ridge(x, y, 2.0), ridge(np.hstack([x, x]), y, 2.0).round(3))   # [2.] [1.] [0.667 0.667]

# ортонормированные признаки: лассо применяет к z = X^T y мягкое отсечение с порогом lambda/2, гребневая делит на 1 + lambda
n = 50
Xo = np.linalg.qr(rng.normal(size=(n, 3)))[0]            # ортонормированные столбцы
z = np.array([3.0, 1.0, -0.5]); yo = Xo @ z
lam = 2.0                                                # целевая функция |y - Xw|^2 + lam |w|_1; alpha в scikit-learn = lam / (2n)
print(Lasso(alpha=lam / (2 * n), fit_intercept=False, tol=1e-12).fit(Xo, yo).coef_.round(3) + 0, ridge(Xo, yo, lam).round(3))
# [2. 0. 0.] [ 1.     0.333 -0.167]

# два почти одинаковых признака (пример из заметки о методе наименьших квадратов): гребневая с lambda = 1 устойчива
x1 = rng.normal(size=100); X2 = np.column_stack([x1, x1 + 0.01 * rng.normal(size=100)])
for _ in range(3):
    t = X2.sum(1) + rng.normal(size=100)
    print(np.linalg.lstsq(X2, t, rcond=None)[0].round(2), ridge(X2, t, 1.0).round(2))
# [ 4.81 -2.86] [0.99 0.95] | [-15.84  17.95] [0.97 1.13] | [-0.11  2.09] [0.98 0.99]

# диабет, стандартизованные признаки и центрированная цель: замкнутая формула = scikit-learn, сжатие по главным направлениям
X, yd = load_diabetes(return_X_y=True)
Xs = (X - X.mean(0)) / X.std(0); yc = yd - yd.mean()
print(np.abs(ridge(Xs, yc, 10.0) - Ridge(alpha=10.0).fit(Xs, yc).coef_).max() < 1e-9)   # True
d2 = np.linalg.eigvalsh(Xs.T @ Xs)[::-1]
print(d2.round(1))
for lam in (1, 10, 100, 1000):
    f = d2 / (d2 + lam)
    print(lam, f[[0, 8, 9]].round(3), f.sum().round(2))  # сжатие наибольшего и двух наименьших направлений; эффективное число степеней свободы
# [1778.7  659.6  533.   422.3  292.7  266.4  237.2  191.7   34.6    3.8]
# 1 [0.999 0.972 0.791] 9.74 | 10 [0.994 0.776 0.275] 8.83 | 100 [0.947 0.257 0.036] 6.59 | 1000 [0.64  0.033 0.004] 2.51

# путь лассо: наибольшее полезное lambda и порядок, в котором входят признаки
names = load_diabetes().feature_names
print(round(2 * np.abs(Xs.T @ yc).max(), 0), names[np.abs(Xs.T @ yc).argmax()])         # 39921.0 bmi
alphas, coefs, _ = lasso_path(Xs, yc, n_alphas=2000, eps=1e-4)
order = []
for k in range(coefs.shape[1]):
    order += [names[j] for j in np.flatnonzero(coefs[:, k]) if names[j] not in order]
print(order)   # ['bmi', 's5', 'bp', 's3', 'sex', 's6', 's1', 's4', 's2', 'age']

# выбор lambda 5-кратной кросс-валидацией на 10 признаках и на всех их произведениях до степени 2 и 3
cv = KFold(5, shuffle=True, random_state=0)
for deg in (1, 2, 3):
    pipe = lambda m: make_pipeline(PolynomialFeatures(deg, include_bias=False), StandardScaler(), m)
    score = lambda m: round(cross_val_score(pipe(m), X, yd, cv=cv, scoring='r2').mean(), 3)
    p = PolynomialFeatures(deg, include_bias=False).fit(X).n_output_features_
    r = {a: score(Ridge(alpha=a)) for a in (1, 10, 100, 300, 1000)}
    l = {a: score(Lasso(alpha=a, max_iter=50_000)) for a in (0.3, 1, 2, 3, 5)}
    print(deg, p, score(LinearRegression()), max(r, key=r.get), max(r.values()), max(l, key=l.get), max(l.values()))
# 1 10 0.489 1 0.49 1 0.49 | 2 65 0.412 100 0.475 2 0.49 | 3 285 -41.699 300 0.441 3 0.47

# две копии одного сигнала (корреляция 0.999) и бесполезный признак, три реализации: лассо выбирает одну копию, эластичная сеть делит вес
for seed in (0, 1, 2):
    r = np.random.default_rng(seed); zz = r.normal(size=200)
    Xe = np.column_stack([zz + 0.03 * r.normal(size=200), zz + 0.03 * r.normal(size=200), r.normal(size=200)])
    Xe = (Xe - Xe.mean(0)) / Xe.std(0); ye = 2 * zz + r.normal(size=200); ye -= ye.mean()
    print(Lasso(alpha=0.5).fit(Xe, ye).coef_.round(2) + 0, ElasticNet(alpha=0.5, l1_ratio=0.5).fit(Xe, ye).coef_.round(2) + 0)
# [1.46 0.   0.  ] [0.76 0.76 0.  ] | [0.  1.4 0. ] [0.72 0.74 0.  ] | [0.6  0.76 0.  ] [0.71 0.72 0.  ]

Дальше#

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

Литература#