Инструменты

Линейная регрессия

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

В этой статье мы сосредоточимся на применении линейной регрессии, разберём принцип её работы и рассмотрим примеры использования на практике.

Линейная регрессия — это алгоритм машинного обучения с учителем, предназначенный для предсказания числового (непрерывного) целевого значения. Она предполагает, что между входными признаками [math]x_i[/math] и целевой переменной [math]y[/math] существует линейная зависимость. Модель аппроксимирует То есть, линейная регрессия не обязательно точно отражает настоящую зависимость, но старается максимально близко её «приблизить» с помощью прямой линии (линейной функции) с такими коэффициентами, которые минимизируют ошибку предсказания. эту зависимость, находя оптимальные веса (коэффициенты [math]\beta_i[/math]), которые минимизируют разницу между предсказанным и фактическим значениями. Цель алгоритма — построить линию (или гиперплоскость в многомерном случае), которая наилучшим образом описывает связь между признаками и зависимой переменной.

В общем случае уравнение линейной регрессии выглядит следующим образом:$$y = \beta_{0} + \beta_{1}x_{1} + \beta_{2}x_{2} + \ldots + \beta_{n}x_{n} + \epsilon$$

где:

  • [math]y[/math] — целевая переменная; то, что мы пытаемся предсказать [ℹ] Если мы используем количество ванных комнат для прогнозирования цен на жилье, то цена на жилье является зависимой и непостоянной.
  • [math]x_i[/math] — независимые переменные: признаки, которые модель использует для моделирования [math]y[/math] [ℹ] Если мы используем количество ванн в комнатах для прогнозирования цен на жилье, то количество ванн в комнатах будет независимой переменной.
  • [math]\beta_{i}[/math] — коэффициенты нашей модели [ℹ] Коэффициент [math]\beta_{0}[/math] представляет собой точку пересечения нашей модели, а каждый другой коэффициент [math]\beta_{i}[/math] (i > 0) - это наклон, определяющий вклад переменной [math]x_{i}[/math] в модели. Интерпретация коэффициентов регрессии обсуждается далее в статье.
  • [math]\epsilon[/math] — неустранимая ошибка [ℹ] Неустранимая ошибка в нашей модели. Объединяет все немоделированные части данных.

Подгонка модели линейной регрессии заключается в нахождении набора коэффициентов, которые наилучшим образом описывают зависимость переменной [math]y[/math] от наших признаков. Мы, возможно, никогда не узнаем истинные параметры модели, но мы можем их оценить (в статье мы разберем это более подробно). После того как мы оценили эти коэффициенты, [math]\beta_{i}[/math], мы можем предсказывать будущие значения  по следующей [math]\hat{y}[/math] формуле:$$\hat{y} = \hat{\beta}_0 + \hat{\beta}_1 x_1 + \hat{\beta}_2 x_2 + \dots + \hat{\beta}_n x_n$$Таким образом, предсказание будущих значений (часто называемое выводом или инфренсом) сводится к простому подставлению значений наших признаков [math]x_{i}[/math] в уравнение!

Регрессия к среднему

Термин «регрессия» был в 1886 году предложен Фрэнсисом Гальтоном в его статье «Регрессия к среднему при наследовании роста». Гальтон описал биологический феномен, заключающийся в том, что разница в росте внутри популяции не увеличивается с течением времени.

Он заметил, что рост родителей не передается их детям по наследству — вместо этого рост детей регрессирует к среднему значению роста в популяции.

Кратко о том, как это работает

Чтобы было проще понять, как работает линейная регрессия, давайте вкратце рассмотрим, как она устроена. Кратко опишем основные концепции алгоритма, а затем углубимся в детали:

Давайте построим модель для прогнозирования стоимости жилья (в млн. ₽) в Москве на основе площади квартиры (в квадратных метрах):

цена-квартиры = [math]\hat{\beta}_1[/math] * площадь + [math]\hat{\beta}_0[/math]

Мы начнём с очень простой модели, которая предсказывает, что цена каждой квартиры будет равна средней цене в нашем наборе данных, то есть примерно 15 млн. ₽, без учёта различий в размерах квартир.

цена-квартиры = 0 * площадь + 15000000

Конечно, мы знаем, что эта модель плоха — она вообще не соответствует данным. Но как можно точно определить, насколько она плоха?

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

