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

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

Метод наименьших квадратов

Линейная регрессия, обученная минимизацией суммы квадратов остатков: нормальные уравнения и условие единственности их решения, подгонка как ортогональная проекция, интерпретация как метод максимального правдоподобия при гауссовском шуме и выборочное распределение коэффициентов, коллинеарность и численная обусловленность, R² и его ловушки, устойчивые функции потерь для данных с выбросами.

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

Заметка о ближайших соседях закончилась моделью, которая отвечает на каждый запрос по горстке близких точек и ничего не узнаёт о зависимости в целом; в пространствах большой размерности близкие точки исчезают. Эта заметка делает противоположную ставку. Она предполагает, что целевая переменная с точностью до шума равна взвешенной сумме признаков, по одному весу на признак, и подбирает веса сразу по всем данным, минимизируя квадраты ошибок. У решения есть замкнутая формула, геометрический смысл и вероятностный смысл, и каждый из трёх объясняет свой способ сломаться: на коллинеарных признаках, на плохо масштабированных числах и на выбросах. Эти поломки задают остальную часть раздела.

Обозначения. Обучающая выборка — (x1,y1),…,(xn,yn)(x_1, y_1), \dots, (x_n, y_n), где xi∈Rdx_i \in \mathbb R^d и yi∈Ry_i \in \mathbb R. Строки матрицы признаков (design matrix) X∈Rn×dX \in \mathbb R^{n \times d} — векторы xi⊤x_i^\top, а y∈Rny \in \mathbb R^n собирает целевые значения. Если в модели есть свободный член, первый признак — константа 1, так что dd учитывает и свободный член. Вектор весов w∈Rdw \in \mathbb R^d даёт прогноз y^i=⟨w,xi⟩\hat y_i = \langle w, x_i\rangle, для всех объектов сразу — XwXw. Остатки (residuals) — r=y−Xwr = y - Xw, сумма квадратов остатков (residual sum of squares) — RSS(w)=∥y−Xw∥2\mathrm{RSS}(w) = \lVert y - Xw\rVert^2, среднеквадратичная ошибка — MSE=RSS/n\mathrm{MSE} = \mathrm{RSS}/n. w^\hat w — точка минимума, y^=Xw^\hat y = X\hat w.

Линейная модель#

Модель имеет вид

a(x)=⟨w,x⟩=w1x(1)+⋯+wdx(d).a(x) = \langle w, x\rangle = w_1 x^{(1)} + \dots + w_d x^{(d)} .

Каждый вес говорит, насколько меняется прогноз, когда один признак растёт на единицу, а остальные не меняются. Модель линейна по ww, но не обязательно по исходным входам: признаками могут быть степени числа, логарифмы, произведения двух входов или one-hot-столбцы категории из заметки о признаках. Всё, что сказано ниже, верно для любого такого фиксированного набора признаков, потому что использует только матрицу XX.

Функция потерь — квадрат ошибки, усреднённый по обучающей выборке:

Q(w)=1n∑i=1n(⟨w,xi⟩−yi)2=1n∥Xw−y∥2.Q(w) = \frac1n \sum_{i=1}^n \big(\langle w, x_i\rangle - y_i\big)^2 = \frac1n \lVert Xw - y\rVert^2 .

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

Нормальные уравнения#

Раскроем сумму квадратов остатков: ∥y−Xw∥2=y⊤y−2w⊤X⊤y+w⊤X⊤Xw\lVert y - Xw\rVert^2 = y^\top y - 2 w^\top X^\top y + w^\top X^\top X w. Градиент линейного члена равен −2X⊤y-2X^\top y, а градиент квадратичной формы при симметричной X⊤XX^\top X равен 2X⊤Xw2X^\top X w, поэтому

∇w∥y−Xw∥2=2X⊤(Xw−y).\nabla_w \lVert y - Xw\rVert^2 = 2X^\top (Xw - y) .

Гессиан равен 2X⊤X2X^\top X, и v⊤X⊤Xv=∥Xv∥2≥0v^\top X^\top X v = \lVert Xv\rVert^2 \ge 0 для любого vv: функция выпукла, и каждая точка, где градиент обращается в ноль, — глобальный минимум. Приравняв градиент к нулю, получаем нормальные уравнения (normal equations)

X⊤X w^=X⊤y.X^\top X\, \hat w = X^\top y .

Если столбцы XX линейно независимы (для этого нужно n≥dn \ge d), то ∥Xv∥2>0\lVert Xv\rVert^2 > 0 для любого v≠0v \ne 0, матрица X⊤XX^\top X положительно определена и обратима, а точка минимума единственна:

w^=(X⊤X)−1X⊤y.\hat w = (X^\top X)^{-1} X^\top y .

Если столбцы зависимы, например когда один признак равен сумме двух других или когда d>nd > n, у нормальных уравнений бесконечно много решений, и все они дают одни и те же прогнозы; к этому случаю вернётся раздел об устойчивости.

