08 / 27 · Линейная регрессия
Регуляризация
Штраф на величину весов в методе наименьших квадратов: гребневая регрессия, её замкнутая формула и сжатие неустойчивых направлений, априорное распределение за каждым штрафом, форма с ограничением и почему шар L1 даёт точные нули, лассо с мягким пороговым отсечением, покоординатный спуск и путь регуляризации, эластичная сеть для коррелированных признаков и выбор силы штрафа кросс-валидацией.
Метод наименьших квадратов · Валидация и переобучение · Байесовский вывод
На этой странице 12
Заметка об оптимизаторах завершила механику: метод наименьших квадратов можно обучить при любом числе примеров и признаков. Проблема теперь не в том, чтобы обучить модель, а в том, чтобы доверять результату. Заметка о методе наименьших квадратов показала два почти одинаковых признака, коэффициенты которых от одной реализации шума к другой скакали между и , и на обучении, который с 40 бесполезными признаками поднялся до , а на валидации упал ниже нуля. Эта заметка меняет не оптимизатор, а целевую функцию: она добавляет штраф, который делает большие веса дорогими. Штраф обменивает небольшое смещение на сильное уменьшение разброса, имеет байесовскую интерпретацию как априорное распределение, а в форме L1 отбирает признаки, обнуляя веса в точности.
Обозначения. Как и в заметке о методе наименьших квадратов, — матрица признаков, — целевые значения. Во всей заметке признаки стандартизованы (среднее 0, дисперсия 1), а целевая переменная центрирована, поэтому свободный член не нужен: он равен и никогда не штрафуется. — сила штрафа, и . — ранг матрицы признаков. Её сингулярное разложение — , где у и ортонормированные столбцы и , а — диагональная матрица с сингулярными числами (всегда с индексом, в отличие от уровня шума ), так что ненулевые собственные числа равны . — функция мягкого порогового отсечения (soft thresholding).
Гребневая регрессия: штраф на величину весов#
Гребневая регрессия (ridge regression; Hoerl and Kennard, 1970) минимизирует квадратичную ошибку плюс квадрат длины вектора весов:
Градиент равен , и, приравняв его к нулю, получаем
Собственные числа матрицы равны (и вдоль направлений, где данных нет), все они не меньше . При любом она положительно определена и обратима: решение существует и единственно даже при коллинеарных признаках или при числе признаков больше числа примеров — в тех случаях, где метод наименьших квадратов ломался. Масштаб важен: штраф одинаково относится к весу 1 у признака, измеренного в метрах, и у признака, измеренного в миллиметрах, поэтому признаки сначала стандартизуют, а статистики вычисляют только по обучающим данным.
Разобранный пример. Один признак и центрированная целевая переменная : и . Метод наименьших квадратов даёт ; гребневая регрессия с даёт , вдвое меньше. Теперь продублируем признак, . У метода наименьших квадратов бесконечно много решений — все с . У гребневой регрессии решение одно: по симметрии , и первое уравнение системы имеет вид , так что . Штраф делит вес поровну между одинаковыми признаками — это разбиение с наименьшей нормой.
На почти одинаковых признаках из заметки о методе наименьших квадратов (корреляция , истинные веса ) три новые реализации шума дают веса по методу наименьших квадратов , и , а гребневая регрессия с — , и (раздел «Код»).
Какие направления она сжимает#
Подставим сингулярное разложение. Поскольку и , прогнозы равны
Метод наименьших квадратов проецирует на каждое главное направление данных и сохраняет проекцию полностью. Гребневая регрессия умножает её на : направления, в которых признаки сильно меняются (), сохраняются почти без изменений, а направления малой дисперсии () сжимаются почти до нуля (Hastie, Tibshirani and Friedman, 2009, раздел 3.4.1). Это ровно те направления, из-за которых метод наименьших квадратов был неустойчив, потому что дисперсия коэффициентов метода наименьших квадратов вдоль равна . Сумма множителей, , равна следу матрицы-шляпы гребневой регрессии и называется эффективным числом степеней свободы (effective degrees of freedom): при и стремится к 0 при .
На данных о диабете (442 пациента, 10 стандартизованных признаков) собственные числа меняются от до и . Наименьшее отвечает комбинации, в которой преобладают измерения сыворотки крови s1 и s2 с корреляцией . При наибольшее направление сохраняется с множителем , два наименьших — с и , а ; при получаем ; при — .
Сжатие вносит смещение: . Дисперсии оно убирает гораздо больше, поэтому среднеквадратичная ошибка может уменьшиться — это компромисс из заметки об оценках, который заметка о смещении и разбросе применяет ко всем моделям курса.
Байесовская интерпретация#
Штраф — это априорное распределение. При гауссовском шуме с дисперсией и независимых априорных распределениях отрицательный логарифм апостериорной плотности равен целевой функции гребневой регрессии, делённой на , с ; априорное распределение Лапласа даёт штраф L1 лассо (см. ниже) с . Вывод приведён в разделе о MAP-оценке заметки о байесовском выводе. Здесь стоит отметить два следствия:
- Сильный штраф — уверенное априорное убеждение, что веса малы; — плоское априорное распределение, которое возвращает метод наименьших квадратов.
- Для гауссовского априорного распределения апостериорное тоже гауссовское, поэтому — одновременно его мода и среднее, а апостериорная ковариационная матрица даёт неопределённости. Для априорного распределения Лапласа оценка лассо — только мода; апостериорное распределение приписывает нулевую вероятность тому, что вес в точности равен 0, так что разреженность, о которой пойдёт речь ниже, — свойство оптимизации, а не апостериорного распределения.
Форма с ограничением: почему L1 даёт нули#
Для каждого существует радиус , при котором задача со штрафом имеет то же решение, что и задача с ограничением,
по лагранжевой двойственности выпуклых задач: — множитель ограничения, и меньшему соответствует большее . Форма с ограничением объясняет разное поведение двух штрафов.
Почему лассо обнуляет веса, а гребневая регрессия нет
Линии уровня квадратичной ошибки — эллипсы вокруг решения метода наименьших квадратов . Решение задачи с ограничением — точка допустимого множества на самой низкой линии уровня, то есть точка, где растущий эллипс впервые касается множества. Шар L2 круглый, поэтому точка касания оказывается там, куда её помещает форма эллипса, и в общем случае все координаты ненулевые. Шар L1 — ромб (кросс-политоп в измерениях), углы которого лежат на осях, и эти углы выступают: эллипс, подходящий с широкого диапазона направлений, первым задевает угол, а в углу часть координат в точности равна нулю. На рисунке это условие видно как вычисление: в углу антиградиент функции потерь равен и лежит строго между нормалями и двух сходящихся там рёбер, поэтому никакое движение вдоль границы ромба не уменьшает потери.
Лассо#
Лассо (lasso; Tibshirani, 1996) — задача со штрафом L1:
Она выпукла, но недифференцируема там, где вес равен нулю, и в общем случае не имеет замкнутой формулы. При ортонормированных признаках, , формула есть. Обозначим — в этом случае это решение метода наименьших квадратов; тогда , и целевая функция распадается на отдельные задачи по координатам, . При производная обращается в ноль в точке , которая положительна, только если ; симметрично для ; в остальных случаях минимум в 0. Вместе:
Гребневая регрессия уменьшает каждый коэффициент в одно и то же число раз; лассо вычитает одну и ту же величину из модуля каждого коэффициента и обнуляет те, что меньше .
Разобранный пример. Ортонормированные признаки с и . Лассо даёт : два признака отброшены. Гребневая регрессия даёт : все три сохранены, но уменьшены. Lasso из scikit-learn минимизирует , поэтому его в единицах этой заметки равно ; с таким пересчётом он возвращает (раздел «Код»).
Покоординатный спуск (coordinate descent). Для общей матрицы будем минимизировать по одному весу за раз при фиксированных остальных. Одномерная задача совпадает с ортонормированной, только заменяется на корреляцию признака с частичным остатком (partial residual) :
Циклический обход координат для лассо сходится (Friedman et al., 2007), а вычисление решений для убывающей последовательности , каждое из которых стартует с предыдущего, дёшево даёт весь путь регуляризации (regularization path); так и делает scikit-learn. Родственный метод делает градиентный шаг по квадратичной ошибке, а затем применяет мягкое пороговое отсечение ко всем координатам (проксимальный градиентный метод); алгоритм регрессии наименьших углов (least angle regression) вычисляет путь точно, потому что он кусочно-линеен по (Efron et al., 2004).
Где начинается путь. В точке условие оптимальности через субградиент имеет вид для всех . Поэтому все веса равны нулю при , и первым входит признак, сильнее всех коррелирующий с целевой переменной. На данных о диабете , и достигается он на bmi.
Пути коэффициентов гребневой регрессии и лассо
Два пути на рисунке показывают разницу на реальных данных. Гребневая регрессия стягивает противоположные коэффициенты коррелированной пары s1 и s2 ( и в методе наименьших квадратов) друг к другу, а затем оба к нулю; ни один коэффициент никогда не становится в точности нулём. Лассо при уменьшении добавляет признаки по одному, в порядке bmi, s5, bp, s3, sex, s6, s1, s4, s2, age, и при значении, выбранном кросс-валидацией, оставляет семь из десяти.
Коррелированные признаки: эластичная сеть#
Отбор лассо неустойчив внутри группы коррелированных признаков. Когда два признака несут один и тот же сигнал, штраф L1 одинаков при любом разбиении веса между ними, для весов одного знака, а квадратичная ошибка почти не различает разбиения, поэтому лассо склонно оставить один признак и отбросить другой, причём какой именно — зависит от шума. На двух копиях одного сигнала с корреляцией плюс бесполезный признак три реализации данных дают веса лассо , и ( в scikit-learn).
Эластичная сеть (elastic net; Zou and Hastie, 2005) добавляет гребневый член: . Квадратичный член строго выпуклый, поэтому предпочитает равное разбиение, и теорема 1 статьи ограничивает разность весов двух признаков величиной, кратной , где — их корреляция: это эффект группировки (grouping effect). Те же три реализации дают , и (в scikit-learn и l1_ratio=0.5), и бесполезный признак по-прежнему удалён.
Выбор штрафа по валидации#
Сила штрафа — гиперпараметр, и заметка о валидации даёт процедуру: обучить модель для сетки значений в логарифмическом масштабе, оценить ошибку каждой кросс-валидацией, оставить лучшую, а итоговое качество сообщить по вложенной схеме или на тестовой выборке, поскольку лучшая из многих кросс-валидационных оценок оптимистична. У гребневой регрессии есть короткий путь: её прогнозы линейны по , , а остаток при исключении одного объекта (leave-one-out) равен , так что кросс-валидация с исключением по одному стоит одного обучения на каждое (Hastie, Tibshirani and Friedman, 2009, раздел 7.10.1, формула 7.51); этим пользуется RidgeCV из scikit-learn.
Насколько помогает регуляризация, зависит от того, сколько признаков приходится на один пример. На данных о диабете на 5-кратной кросс-валидации:
| Признаки | Число | МНК | Гребневая, лучшая | Лассо, лучшее |
|---|---|---|---|---|
| исходные | 10 | () | () | |
| со всеми произведениями степени 2 | 65 | () | () | |
| со всеми произведениями до степени 3 | 285 | () | () |
При десяти признаках и 442 пациентах дисперсия метода наименьших квадратов уже мала, и штраф ничего не меняет. При 285 признаках и примерно 350 обучающих пациентах в каждом фолде метод наименьших квадратов подгоняется под шум настолько сильно, что его на валидации равен ; гребневая регрессия и лассо возвращают его к и . На этих данных добавленные признаки несут мало сигнала, и лучшие регуляризованные модели лишь сравниваются с простой линейной моделью на исходных десяти; регуляризация делает много признаков безопасными, но не полезными.
Другие способы ограничить модель действуют как штрафы и появятся в курсе позже: ранняя остановка градиентного спуска (примерно штраф L2 с после шагов), дропаут и аугментация данных — все в заметке об обучении, а также стрижка (pruning) в заметке о решающих деревьях. Затухание весов (weight decay) — уменьшение каждого веса на фиксированную долю на каждом шаге — для обычного SGD совпадает со штрафом L2; с адаптивными оптимизаторами вроде Adam они различаются, и на практике используют развязанную форму, AdamW (затухание весов при Adam). Затухание весов регуляризует дообучение языковых моделей, а штраф L1 на активации делает разреженный автоэнкодер разреженным.
Что изменилось#
| Метод наименьших квадратов | Гребневая регрессия | Лассо | |
|---|---|---|---|
| Целевая функция | |||
| Решение | , если существует | , всегда | замкнутой формулы нет; покоординатный спуск |
| Коллинеарные признаки или | не единственно, неустойчиво | единственно, вес делится | прогнозы единственны, отбор внутри групп неустойчив |
| Нули | не навязываются | не навязываются (только случайно) | точные нули: отбор признаков |
| Априорное распределение | плоское | гауссовское | Лапласа (как MAP) |
| Гиперпараметр | нет | , кросс-валидацией | , кросс-валидацией |
| Смещение и разброс | несмещённый, большой разброс | смещённая, меньший разброс | смещённое, меньший разброс |
Ограничения#
- Штраф зависит от единиц измерения. Признаки нужно стандартизовать, и результат меняется с выбранным масштабированием.
- Смещение. Оба штрафа сжимают и большие истинные коэффициенты; оценки лассо для оставленных признаков смещены к нулю, и обычное лекарство — заново обучить метод наименьших квадратов на отобранных признаках.
- Лассо оставляет не больше признаков, когда и признаки находятся в общем положении, например взяты из непрерывного распределения: тогда решение с вероятностью единица единственно и имеет не больше ненулевых весов (Tibshirani, 2013). При точно продублированных столбцах подгонка остаётся единственной, а веса — нет: любое разделение веса между двумя копиями с одинаковым знаком даёт ту же подгонку и тот же штраф. Внутри сильно коррелированных групп выбор произволен; эластичная сеть смягчает оба ограничения.
- Отбор — не статистический вывод. Признак, отброшенный лассо, всё ещё может быть важен, а стандартные ошибки, вычисленные после отбора, занижены.
- Ещё один гиперпараметр. стоит цикла кросс-валидации, а для честной оценки ошибки тогда нужна вложенная.
Что нужно запомнить#
- Гребневая регрессия: , единственное решение при любом ; она сжимает каждое главное направление с множителем , сильнее всего — направления малой дисперсии; .
- Штрафы — это априорные распределения: гауссовское даёт гребневую регрессию с , распределение Лапласа даёт лассо как MAP-оценку.
- У шара L1 углы на осях, поэтому лассо обнуляет веса в точности; при ортонормированных признаках оно применяет к коэффициентам метода наименьших квадратов мягкое пороговое отсечение с порогом , а гребневая регрессия делит их на .
- Все веса лассо равны нулю при ; путь вычисляется покоординатным спуском с тёплым стартом (warm start).
- Эластичная сеть добавляет член L2, чтобы коррелированные признаки делили вес между собой.
- Стандартизуйте признаки, не штрафуйте свободный член, выбирайте кросс-валидацией и сообщайте качество по вложенной кросс-валидации.
Код#
Разобранные примеры, гребневая регрессия на коллинеарных признаках, множители сжатия и путь лассо на данных о диабете, кросс-валидация с полиномиальными признаками и эластичная сеть. Напечатанные числа получены с 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. ]
Дальше#
Раздел о линейной регрессии заканчивается моделью, которая предсказывает число, обучается по формуле или спуском и не гонится за шумом. Но многие целевые переменные — не числа, а классы: спам или нет, дефолт или погашение. Следующая заметка спрашивает, что должна минимизировать линейная модель, когда ответ — сторона гиперплоскости, почему квадратичная ошибка для этого не подходит и какие функции потерь её заменяют. Гребневый штраф идёт с нами дальше: это второй член целевой функции метода опорных векторов и основа ядерной гребневой регрессии.
Литература#
- E. Sokolov et al. Машинное обучение (HSE), конспекты лекций, лекция 4: регуляризация, гиперпараметры, разреженные модели и проксимальный шаг, преобразования признаков.
- A. E. Hoerl, R. W. Kennard. Ridge regression: biased estimation for nonorthogonal problems. Technometrics, 12(1), 1970.
- R. Tibshirani. Regression shrinkage and selection via the lasso. Journal of the Royal Statistical Society B, 58(1), 1996.
- H. Zou, T. Hastie. Regularization and variable selection via the elastic net. Journal of the Royal Statistical Society B, 67(2), 2005. Раздел 2.3, теорема 1 (эффект группировки).
- B. Efron, T. Hastie, I. Johnstone, R. Tibshirani. Least angle regression. Annals of Statistics, 32(2), 2004.
- J. Friedman, T. Hastie, H. Höfling, R. Tibshirani. Pathwise coordinate optimization. Annals of Applied Statistics, 1(2), 2007.
- R. J. Tibshirani. The lasso problem and uniqueness. Electronic Journal of Statistics, 7, 2013. Единственность решения для признаков из непрерывного распределения и оценка в ненулевых весов.
- T. Hastie, R. Tibshirani, J. Friedman. The Elements of Statistical Learning, 2nd ed. Springer, 2009. Раздел 3.4.1 (гребневая регрессия, взгляд через сингулярное разложение и эффективное число степеней свободы), раздел 3.4.2 (лассо), раздел 3.4.3 (области ограничений и мягкое пороговое отсечение), раздел 3.8.6 (покоординатная оптимизация вдоль пути), раздел 7.10.1 (кросс-валидация и короткий путь для исключения по одному).
- C. M. Bishop. Pattern Recognition and Machine Learning. Springer, 2006. Раздел 3.1.4 (регуляризованный метод наименьших квадратов), раздел 3.3 (байесовская линейная регрессия).