Цель линейной регрессии — уменьшить эту погрешность, чтобы найти линию/поверхность, которая «наилучшим образом» соответствует нашим данным. Для нашей простой задачи регрессии это означает оценку точки пересечения с осью y и наклона нашей модели, [math]\hat{\beta}_0[/math] и [math]\hat{\beta}_1[/math].

Для решения нашей конкретной задачи показана линия наилучшего соответствия. Конечно, здесь есть погрешность, но общая закономерность хорошо прослеживается. В результате мы можем быть достаточно уверены в том, что при подстановке новых значений площади наши прогнозируемые значения цены будут достаточно точными.

После того как мы настроили нашу модель, прогнозировать будущие значения стало очень просто! Мы просто подставляем любые значения [math]X[/math] в наше уравнение!

Для нашей простой модели это означает подстановку значения площади в нашу модель:

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

Те, кто работает в ML, привыкли проверять качество моделей стандартным разбиением на тренировочную и тестовую части. Статистики же чаще смотрят на такие метрики, как интервалы прогнозирования и корреляция, чтобы оценить статистическую значимость. Мы разберём оба способа оценки, чтобы вы могли свободно ориентироваться в обеих традициях и не чувствовать себя не в своей тарелке, когда приходится совмещать эти два мира.

Простая линейная регрессия с помощью scikit-learn

Теперь мы рассмотрим её работу на практическом примере с программным кодом. Поддержка линейной регрессии есть во множестве инструментов — от Excel до языков программирования вроде R и Python. Мы будем использовать Python и сосредоточимся на библиотеке scikit-learn, которая позволяет быстро и просто решать такие задачи.

Чуть позже мы разберём, как реализовать линейную регрессию «вручную», чтобы понять внутренние механизмы — метод наименьших квадратов, градиентный спуск и другие важные приёмы.

А пока сосредоточимся на еще одном, интуитивном примере.

Представим, что у нас есть данные о 12 студентах: известно, сколько часов каждый из них готовился к экзамену и какой результат получил. Логично ожидать, что чем больше времени студент посвятил подготовке, тем выше его итоговый балл. Однако на результаты влияет и случайный фактор, поэтому связь будет не идеальной, а приближённой. Именно для таких случаев и нужна линейная регрессия.

Код PYTHON
Подсказка: Использование .flatten() для коэффициентов нужно, потому что sklearn возвращает их как двумерные массивы даже для одного признака.
Соединение...
</>
Результат

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

Но в чём подвох?

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

Чем у́же это облако — тем увереннее мы можем доверять модели. Чем шире — тем больше случайности и тем менее точными будут предсказания.

Ещё один важный момент: линейная регрессия надёжно работает только в пределах диапазона наших данных — в данном случае примерно от 3 до 10 часов подготовки. Если мы захотим спросить «а что будет при 0 часах?» или «а при 18 часах?» — модель даст какое-то число, но доверять ему сильно не стоит. За пределами имеющихся данных мы уже не прогнозируем, а экстраполируем, а это совсем другая степень надёжности.

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

Не забывайте о смещении выборки!

Всегда стоит задаться вопросом: откуда вообще взялись эти 12 студентов? Они все из одного курса или факультета? Из одного университета? А может, это добровольцы, которые сами решили поучаствовать в исследовании? Если в выборку попали только самые мотивированные или самые слабые студенты — это уже смещение.

Представьте, что мы собирали данные только у студентов, которые сами пришли на консультацию по подготовке к экзамену. Скорее всего, в такую группу попадут либо те, кто очень боится провалиться, либо те, кто и так хорошо учится. В результате связь между часами подготовки и баллами может оказаться искажённой — она будет выглядеть сильнее (или слабее), чем в реальности для всех студентов.

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

Если не учесть возможное смещение, даже самая красивая линия регрессии может привести к совершенно неверным выводам. Поэтому, прежде чем доверять модели, всегда полезно задать себе несколько простых вопросов о происхождении данных.

Остатки и квадратичные отклонения

Когда мы используем инструменты вроде scikit-learn для построения линейной регрессии, под капотом происходит поиск идеальной прямой линии, которая наилучшим образом описывает наши данные. Но что означает слово «идеальная» в этом контексте?

Прежде всего нужно решить два фундаментальных вопроса:

  1. Что значит «наилучшая подгонка»?
  2. Как добиться «наилучшей подгонки»?

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