Разобранный пример. Четыре точки: x=(0,1,2,3)x = (0, 1, 2, 3) и y=(1,3,2,5)y = (1, 3, 2, 5), модель y^=w1+w2x\hat y = w_1 + w_2 x. Столбцы матрицы признаков — (1,1,1,1)(1, 1, 1, 1) и (0,1,2,3)(0, 1, 2, 3), поэтому

X⊤X=(46614),X⊤y=(1122).X^\top X = \begin{pmatrix} 4 & 6 \\ 6 & 14 \end{pmatrix}, \qquad X^\top y = \begin{pmatrix} 11 \\ 22 \end{pmatrix} .

Определитель равен 4⋅14−6⋅6=204 \cdot 14 - 6 \cdot 6 = 20, и w^=120(14−6−64)(1122)=(1.1,1.1)\hat w = \frac{1}{20}\begin{pmatrix} 14 & -6 \\ -6 & 4\end{pmatrix}\begin{pmatrix} 11 \\ 22\end{pmatrix} = (1.1, 1.1). Подобранная прямая — y^=1.1+1.1x\hat y = 1.1 + 1.1x, остатки — (−0.1,0.8,−1.3,0.6)(-0.1, 0.8, -1.3, 0.6), и RSS=0.01+0.64+1.69+0.36=2.7\mathrm{RSS} = 0.01 + 0.64 + 1.69 + 0.36 = 2.7.

Решение нормальных уравнений стоит O(nd2)O(nd^2) на построение X⊤XX^\top X и O(d3)O(d^3) на решение системы размера d×dd \times d. Для десяти признаков это ничто; для миллиона разреженных текстовых признаков это невозможно, и с этого начинается следующая заметка.

Геометрия: проекция#

Нормальные уравнения можно переписать как X⊤(y−Xw^)=0X^\top (y - X\hat w) = 0: вектор остатков ортогонален каждому столбцу XX. Будем считать nn целевых значений одной точкой y∈Rny \in \mathbb R^n. Когда ww меняется, прогнозы XwXw пробегают пространство столбцов (column space) col⁡(X)\operatorname{col}(X) — dd-мерное подпространство Rn\mathbb R^n. Метод наименьших квадратов выбирает ближайшую к yy точку этого подпространства, а ближайшая точка — основание перпендикуляра.

Рисунок

Метод наименьших квадратов как проекция

Проекция вектора ответов на пространство столбцовПлоскость, натянутая на два столбца матрицы признаков; над ней точка y; вертикальный остаток опускается в точку ŷ под прямым углом; пунктир от y к другой точке плоскости Xw длиннее.col(X)x₁ = 1x₂ = x0y = (1, 3, 2)ŷ = Xŵ = (1.5, 2, 2.5)y − ŷ ⊥ x₁, x₂‖y − ŷ‖² = 1.5Xw, w = (1, 1)‖y − Xw‖² = 2 = 1.5 + 0.5Проекция вектора ответов на пространство столбцовПлоскость, натянутая на два столбца матрицы признаков; над ней точка y; вертикальный остаток опускается в точку ŷ под прямым углом; пунктир от y к другой точке плоскости Xw длиннее.col(X)x₁x₂0yŷy − ŷXw
Три наблюдения, x = (0, 1, 2), y = (1, 3, 2), модель ŷ = w₁ + w₂x. Вектор y лежит в R³, а все возможные прогнозы Xw заполняют плоскость col(X), натянутую на столбцы x₁ = (1, 1, 1) и x₂ = (0, 1, 2). Решение нормального уравнения ŵ = (1.5, 0.5) даёт основание перпендикуляра из y на плоскость: остаток (−0.5, 1, −0.5) ортогонален обоим столбцам. Любая другая точка плоскости дальше: для w = (1, 1) квадрат расстояния 2 = 1.5 + 0.5 по теореме Пифагора.

Ортогональность даёт доказательство оптимальности без дифференцирования. Для любого ww разложим y−Xw=(y−Xw^)+X(w^−w)y - Xw = (y - X\hat w) + X(\hat w - w). Первое слагаемое ортогонально пространству столбцов, а второе лежит в нём, поэтому по теореме Пифагора

∥y−Xw∥2=∥y−Xw^∥2+∥X(w^−w)∥2 ≥ ∥y−Xw^∥2,\lVert y - Xw\rVert^2 = \lVert y - X\hat w\rVert^2 + \lVert X(\hat w - w)\rVert^2 \ \ge\ \lVert y - X\hat w\rVert^2 ,

причём равенство достигается ровно тогда, когда Xw=Xw^Xw = X\hat w. В примере с тремя точками на рисунке добавочное слагаемое для w=(1,1)w = (1, 1) равно 0.50.5.

Отображение из yy в y^\hat y линейно: y^=Hy\hat y = Hy, где H=X(X⊤X)−1X⊤H = X(X^\top X)^{-1}X^\top — матрица-шляпа (hat matrix). Это ортогональный проектор на col⁡(X)\operatorname{col}(X), поэтому он симметричен и идемпотентен (H2=HH^2 = H: повторная проекция ничего не меняет), а его след равен tr⁡((X⊤X)−1X⊤X)=d\operatorname{tr}\big((X^\top X)^{-1}X^\top X\big) = d, размерности подпространства. Диагональный элемент hiih_{ii}, рычаг (leverage) точки ii, показывает, насколько сдвигается y^i\hat y_i, когда yiy_i сдвигается на единицу. В примере с четырьмя точками рычаги равны (0.7,0.3,0.3,0.7)(0.7, 0.3, 0.3, 0.7) и в сумме дают d=2d = 2: крайние точки тянут прямую сильнее средних.