Если точка находится выше прямой, соответствующий остаток будет положительным, а если ниже, то отрицательным. Иначе говоря, остаток это разность между прогнозируемым значением [math]y[/math] (лежащим на прямой) и фактическим значением из набора данных. Остатки также называют отклонениями или ошибками, потому что они показывают, насколько наши прогнозы отличаются от наблюдаемых данных.

Код PYTHON
Соединение...
</>
Результат

Когда мы подгоняем прямую к 12 точкам данных, логично стремиться уменьшить остатки так, чтобы общий разрыв между прямой и точками оказался минимальным. Но как измерить этот «общий разрыв»? Удобнее всего выразить его через сумму квадратов всех остатков: каждый остаток возвести в квадрат и затем сложить результаты. Для этого из каждого фактического значения [math]y[/math] вычитают прогнозируемое значение ([math]y[/math]) (то есть ([math]y[/math])-координату соответствующей точки на прямой), после чего квадраты всех полученных разностей суммируют.

Давайте модифицируем наш код, чтобы найти сумму квадратов.

Код PYTHON
Подсказка: .itertuples() превращает каждую строку DataFrame в именованный кортеж, по которому можно итерироваться и обращаться к полям через точку.
Соединение...
</>
Результат
Почему в линейной регрессии берут квадраты, а не модуль, кубы или биквадрат?
Складывать ошибки напрямую нельзя: плюсы и минусы взаимно обнулятся. Можно вместо квадратов складывать модули ошибок — это называется LAD-регрессияLeast Absolute Deviations (L1) — метод регрессии, минимизирующий сумму абсолютных значений ошибок вместо квадратов.. Она работает и часто более устойчива к выбросам, но модуль неудобен математически: у него есть «угол» в нуле (в точке, где ошибка ровно 0, производная не определена), поэтому с производными и градиентным спуском приходится возиться.
Квадраты (L2) удобны тем, что функция потерь получается гладкой и выпуклой. А это значит: у неё есть глобальный минимум, и если матрица признаков имеет полный рангПолный ранг означает отсутствие мультиколлинеарности — ситуации, когда один признак можно точно выразить через другие. При полном ранге решение единственное. (нет мультиколлинеарности), то он единственный. Поэтому оптимизация надёжная: куда бы вы ни шли по градиенту, вы придёте к одному и тому же ответу.
Кубы (если суммировать e³ без модуля) плохи тем, что сохраняют знак: отрицательные и положительные ошибки снова начинают частично компенсировать друг друга. Более того, функция становится неограниченной снизу и может уйти в минус бесконечность, что делает оптимизацию бессмысленной.
Биквадраты (e⁴) знак убирают, но слишком резко наказывают большие промахи. Одна крупная ошибка получает огромный вес и может чрезмерно сильно тянуть решение. Геометрически поверхность потерь становится более крутой: градиенты при больших ошибках растут существенно быстрее (производная e⁴ — это 4e³), и одна крупная ошибка начинает доминировать в функции потерь, чрезмерно сильно притягивая к себе решение. Это делает модель ещё более чувствительной к выбросам, чем обычные квадраты, и менее стабильной в обучении.
Итог: квадраты дают простую, гладкую и геометрически «ровную» задачу с надёжной оптимизацией и разумным балансом чувствительности к ошибкам.

Наша модель:

Теперь переходим ко второму вопросу: как именно найти значения коэффициентов, которые обеспечат этот минимум? Для дальнейшего изложения перейдём от школьной нотации ([math]m[/math]  и [math]b[/math] ) к стандартной статистической: [math]b_1[/math]  (наклон) и [math]b_0[/math]  (свободный член). И главное — как сделать это самостоятельно, без помощи сторонних инструментов (таких как sklearn).

Поиск оптимальной прямой

Теперь, когда у нас есть общее представление о том, как работает линейная регрессия, давайте углубимся в эту тему. В оставшейся части статьи мы сосредоточимся на ключевых аспектах: как найти «лучшую» моделькакие существуют методы для нахождения весов ([math]\hat{\beta}_0[/math] и [math]\hat{\beta}_1[/math]), а также как интерпретировать различные формы регрессионных моделей. Мы также расскажем об основных допущениях, лежащих в основе правильного использования регрессионных моделей в статистике.

В частности, мы рассмотрим пять основных подходов к нахождению весов линейной регрессии:

  1. Аналитическое решение в закрытой форме (также известное как метод нормальных уравнений или метод обратных матриц): [math]\beta = (X^{\top}X)^{-1}X^{\top}y[/math]. Оно даёт точное решение за один шаг, но имеет серьёзные ограничения: высокая вычислительная сложность ([math]\mathcal{O}(n^3)[/math]), численная неустойчивость при мультиколлинеарности и проблемы с большими данными, когда матрица [math]X^{T}X[/math] не помещается в память.
  2. Итеративные методы оптимизации: Градиентный спуск - итеративный численный метод оптимизации, не требующий вычисления и инверсии матрицы [math]X^{T}X[/math]. Хорошо масштабируется на большие наборы данных, но требует настройки скорости обучения и может медленно сходиться.
  3. Методы разложения матриц (например, QR-разложение или SVD): Более численно стабильные альтернативы прямому вычислению обратной матрицы. Они позволяют надёжно решать систему нормальных уравнений даже при плохо обусловленных матрицах и являются стандартным подходом в большинстве современных библиотек (NumPy, scikit-learn).

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

Аналитическое решение 

Для линейной регрессии существует точное аналитическое решение, которое можно получить методом наименьших квадратов. Рассмотрим задачу: имеется набор данных из [math]n[/math] наблюдений, где [math] \mathbf{X}[/math] — матрица признаков размерности [math] n \times (k+1)[/math] (включая столбец единиц для свободного члена), а [math] \mathbf{y}[/math] — вектор целевых значений размерности [math] n \times 1[/math] . Наша модель имеет вид:$$\mathbf{y} = \mathbf{X}\boldsymbol{\beta} + \boldsymbol{\varepsilon}$$где [math]\boldsymbol{\beta}[/math] — вектор параметров (коэффициентов), а [math] \boldsymbol{\varepsilon}[/math] — вектор ошибок.

Рассмотрим его на конкретном примере.

Задача: У нас есть данные о площади квартир и их стоимости. Нужно найти зависимость цены от площади.

Площадь (м²)Цена (млн ₽)
507
608
8010

Наша модель: [math]y = \beta_0 + \beta_1x[/math], где [math]y[/math] — цена, [math]x[/math] — площадь.

Шаг 1: Формируем матрицу признаков и вектор целевых значений

Матрица [math]\mathbf{X}[/math] включает столбец единиц (для свободного члена [math]\beta_0[/math]) и столбец признаков:$$\mathbf{X} = \begin{pmatrix} 1 & 50 \\ 1 & 60 \\ 1 & 80 \end{pmatrix}, \quad \mathbf{y} = \begin{pmatrix} 7 \\ 8 \\ 10 \end{pmatrix}$$Шаг 2: Вычисляем [math]\mathbf{X}^T\mathbf{X}[/math]$$\mathbf{X}^T = \begin{pmatrix} 1 & 1 & 1 \\ 50 & 60 & 80 \end{pmatrix}$$$$\mathbf{X}^T\mathbf{X} = \begin{pmatrix} 1 & 1 & 1 \\ 50 & 60 & 80 \end{pmatrix} \begin{pmatrix} 1 & 50 \\ 1 & 60 \\ 1 & 80 \end{pmatrix} = \begin{pmatrix} 3 & 190 \\ 190 & 12500 \end{pmatrix}$$Шаг 3: Вычисляем [math]\mathbf{X}^T\mathbf{y}[/math]$$\mathbf{X}^T\mathbf{y} = \begin{pmatrix} 1 & 1 & 1 \\ 50 & 60 & 80 \end{pmatrix} \begin{pmatrix} 7 \\ 8 \\ 10 \end{pmatrix} = \begin{pmatrix} 25 \\ 1630 \end{pmatrix}$$Шаг 4: Находим обратную матрицу [math](\mathbf{X}^T\mathbf{X})^{-1}[/math]

Для матрицы 2x2:$$\begin{pmatrix} a & b \\ c & d \end{pmatrix}^{-1} = \frac{1}{ad-bc} \begin{pmatrix} d & -b \\ -c & a \end{pmatrix}$$Определитель: [math]\det = 3 \cdot 12500 - 190 \cdot 190 = 37500 - 36100 = 1400[/math]$$(\mathbf{X}^T\mathbf{X})^{-1} = \frac{1}{1400} \begin{pmatrix} 12500 & -190 \\ -190 & 3 \end{pmatrix}$$Примечание: мы оставляем дробь [math]\frac{1}{1400}[/math] за скобками, чтобы избежать погрешностей округления на следующем шаге.