Два следствия ортогональности используются постоянно. Если в модели есть свободный член, константный столбец — один из столбцов, поэтому ∑iri=0\sum_i r_i = 0: остатки в среднем равны нулю, и среднее y^\hat y равно среднему yy. В разобранном примере −0.1+0.8−1.3+0.6=0-0.1 + 0.8 - 1.3 + 0.6 = 0, а также 0⋅(−0.1)+1⋅0.8+2⋅(−1.3)+3⋅0.6=00 \cdot (-0.1) + 1 \cdot 0.8 + 2 \cdot (-1.3) + 3 \cdot 0.6 = 0. Кроме того, y=y^+ry = \hat y + r и y^⊥r\hat y \perp r, поэтому общий разброс раскладывается на объяснённую и необъяснённую части — это и измеряет R2R^2 ниже.

Вероятность: гауссовский шум и условное среднее#

Пусть данные порождены как yi=⟨w,xi⟩+εiy_i = \langle w, x_i\rangle + \varepsilon_i, где εi\varepsilon_i независимы и имеют распределение N(0,σ2)N(0, \sigma^2). Отрицательный логарифм правдоподобия равен RSS(w)/(2σ2)\mathrm{RSS}(w)/(2\sigma^2) плюс константа, как выведено в заметке о методе максимального правдоподобия, поэтому минимизировать квадратичную ошибку — значит максимизировать правдоподобие. И без всякой модели у квадратичной ошибки есть другое обоснование: её минимум по всем функциям на генеральной совокупности — условное среднее E[Y∣X=x]E[Y \mid X = x] (наилучший прогноз). Метод наименьших квадратов, ограниченный линейными функциями, оценивает линейную функцию, ближайшую к E[Y∣X]E[Y \mid X] в среднеквадратичном смысле, — то есть саму E[Y∣X]E[Y \mid X], если она линейна.

Распределение коэффициентов. Здесь матрица признаков XX считается фиксированной, а случаен только шум: утверждения ниже — о повторных реализациях ε\varepsilon при тех же входах. Подставим y=Xw+εy = Xw + \varepsilon в формулу:

w^=(X⊤X)−1X⊤(Xw+ε)=w+(X⊤X)−1X⊤ε.\hat w = (X^\top X)^{-1}X^\top (Xw + \varepsilon) = w + (X^\top X)^{-1}X^\top \varepsilon .

Оценка — это истинный вес плюс фиксированное линейное отображение шума. Отсюда следуют три факта, каждый при своём предположении:

  • Несмещённость, если E[ε]=0E[\varepsilon] = 0: E[w^]=wE[\hat w] = w.
  • Ковариационная матрица σ2(X⊤X)−1\sigma^2 (X^\top X)^{-1}, если шум некоррелирован и имеет одинаковые дисперсии, Var⁡ε=σ2I\operatorname{Var}\varepsilon = \sigma^2 I: при A=(X⊤X)−1X⊤A = (X^\top X)^{-1}X^\top получаем Var⁡w^=A σ2I A⊤=σ2(X⊤X)−1\operatorname{Var}\hat w = A\,\sigma^2 I\,A^\top = \sigma^2 (X^\top X)^{-1}.
  • Нормальность, если шум гауссовский, поскольку аффинное отображение гауссовского вектора гауссовское: w^∼N(w,σ2(X⊤X)−1)\hat w \sim N\big(w, \sigma^2 (X^\top X)^{-1}\big). Для другого независимого шума с конечной дисперсией распределение при больших nn приближённо нормально по центральной предельной теореме, если ни одна точка не доминирует в подгонке: наибольший рычаг max⁡ihii\max_i h_{ii} (определён выше) должен стремиться к 0.

Дисперсия шума неизвестна и оценивается по остаткам. Поскольку r=(I−H)y=(I−H)εr = (I - H)y = (I - H)\varepsilon (так как (I−H)X=0(I - H)X = 0), получаем RSS=ε⊤(I−H)ε\mathrm{RSS} = \varepsilon^\top (I - H)\varepsilon и E[RSS]=σ2tr⁡(I−H)=σ2(n−d)E[\mathrm{RSS}] = \sigma^2 \operatorname{tr}(I - H) = \sigma^2 (n - d). Поэтому оценка

σ^2=RSSn−d\hat\sigma^2 = \frac{\mathrm{RSS}}{n - d}

несмещённая: dd степеней свободы тратятся на подгонку, так же как n−1n - 1 в выборочной дисперсии отражает одну степень свободы, потраченную на среднее. Квадратные корни из диагонали σ^2(X⊤X)−1\hat\sigma^2 (X^\top X)^{-1} — стандартные ошибки (standard errors) коэффициентов.

Разобранный пример. В примере с четырьмя точками σ^2=2.7/(4−2)=1.35\hat\sigma^2 = 2.7/(4 - 2) = 1.35 и (X⊤X)−1=120(14−6−64)(X^\top X)^{-1} = \frac{1}{20}\begin{pmatrix} 14 & -6 \\ -6 & 4\end{pmatrix}, так что у наклона 1.11.1 стандартная ошибка 1.35⋅4/20=0.520\sqrt{1.35 \cdot 4/20} = 0.520, а у свободного члена — 1.35⋅14/20=0.972\sqrt{1.35 \cdot 14/20} = 0.972. При четырёх точках наклон отстоит от нуля едва на две стандартные ошибки. Моделирование подтверждает формулу: 30 равноотстоящих точек на [0,1][0, 1], истинный w=(1,2)w = (1, 2), σ=0.5\sigma = 0.5 и 20 000 реализаций шума дают средние коэффициентов (1.001,2.000)(1.001, 2.000) и стандартные отклонения (0.177,0.303)(0.177, 0.303) против (0.178,0.306)(0.178, 0.306) по формуле σdiag⁡(X⊤X)−1\sigma\sqrt{\operatorname{diag}(X^\top X)^{-1}} (раздел «Код»).

Теорема Гаусса–Маркова (Gauss–Markov theorem) добавляет, что при некоррелированном шуме с одинаковыми дисперсиями никакая другая линейная по yy несмещённая оценка не имеет меньшей дисперсии ни для какой линейной комбинации коэффициентов (Hastie, Tibshirani and Friedman, 2009, раздел 3.2.2). Оговорка важна: оценки, допускающие небольшое смещение, могут иметь намного меньшую дисперсию и меньшую среднеквадратичную ошибку — это компромисс из заметки об оценках. Такие оценки строит заметка о регуляризации.

Когда решение неустойчиво#

Ковариация σ2(X⊤X)−1\sigma^2 (X^\top X)^{-1} велика в тех направлениях, где у X⊤XX^\top X малые собственные числа, то есть там, где некоторая комбинация признаков почти постоянна на данных. Именно это дают два признака, которые почти повторяют друг друга.

Коллинеарность (collinearity). Возьмём 100 точек с x(2)=x(1)+0.01 ξx^{(2)} = x^{(1)} + 0.01\,\xi, где ξ\xi — стандартный нормальный шум, и y=x(1)+x(2)+εy = x^{(1)} + x^{(2)} + \varepsilon с σ=1\sigma = 1. Корреляция двух признаков равна 0.999940.99994, а число обусловленности X⊤XX^\top X — 3.5⋅1043.5 \cdot 10^4. Три реализации шума дают веса (−5.00,6.88)(-5.00, 6.88), (11.88,−9.90)(11.88, -9.90) и (−8.83,10.94)(-8.83, 10.94) с суммами 1.881.88, 1.981.98 и 2.112.11. Данные фиксируют сумму w1+w2w_1 + w_2 — направление, в котором признаки меняются, — и почти ничего не говорят о разности — направлении, в котором они не меняются. Стандартная ошибка каждого веса равна 9.749.74, против 0.100.10 у модели только с одним из двух признаков. Прогнозы на данных, похожих на обучающие, от реализации к реализации почти не меняются; коэффициенты, а с ними и любая их интерпретация, — шум. Типичный симптом — вес −9.90-9.90 у признака, который помогает предсказывать целевую переменную.

Неполный ранг (rank deficiency). Когда столбцы точно зависимы или d>nd > n, матрица X⊤XX^\top X вырождена, и у нормальных уравнений целое аффинное множество решений. Стандартный выбор — решение с наименьшей нормой, w^=X+y\hat w = X^+ y с псевдообратной матрицей Мура–Пенроуза X+X^+; его и возвращает numpy.linalg.lstsq. Этот выбор — предпочтение, а не то, что решают данные, и заметка о регуляризации делает предпочтение явным.

Численная обусловленность. Даже когда X⊤XX^\top X обратима в точной арифметике, её построение возводит число обусловленности в квадрат: κ(X⊤X)=κ(X)2\kappa(X^\top X) = \kappa(X)^2. Двойная точность хранит около 16 значащих цифр, а решение линейной системы теряет примерно log⁡10κ\log_{10}\kappa из них. Для полиномиальных признаков 1,t,…,t101, t, \dots, t^{10} на 50 точках отрезка [0,1][0, 1] получаем κ(X)=2.0⋅107\kappa(X) = 2.0 \cdot 10^7 и κ(X⊤X)=4.1⋅1014\kappa(X^\top X) = 4.1 \cdot 10^{14}. Решение нормальных уравнений восстанавливает коэффициенты, которые все равны 1, с ошибкой 4⋅10−34 \cdot 10^{-3}; решатель на основе SVD, применённый прямо к XX, как это делает lstsq, — с ошибкой 4⋅10−104 \cdot 10^{-10} (Trefethen and Bau, 1997, лекции 11 и 19). Формула (X⊤X)−1X⊤y(X^\top X)^{-1}X^\top y — для выводов; численный код раскладывает XX. Центрирование и масштабирование признаков, как в заметке о признаках, тоже уменьшают число обусловленности, а следующая заметка показывает, что то же число управляет скоростью градиентного спуска.

Как измерить качество регрессии#

Среднеквадратичная ошибка измеряется в квадратах единиц целевой переменной; корень из неё, RMSE, — в единицах целевой переменной. Коэффициент детерминации (coefficient of determination) сравнивает модель с лучшей константой — средним yˉ\bar y:

R2=1−∑i(yi−y^i)2∑i(yi−yˉ)2.R^2 = 1 - \frac{\sum_i (y_i - \hat y_i)^2}{\sum_i (y_i - \bar y)^2} .

На обучающих данных модели со свободным членом разложение по теореме Пифагора из предыдущих разделов помещает R2R^2 между 0 и 1: это доля разброса yy, которую объясняет модель. В примере с четырьмя точками yˉ=2.75\bar y = 2.75, полная сумма квадратов равна 8.758.75, и R2=1−2.7/8.75=0.691R^2 = 1 - 2.7/8.75 = 0.691.

На данных о диабете из scikit-learn (442 пациента, 10 центрированных и масштабированных измерений, целевая переменная — мера прогрессирования болезни через год) у метода наименьших квадратов R2R^2 на обучении равен 0.5180.518, а R2R^2 на 5-кратной кросс-валидации — 0.4890.489. Ближайшие соседи на стандартизованных признаках достигают в лучшем случае 0.4540.454 (при k=20k = 20; 0.3820.382, 0.4440.444 и 0.4280.428 при k=5k = 5, 10 и 40). Одиннадцать коэффициентов, подобранных по всем данным, здесь побеждают локальное голосование, потому что зависимость близка к аддитивной, а 442 точек мало для окрестностей в десятимерном пространстве.

У R2R^2 три ловушки:

  • R2R^2 на обучении не убывает с числом признаков. Добавленный столбец может только сохранить или расширить пространство столбцов, поэтому остаток проекции никогда не растёт. При 50 обучающих точках, одном полезном признаке и kk столбцах чистого шума R2R^2 на обучении равен 0.5720.572, 0.6490.649, 0.7470.747, 0.9210.921 при k=0,10,20,40k = 0, 10, 20, 40, а на 50 новых точках — 0.3250.325, 0.1540.154, −0.158-0.158, −0.71-0.71. Отрицательный R2R^2 означает, что модель хуже прогноза средним, и он появляется только на данных, которых модель не видела. Сообщайте R2R^2 на валидационных данных, как заметка о валидации требует для любой метрики.
  • R2R^2 зависит от разброса xx. Для y=x+εy = x + \varepsilon с σ=1\sigma = 1 одна и та же модель с тем же шумом имеет R2=(1/12)/(1/12+1)=0.077R^2 = (1/12)/(1/12 + 1) = 0.077, когда xx равномерно распределён на [0,1][0, 1], и 0.8930.893, когда на [0,10][0, 10]; RMSE в обоих случаях равен 1. R2R^2 сравнивает модель со средним, а среднее — тем худший прогноз, чем сильнее меняется yy.
  • Высокий R2R^2 не означает правильную модель. Прямая, проведённая через точки на параболе, может иметь R2R^2 около 1 и остатки, которые все положительны на краях и отрицательны в середине. Смотрите на остатки.

Квадратичная ошибка и выбросы#

Квадратичная ошибка оценивает условное среднее, а среднее следует за самыми большими значениями. Другие функции потерь оценивают другие величины (другие функции потерь — другие цели): лучшая константа при абсолютной ошибке — медиана. Для пяти значений 1,2,4,8,161, 2, 4, 8, 16 лучшая константа при квадратичной ошибке — их среднее 6.26.2, при абсолютной ошибке — их медиана 44. Поэтому одно неверное значение может сдвинуть решение метода наименьших квадратов сколь угодно далеко, а решение на основе медианы оно сдвигает, только пока не пересечёт другие точки.

Рисунок

Один выброс и три функции потерь

Прямые по МНК, Хьюберу и модулю ошибки при одном выбросеТочечная диаграмма из десяти точек; точка при x = 8 высоко над остальными. Красная прямая МНК заметно круче синей прямой Хьюбера, зелёной прямой модуля ошибки и серого пунктира МНК без выброса, которые почти совпадают. Рядом — графики трёх функций потерь от остатка: парабола, кусочная функция Хьюбера и модуль.0246804812xyвыбросМНК: 0.37 + 0.82xХьюбер, δ = 1: 0.99 + 0.53xмодуль ошибки: 1.27 + 0.47xМНК без выбросапотеря ρ(r) от остатка r−3−113123r²/2|r|ХьюберПрямые по МНК, Хьюберу и модулю ошибки при одном выбросеТочечная диаграмма из десяти точек; точка при x = 8 высоко над остальными. Красная прямая МНК заметно круче синей прямой Хьюбера, зелёной прямой модуля ошибки и серого пунктира МНК без выброса, которые почти совпадают. Рядом — графики трёх функций потерь от остатка: парабола, кусочная функция Хьюбера и модуль.0246804812xyвыбросМНК: 0.37 + 0.82xХьюбер, δ = 1: 0.99 + 0.53xмодуль ошибки: 1.27 + 0.47xМНК без выбросапотеря ρ(r) от остатка r−3−113123r²/2|r|Хьюбер
Десять точек почти на прямой, одна из них (x = 8, y = 13) — грубая ошибка. Слева: прямые, минимизирующие сумму квадратов остатков, функцию потерь Хьюбера с δ = 1 и сумму модулей остатков; пунктир — МНК по девяти точкам без выброса, наклон 0.48. Выброс получает остаток 6.07 и в квадрате весит больше всех остальных точек вместе, поэтому МНК поворачивает прямую к нему: наклон 0.82. Хьюбер (0.53) и модуль (0.47) почти не сдвигаются. Справа: сами функции потерь. Квадрат растёт квадратично, модуль и Хьюбер вне [−1, 1] — линейно, так что одна далёкая точка тянет прямую с ограниченной силой.

У выброса на рисунке остаток по методу наименьших квадратов равен 6.076.07; его квадрат, 36.936.9, больше суммы квадратов остатков остальных девяти точек. Метод наименьших квадратов наклоняет прямую к нему: наклон растёт с 0.480.48 без этой точки до 0.820.82 с ней. Влияние больших остатков ограничивают две функции потерь:

  • Абсолютная ошибка, ρ(r)=∣r∣\rho(r) = \lvert r\rvert, — метод наименьших модулей (least absolute deviations). Каждая точка тянет с одной и той же силой независимо от расстояния. Подобранная прямая здесь — 1.27+0.47x1.27 + 0.47x; точка минимума не всегда единственна, а функция потерь недифференцируема в 0.
  • Функция потерь Хьюбера (Huber loss; Huber, 1964): ρδ(r)=r2/2\rho_\delta(r) = r^2/2 при ∣r∣≤δ\lvert r\rvert \le \delta и δ(∣r∣−δ/2)\delta(\lvert r\rvert - \delta/2) дальше. Квадратичная для малых остатков, поэтому сохраняет эффективность метода наименьших квадратов на чистых гауссовских данных; линейная для больших, поэтому сила, с которой тянет выброс, ограничена величиной δ\delta. При δ=1\delta = 1 прямая — 0.99+0.53x0.99 + 0.53x.

Ограничена производная по остатку. Градиент по весам умножает эту производную на xix_i, поэтому точка с крайним значением входа, точка с большим рычагом (high leverage), по-прежнему тянет сильно. Десять точек на прямой y=xy = x и одна грубая ошибка в (100,0)(100, 0) одинаково выравнивают все три подгонки: наклоны наименьших квадратов, Хьюбера и наименьших модулей равны −0.04-0.04. Эти функции потерь защищают от выбросов по yy, а не по xx.

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

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

Ближайшие соседиМетод наименьших квадратов
Модельсреднее целевых значений соседейглобальная линейная функция с dd коэффициентами
Обучениезапомнить данныерешить X⊤Xw=X⊤yX^\top X w = X^\top y, O(nd2+d3)O(nd^2 + d^3)
Прогнозпоиск по обучающей выборкеодно скалярное произведение, O(d)O(d)
Диабет, R2R^2 на кросс-валидации0.4540.454 в лучшем случае (k=20k = 20)0.4890.489
Неопределённостьне встроенаVar⁡w^=σ2(X⊤X)−1\operatorname{Var}\hat w = \sigma^2 (X^\top X)^{-1}, стандартные ошибки
Интерпретациянетпо весу на признак, если признаки не коллинеарны
Слабое местобольшая размерность, масштабнелинейные зависимости, коллинеарность, выбросы, dd близко к nn

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

  • Линейность по выбранным признакам. Модель видит взаимодействия и кривизну, только если их кто-то заложил в XX; раздел о деревьях и раздел о нейросетях выучивают их сами.
  • Неустойчивость при коррелированных признаках или dd, близком к nn. Дисперсия коэффициентов взрывается вдоль почти постоянных направлений; при d≥nd \ge n и rank⁡X=n\operatorname{rank} X = n ошибка на обучении равна нулю, так что подгонка на обучающих данных ничего не говорит об обобщении. Какое из многих интерполирующих решений выбрано (например, с наименьшей нормой) и геометрия данных всё равно решают, полезны ли его прогнозы, как показывает оговорка о двойном спуске.
  • Чувствительность к выбросам. Одна грубая ошибка может повернуть прямую, потому что квадратичная функция потерь взвешивает остатки по их величине; устойчивые функции потерь помогают против выбросов по yy, но не против крайних значений входов.
  • Формула дисперсии предполагает некоррелированный шум с одинаковой дисперсией. При гетероскедастичных или коррелированных ошибках (временные ряды, сгруппированные данные) коэффициенты остаются несмещёнными, но стандартные ошибки неверны.
  • Замкнутая формула стоит O(nd2+d3)O(nd^2 + d^3) и существует только для квадратичной ошибки.

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

  • Метод наименьших квадратов минимизирует ∥y−Xw∥2\lVert y - Xw\rVert^2; нормальные уравнения X⊤Xw^=X⊤yX^\top X\hat w = X^\top y имеют единственное решение (X⊤X)−1X⊤y(X^\top X)^{-1}X^\top y, когда столбцы XX независимы.
  • Геометрически y^\hat y — ортогональная проекция yy на пространство столбцов; остаток ортогонален каждому признаку, а при наличии свободного члена остатки в сумме дают ноль.
  • При гауссовском шуме метод наименьших квадратов — это метод максимального правдоподобия, и w^∼N(w,σ2(X⊤X)−1)\hat w \sim N\big(w, \sigma^2 (X^\top X)^{-1}\big); σ2\sigma^2 оценивают как RSS/(n−d)\mathrm{RSS}/(n - d).
  • Почти коллинеарные признаки делают отдельные коэффициенты бессмысленными, хотя прогнозы остаются устойчивыми; здесь вступает регуляризация.
  • Никогда не решайте нормальные уравнения численно для плохо обусловленных признаков: построение X⊤XX^\top X возводит число обусловленности в квадрат. Используйте QR или SVD (lstsq).
  • R2R^2 сравнивает модель с прогнозом средним; на обучающих данных он не убывает при добавлении признаков, поэтому сообщайте его на валидационных данных.
  • Квадратичная ошибка оценивает условное среднее и следует за выбросами; абсолютная ошибка оценивает медиану, а функция потерь Хьюбера — промежуточный вариант между ними.

Код#

Разобранные примеры, выборочное распределение коэффициентов, сравнение с ближайшими соседями на данных о диабете, ловушки R2R^2, коллинеарность, обусловленность и устойчивые подгонки:

import numpy as np
from scipy import optimize
from sklearn.datasets import load_diabetes
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import KFold, cross_val_score
from sklearn.neighbors import KNeighborsRegressor
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

rng = np.random.default_rng(0)
r2 = lambda y, p: 1 - ((y - p) ** 2).sum() / ((y - y.mean()) ** 2).sum()

# разобранный пример: четыре точки, нормальные уравнения, остатки ортогональны столбцам
x = np.array([0., 1, 2, 3]); y = np.array([1., 3, 2, 5])
X = np.column_stack([np.ones(4), x])
w = np.linalg.solve(X.T @ X, X.T @ y)
r = y - X @ w
H = X @ np.linalg.inv(X.T @ X) @ X.T
print(w, r.round(2), (X.T @ r).round(12) + 0, round(r @ r, 2), round(r2(y, X @ w), 3), np.diag(H).round(2))
# [1.1 1.1] [-0.1  0.8 -1.3  0.6] [0. 0.] 2.7 0.691 [0.7 0.3 0.3 0.7]
s2 = r @ r / (4 - 2)                                  # несмещённая оценка дисперсии шума, n - d = 2
print(round(s2, 2), np.sqrt(s2 * np.diag(np.linalg.inv(X.T @ X))).round(3))   # 1.35 [0.972 0.52 ]

# выборочное распределение w-hat: 30 точек на [0, 1], w = (1, 2), sigma = 0.5, 20 000 реализаций шума
Xs = np.column_stack([np.ones(30), np.linspace(0, 1, 30)])
W = np.array([np.linalg.lstsq(Xs, Xs @ [1, 2] + 0.5 * rng.normal(size=30), rcond=None)[0] for _ in range(20_000)])
print(W.mean(0).round(3), W.std(0).round(3), (0.5 * np.sqrt(np.diag(np.linalg.inv(Xs.T @ Xs)))).round(3))
# [1.001 2.   ] [0.177 0.303] [0.178 0.306]: средние по моделированию, стандартные отклонения по моделированию и по теории

# диабет (442 пациента, 10 признаков): scikit-learn вычисляет именно замкнутую формулу; линейная модель против kNN
Xd, yd = load_diabetes(return_X_y=True)
A = np.column_stack([np.ones(len(yd)), Xd])
wd = np.linalg.lstsq(A, yd, rcond=None)[0]
lr = LinearRegression().fit(Xd, yd)
print(f'{np.abs(wd - np.r_[lr.intercept_, lr.coef_]).max():.0e}', round(r2(yd, A @ wd), 3))   # 2e-12 0.518
cv = KFold(5, shuffle=True, random_state=0)
print(round(cross_val_score(LinearRegression(), Xd, yd, cv=cv, scoring='r2').mean(), 3),
      [round(float(cross_val_score(make_pipeline(StandardScaler(), KNeighborsRegressor(k)), Xd, yd, cv=cv, scoring="r2").mean()), 3) for k in (5, 10, 20, 40)])
# 0.489 [0.382, 0.444, 0.454, 0.428]

# R² на обучении не убывает с бесполезными признаками; на новых данных он рушится (50 + 50 точек)
z = rng.normal(size=(100, 1)); t = z[:, 0] + rng.normal(size=100)
for k in (0, 10, 20, 40):
    Z = np.column_stack([np.ones(100), z, rng.normal(size=(100, k))])
    v = np.linalg.lstsq(Z[:50], t[:50], rcond=None)[0]
    print(k, round(r2(t[:50], Z[:50] @ v), 3), round(r2(t[50:], Z[50:] @ v), 3))
# 0 0.572 0.325 | 10 0.649 0.154 | 20 0.747 -0.158 | 40 0.921 -0.71

# два почти одинаковых признака: коэффициенты скачут, а их сумма и прогнозы — нет
x1 = rng.normal(size=100); x2 = x1 + 0.01 * rng.normal(size=100); X2 = np.column_stack([x1, x2])
print(round(np.corrcoef(x1, x2)[0, 1], 5), f'{np.linalg.cond(X2.T @ X2):.1e}')   # 0.99994 3.5e+04
for _ in range(3):
    v = np.linalg.lstsq(X2, x1 + x2 + rng.normal(size=100), rcond=None)[0]
    print(v.round(2), round(v.sum(), 2))
# [-5.    6.88] 1.88 | [11.88 -9.9 ] 1.98 | [-8.83 10.94] 2.11
print(np.sqrt(np.diag(np.linalg.inv(X2.T @ X2))).round(2), round(1 / np.sqrt(x1 @ x1), 2))   # [9.74 9.73] 0.1: стандартные ошибки при sigma = 1

# обусловленность: полиномиальные признаки степени 10 на 50 точках; нормальные уравнения против QR/SVD (lstsq)
V = np.vander(np.linspace(0, 1, 50), 11, increasing=True); yv = V @ np.ones(11)
print(f'{np.linalg.cond(V):.1e} {np.linalg.cond(V.T @ V):.1e}',
      f'{np.abs(np.linalg.solve(V.T @ V, V.T @ yv) - 1).max():.0e} {np.abs(np.linalg.lstsq(V, yv, rcond=None)[0] - 1).max():.0e}')
# 2.0e+07 4.1e+14 4e-03 4e-10

# один выброс: наименьшие квадраты, Хьюбер (delta = 1) и наименьшие модули
xo = np.arange(10.); yo = np.array([1.3, 1.1, 2.2, 3.0, 2.7, 3.6, 3.5, 4.9, 13.0, 5.3]); Xo = np.column_stack([np.ones(10), xo])
huber = lambda r: np.where(np.abs(r) <= 1, 0.5 * r ** 2, np.abs(r) - 0.5)
fits = {'ls': np.linalg.lstsq(Xo, yo, rcond=None)[0],
        'ls without x=8': np.linalg.lstsq(np.delete(Xo, 8, 0), np.delete(yo, 8), rcond=None)[0],
        'huber': optimize.minimize(lambda v: huber(yo - Xo @ v).sum(), [0, 0], method='BFGS', options={'gtol': 1e-10}).x,
        'lad': optimize.linprog(np.r_[0, 0, np.ones(10)], A_ub=np.block([[Xo, -np.eye(10)], [-Xo, -np.eye(10)]]),
                                b_ub=np.r_[yo, -yo], bounds=[(None, None)] * 2 + [(0, None)] * 10).x[:2]}
for k, v in fits.items(): print(k, v.round(3))
# ls [0.373 0.819] | ls without x=8 [1.107 0.477] | huber [0.986 0.533] | lad [1.267 0.467]

# грубая ошибка при крайнем значении входа: десять точек на y = x и одна в (100, 0)
xl = np.r_[np.arange(10.), 100]; yl = np.r_[np.arange(10.), 0]; Xl = np.column_stack([np.ones(11), xl])
print(round(float(np.linalg.lstsq(Xl, yl, rcond=None)[0][1]), 2),
      round(float(optimize.minimize(lambda v: huber(yl - Xl @ v).sum(), [0, 1], method='BFGS', options={'gtol': 1e-10}).x[1]), 2),
      round(float(optimize.linprog(np.r_[0, 0, np.ones(11)], A_ub=np.block([[Xl, -np.eye(11)], [-Xl, -np.eye(11)]]),
                                   b_ub=np.r_[yl, -yl], bounds=[(None, None)] * 2 + [(0, None)] * 11).x[1]), 2))
# -0.04 -0.04 -0.04: наклоны наименьших квадратов, Хьюбера и наименьших модулей

Дальше#

Нормальным уравнениям нужна вся матрица X⊤XX^\top X и решение системы размера d×dd \times d, что недостижимо для миллиона признаков, и они существуют только для квадратичной ошибки: у функций потерь Хьюбера и абсолютной ошибки из последнего раздела, как и у логистической функции потерь из раздела о классификации, замкнутой формулы нет вовсе. Следующая заметка заменяет формулу итерацией, которой нужен только градиент, здесь 2X⊤(Xw−y)2X^\top(Xw - y), и показывает, что её скорость задаёт то же число обусловленности, из-за которого нормальные уравнения были неточны.

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

Литература#