Шаг 5: Применяем формулу [math]\boldsymbol{\beta} = (\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^T\mathbf{y}[/math]$$\beta = \frac{1}{1400} \begin{pmatrix} 12500 & -190 \\ -190 & 3 \end{pmatrix} \begin{pmatrix} 25 \\ 1630 \end{pmatrix}$$$$\beta = \frac{1}{1400} \begin{pmatrix} 12500 \cdot 25 - 190 \cdot 1630 \\ -190 \cdot 25 + 3 \cdot 1630 \end{pmatrix} = \frac{1}{1400} \begin{pmatrix} 312500 - 309700 \\ -4750 + 4890 \end{pmatrix}$$$$\beta = \frac{1}{1400} \begin{pmatrix} 2800 \\ 140 \end{pmatrix} = \begin{pmatrix} 2 \\ 0.1 \end{pmatrix}$$Ответ: Наша модель: [math]y = 2 + 0.1x[/math]

Это означает, что базовая цена квартиры (например, стоимость самой земли или подведенных коммуникаций) составляет 2 млн ₽, и каждый квадратный метр площади добавляет к стоимости 0.1 млн ₽ (100 тыс. ₽).

Проверка: Для площади 60 м²: [math]y = 2 + 0.1 \cdot 60 = 2 + 6 = 8[/math] млн ₽ (идеально совпадает с нашими данными).

Код PYTHON
Соединение...
</>
Результат

Это аналитическое решение даёт точный результат за один шаг, без итераций. Однако при большом числе признаков (обычно при [math]n > 10{,}000[/math]) вычисление обратной матрицы становится дорогим ([math]O(n^3)[/math]), и тогда используют градиентные методы.


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

Кликните, чтобы добавить точки и обновить оценки

Градиентный спуск

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

Полное объяснение работы градиентного спуска мы разобрали в этой статье.

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

Наша модель:

Градиентный спуск:

=

=

=

Итерация: 0

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

Методы разложения матриц

Мы уже познакомились с двумя способами найти оптимальные коэффициенты [math]\beta[/math]:

  1. аналитическим — через нормальные уравнения [math](\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^T\mathbf{y}[/math],
  2. итеративным — с помощью градиентного спуска.

Но у прямого обращения матрицы (XᵀX)⁻¹ есть важный недостаток. Когда признаков становится много или они сильно коррелируют между собой, матрица XᵀX становится «плохо обусловленной». Даже крошечные ошибки округления в компьютере могут сильно исказить результат.

Поэтому на практике вместо того, чтобы обращать матрицу напрямую, используют методы разложения матриц. Самые популярные из них — QR-разложение и сингулярное разложение (SVD).

Чтобы избежать этих проблем, современные алгоритмы машинного обучения используют метод Сингулярного разложения (SVD — Singular Value Decomposition): функция numpy.linalg.lstsq()LinearRegression из scikit-learn под капотом) по умолчанию использует именно SVD-разложение. Так что когда вы пишете model.fit(X, y), библиотека уже применяет самый устойчивый метод..

Идея SVD заключается в том, что любую, даже самую неудобную прямоугольную матрицу [math]\mathbf{X}[/math], можно представить как произведение трех специальных матриц:$$\mathbf{X} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^T$$где:

  • [math]\mathbf{U}[/math] — ортогональная матрица, описывающая взаимосвязи между строками (нашими наблюдениями).
  • [math]\mathbf{\Sigma}[/math] — диагональная матрица. На ее главной диагонали стоят сингулярные числа, которые показывают «важность» каждого направления в данных.
  • [math]\mathbf{V}^T[/math] — транспонированная ортогональная матрица, описывающая взаимосвязи между столбцами (нашими признаками).

Благодаря этому разложению мы можем найти так называемую псевдообратную матрицу Мура-Пенроуза (обозначается как [math]\mathbf{X}^+[/math]). Она вычисляется без сложных определителей:$$\mathbf{X}^+ = \mathbf{V} \mathbf{\Sigma}^+ \mathbf{U}^T$$А наши идеальные коэффициенты [math]\boldsymbol{\beta}[/math] находятся простым матричным умножением:$$\boldsymbol{\beta} = \mathbf{X}^+ \mathbf{y}$$


Под капотом SVD: Откуда берутся матрицы [math]\mathbf{U}[/math], [math]\mathbf{\Sigma}[/math] и [math]\mathbf{V}[/math]?

Возможно, у вас возник вопрос: "А как алгоритм понимает, на какие именно числа нужно раскладывать исходную матрицу?"

Никакой магии здесь нет. Сингулярное разложение базируется на старом добром умножении матрицы на саму себя — том самом [math]\mathbf{X}^T\mathbf{X}[/math], которое мы считали в аналитическом решении! Давайте разберем это на нашем примере с квартирами. Напомним нашу матрицу признаков [math]\mathbf{X}[/math] и вектор цен [math]\mathbf{y}[/math]:$$\mathbf{X} = \begin{pmatrix} 1 & 50 \\ 1 & 60 \\ 1 & 80 \end{pmatrix}, \quad \mathbf{y} = \begin{pmatrix} 7 \\ 8 \\ 10 \end{pmatrix}$$Ранее мы уже выяснили, что:$$\mathbf{X}^T\mathbf{X} = \begin{pmatrix} 3 & 190 \\ 190 & 12500 \end{pmatrix}$$

1. Матрица [math\mathbf{V}[/math] (правые сингулярные векторы)

В линейной алгебре у любой квадратной матрицы есть собственные векторы (направления, которые не меняются при умножении на матрицу). Если мы найдем собственные векторы для матрицы [math]\mathbf{X}^T\mathbf{X}[/math] и запишем их в столбцы, мы получим матрицу [math]\mathbf{V}[/math] (значения округлены для наглядности):$$\mathbf{V} = \begin{pmatrix} 0.0152 & -0.9999 \\ 0.9999 & 0.0152 \end{pmatrix}$$

(Первый столбец описывает направление наибольшего разброса данных, второй — перпендикулярное ему направление).

2. Матрица [math]\mathbf{\Sigma}[/math] (сингулярные числа)

У каждого собственного вектора есть своя "сила" — собственное значение (обозначается как [math]\lambda[/math]). Для нашей [math]\mathbf{X}^T\mathbf{X}[/math] они равны примерно 12502.888 и 0.112.

Сингулярные числа — это просто квадратные корни из собственных значений:

  • [math]\sigma_1 = \sqrt{12502.888} \approx 111.8163[/math]
  • [math]\sigma_2 = \sqrt{0.112} \approx 0.3346[/math]

Помещаем их на диагональ матрицы и получаем [math]\mathbf{\Sigma}[/math]:$$\mathbf{\Sigma} = \begin{pmatrix} 111.8163 & 0 \\ 0 & 0.3346 \end{pmatrix}$$

3. Матрица [math]\mathbf{U}[/math] (левые сингулярные векторы)

Столбцы матрицы [math]\mathbf{U}[/math] можно легко вычислить, умножив исходную матрицу [math]\mathbf{X}[/math] на векторы из [math]\mathbf{V}[/math] и разделив на соответствующие сингулярные числа ([math]\mathbf{u}_i = \frac{1}{\sigma_i} \mathbf{X} \mathbf{v}_i[/math]).

Например, для первого столбца:$$\frac{1}{111.8163} \begin{pmatrix} 1 & 50 \\ 1 & 60 \\ 1 & 80 \end{pmatrix} \begin{pmatrix} 0.0152 \\ 0.9999 \end{pmatrix} = \begin{pmatrix} 0.4472 \\ 0.5367 \\ 0.7155 \end{pmatrix}$$Проделав это для обоих столбцов, алгоритм формирует финальную матрицу [math]\mathbf{U}[/math]:$$\mathbf{U} = \begin{pmatrix} 0.4472 & -0.7169 \\ 0.5367 & -0.2627 \\ 0.7155 & 0.6458 \end{pmatrix}$$


Вычисление коэффициентов [math]\boldsymbol{\beta}[/math] шаг за шагом

Теперь, когда у нас есть все компоненты, давайте соберем формулу [math]\boldsymbol{\beta} = \mathbf{V} \mathbf{\Sigma}^+ \mathbf{U}^T \mathbf{y}[/math] (двигаясь справа налево) и найдем веса нашей модели.

Шаг 1: Вычисляем [math]\mathbf{U}^T \mathbf{y}[/math]

Умножим транспонированную [math]\mathbf{U}[/math] на вектор цен [math]\mathbf{y}[/math]:$$\mathbf{U}^T \mathbf{y} = \begin{pmatrix} 0.4472 & 0.5367 & 0.7155 \\ -0.7169 & -0.2627 & 0.6458 \end{pmatrix} \begin{pmatrix} 7 \\ 8 \\ 10 \end{pmatrix} = \begin{pmatrix} 14.579 \\ -0.6619 \end{pmatrix}$$

Шаг 2: Находим псевдообратную матрицу [math]\mathbf{\Sigma}^+[/math] и умножаем ее на результат

Это самый красивый момент SVD! Чтобы обратить диагональную матрицу [math]\mathbf{\Sigma}[/math], мы просто делим единицу на каждое число её диагонали.$$\mathbf{\Sigma}^+ = \begin{pmatrix} \frac{1}{111.8163} & 0 \\ 0 & \frac{1}{0.3346} \end{pmatrix} = \begin{pmatrix} 0.0089 & 0 \\ 0 & 2.9887 \end{pmatrix}$$(Именно здесь SVD спасает модель от мультиколлинеарности: если сингулярное число близко к нулю, алгоритм просто приравнивает его к нулю, избегая деления на микроскопические значения и спасая веса от «взрыва»).

Умножаем [math]\mathbf{\Sigma}^+[/math] на вектор из первого шага:$$\mathbf{\Sigma}^+ (\mathbf{U}^T \mathbf{y}) = \begin{pmatrix} 0.0089 & 0 \\ 0 & 2.9887 \end{pmatrix} \begin{pmatrix} 14.579 \\ -0.6619 \end{pmatrix} = \begin{pmatrix} 0.1298 \\ -1.9782 \end{pmatrix}$$

окружность VT Σ U (результат)
① Единичная окружность
② Поворот VT
③ Растяжение Σ
④ Поворот U (= XTX)
Регрессия через SVD-разложение

Кликните, чтобы добавить точки (ПКМ — удалить)

Шаг 3: Умножаем результат на [math]\mathbf{V}[/math]

Последнее действие — умножить матрицу [math]\mathbf{V}[/math] на полученный вектор, чтобы получить итоговые коэффициенты [math]\boldsymbol{\beta}[/math]:$$\boldsymbol{\beta} = \begin{pmatrix} 0.0152 & -0.9999 \\ 0.9999 & 0.0152 \end{pmatrix} \begin{pmatrix} 0.1298 \\ -1.9782 \end{pmatrix}$$Считаем [math]\beta_0[/math]: [math]0.0152 \cdot 0.1298 + (-0.9999) \cdot (-1.9782) \approx 1.98 \approx 2[/math]

Считаем [math]\beta_1[/math]: [math]0.9999 \cdot 0.1298 + 0.0152 \cdot (-1.9782) \approx 0.0998 \approx 0.1[/math]

(Небольшие отклонения от идеальных 2 и 0.1 возникли исключительно из-за того, что мы округлили матрицы до четырех знаков. Машина, считая высокой точностью, выдает ровно 2 и 0.1).

Итог: Мы снова получили те же коэффициенты: [math]\beta_0 = 2[/math] и [math]\beta_1 = 0.1[/math]. Наша финальная модель: [math]y = 2 + 0.1x[/math].

Код PYTHON
Соединение...
</>
Результат

Разложение SVD кажется абстрактным только на первый взгляд. На самом деле это просто умный способ разобрать матрицу [math]\mathbf{X}[/math] на её фундаментальные составляющие, используя концепции собственных векторов. Этот метод позволяет нам найти веса модели стабильно, безопасно и без поиска сложных определителей. Именно поэтому SVD является "золотым стандартом" в математике машинного обучения.

Коэффициент корреляции

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

Регрессионная модель с одним бинарным признаком
Цена квартиры vs Балкон (бинарный)
Пример:
Регрессионная модель с одним непрерывным признаком
Цена квартиры vs Площадь (непрерывный)
Пример:
Множественная линейная регрессия
Цена квартиры vs Площадь + Балкон
Пример:
Регрессия с взаимодействием признаков
Цена квартиры vs Площадь × Балкон
Пример:
Комментарии
Пред.
Вопросы по классическому ML (Предобработка данных и признаки)

Вопросы по классическому ML (Предобработка данных и признаки)

Содержание Показать На каких признаках можно обучать модели, какие они

Вам также может понравиться
помощник
Сохранить в заметки
Спросить у нейросети
Линейная регрессия
Комментарий: