
Линейная регрессия — проще некуда
В этой статье мы рассмотрим один из самых простых алгоритмов машинного обучения, а именно — линейную регрессию.
Это статья из цикла про основы машинного обучения.
В прошлой статье мы рассматривали машинное обучение в общем виде, без деталей работы. В этой же статье начнем разбираться в конкретных алгоритмах. И начнем с самой простой на мой взгляд модели — линейной регрессии.
Разбираемся с терминами
Для начала давайте определимся, что за задачу и как мы будем решать. Итак, решаем мы задачу регрессии. О том, что это за задача, мы говорили в прошлой статье, но на всякий случай напомню. У нас есть некие данные . Это может быть одно число или несколько (такой набор чисел называется вектором). Мы хотим для получить в качестве ответа одно значение, которое мы обозначаем . Это значение непрерывно и может быть в любом диапазоне.
В качестве примера такой задачи можно привести определение веса человека по его росту. Тогда входными данными у нас будет одно число — рост человека в сантиметрах. На выходе мы тоже получим одно число — вес в килограммах. Как же нам посчитать это значение?
Это нам подскажет второе слово в названии метода. Регрессия у нас линейная. Что это значит? Это значит, что для определения выходного значения мы будем использовать формулу прямой линии. Здесь стоит вспомнить школьную программу, в которой говорится, что прямая задается таким выражением:
Эту формулу легко использовать и для нашего случая. Просто обозначим вес человека, а — рост. На самом деле нам еще нужно немного поправить обозначения. Обычно обозначают правильный ответ, то есть, в нашем случае, реальный вес человека. Мы же пытаемся сделать прогноз, и наш результат, как говорилось выше, будем обозначать не , а . Но вернемся от обозначений к сути. Нам останется подобрать коэффициенты и , и мы сможем приблизительно решить задачу.
Но решение будет не очень точным (а скорее всего — очень неточным). Дело в том, что рост и вес не связаны линейной зависимостью напрямую. Есть высокие и худые люди, а есть невысокие и полные. И такая простая формула работать будет плохо. Чтобы увеличить точность нужно усложнять модель. Добавим обхват талии. Теперь наши входные данные уже не одно число , а вектор : обозначает рост, а — обхват талии. Выходные данные остались прежними — вес в килограммах. Формула при этом меняется, но не радикально:
Для успешного обучения нам теперь нужно найти уже не два, а три параметра: , и . Для дальнейшего повышения точности мы можем и дальше добавлять входные данные, например, длину ноги, обхват груди и так далее. При этом каждое новое число во входных данных приносит с собой и новый параметр модели, который нам нужно будет найти. В общем виде, если у нас много параметров (обозначим это «много» как ), формула будет иметь такой вид:
или
Все, что нам осталось — это разобраться, как найти параметры и .
Учимся обучаться
Для начала стоит вернуться к самому простому случаю, когда у нас один параметр. В таком виде формула выглядит так:
Как говорилось выше, обучение состоит в том, чтобы подобрать коэффициенты и . Какими должны быть эти коэффициенты? Мы хотим, чтобы наши ответы были максимально близки к правильным ответам . Что значит «максимально близки»? Разница между и должна быть минимальной. Это можно записать как
С модулями работать неудобно, поэтому лучше вместо модуля использовать квадрат. Математически это эквивалентно (если модуль стремится к нулю, то и квадрат стремится к нулю тоже):
Если бы у нас был всего один пример, то задача бы решалась элементарно: выбираем любую пару и так, чтобы . Таких пар бесконечное множество, это следует из геометрических соображений, что через одну точку можно провести бесконечное число прямых. Но мы хотим, чтобы наша модель работала не для одной пары значений, а для всех возможных. То есть нам нужно провести линию так, чтобы она в среднем была максимально близко ко всем точкам:
Знаменатель можем не учитывать, так как он ни на что не влияет. Теперь вспомним, как считается :
Оптимизация такой функции называется методом наименьших квадратов.

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

Если опять вспомнить школьную математику, то экстремум (минимум или максимум) функции находится там, где производная равна нулю (если такое место у функции есть). Это как раз наш случай: по графику мы видим, что экстремум у функции один, и как раз в нем и будет минимум.
Самое главное, что производные мы можем считать отдельно по каждой из переменных. Сначала считаем производную по . Знак суммы — это просто операция сложения. Вспоминаем цепное правило:
Считаем сначала по :
Уберем минус перед суммой, просто поменяв местами выражения в скобках:
Так как у нас теперь нет квадрата, мы можем разложить выражение на несколько сумм:
Обратите внимание, что — это просто сложение с самим собой раз, то есть .
Теперь вспомним, что мы ищем ноль производной. Значит, приравняем наше выражение к нулю:
Сократим двойки и перенесем элементы, чтобы выразить :
Теперь так же посчитаем производную по :
Переставляем элементы, чтобы убрать минус:
Приравниваем к нулю и сокращаем двойку:
В итоге мы получаем систему из двух уравнений:
Эту систему можно немного упростить. Давайте посмотрим на второе уравнение. Представим его как:
Что такое ? Это среднее значение (потому что мы сумму всех элементов делим на количество). Обозначим его как . Аналогично поступим с , там такое же среднее. В итоге получим:
Согласитесь: без всех этих сумм гораздо проще. Теперь поступим как в школе: подставим в первое уравнение.
Сократим все, что можно, и раскроем скобки:
В принципе, этого уже хватает, чтобы все посчитать. Можно просто перекинуть второе слагаемое на другую сторону и поделить:
Формулу расчета можно еще упростить. Как именно, я покажу в конце статьи, чтобы не оставлять здесь еще больше формул. В итоге мы получаем:
Таким образом, для любого набора и мы можем посчитать коэффициенты. Ведь не зависит от . Считаем его по формуле, а потом, уже зная , находим . И в итоге у нас есть первый рабочий алгоритм машинного обучения.
Теперь, когда у нас есть все коэффициенты, мы легко можем посчитать ответ для любых входных параметров по все той же формуле:
Пример использования
Вернемся к задаче определения веса человека по его росту. Допустим, у нас есть набор данных:
| Рост (x), см | Вес (y), кг |
|---|---|
| 154 | 43 |
| 196 | 107 |
| 172 | 73 |
| 185 | 80 |
| 161 | 66 |
В первую очередь, найдем средние значения:
Теперь нам надо найти коэффициенты. Начинаем с . Для каждого элемента считаем:
| 154 | 43 | -19.6 | -30.8 |
| 196 | 107 | 22.4 | 33.2 |
| 172 | 73 | -1.6 | -0.8 |
| 185 | 80 | 11.4 | 6.2 |
| 161 | 66 | -12.6 | -7.8 |
Теперь у нас есть все, чтобы посчитать по формуле:
В итоге получим
Теперь считаем :
Теперь, когда у нас есть все коэффициенты, мы можем предсказывать вес для любого роста. Пусть у нас будет баскетболист с ростом 210 сантиметров. Попробуем предсказать его вес:
Выглядит вполне правдоподобно.
Обобщаем
Теперь, когда мы умеем находить коэффициенты для одномерного случая, можно попробовать сделать это для случая многомерного. Тогда наша основная формула будет такой:
Оптимизировать же мы будем функцию
Сама оптимизация делается по тому же принципу. В итоге получается система из производных по каждому коэффициенту , одну производную по . В итоге мы получим систему из уравнения с неизвестным.
Решение такой системы уже будет лежать вне плоскости школьной математики, но оно вполне осуществимо. В результате мы так же найдем необходимые коэффициенты.
Если в случае с одним аргументом наша функция задавала прямую, в случае двух аргументов это уже будет плоскость, а при большем количестве — гиперплоскость.
Не все так радужно
Казалось бы, если обучение настолько быстрое и простое (всего лишь посчитать несколько формул), почему линейная регрессия не применяется повсеместно? Ответ тут лежит в слове «линейная». И сейчас попробуем разобраться почему.
Давайте вновь рассмотрим простейший случай. Зависимость от у нас линейная. Это значит, что мы можем хорошо предсказывать значения, только если в реальном мире зависимость между данными линейная или близка к такой. Если есть серьезные отличия от линейной зависимости, модель линейной регрессии по-прежнему будет давать какой-то результат, но он будет сильно расходиться с реальностью.

На картинке выше мы видим нелинейное распределение реальных данных (синие точки). Модель обучилась, постаравшись минимизировать расстояния между реальными данными и предсказаниями (красные точки). Но хоть расстояние и минимально возможное для данного случая, предсказание модели в зависимости от области может как быть относительно точным (2-я и 4-я точки), так и очень неточным (3-я точка).
Варианты с двумя или более аргументами также подвержены такому ограничению (но только уже не прямой, а плоскости или гиперплоскости).
Именно из-за этой своей особенности линейная регрессия применяется сравнительно редко. И применяется она только после обязательной проверки данных на линейную зависимость. Однако, если такая зависимость есть, мы получаем очень быстрый инструмент, гораздо быстрее любой из других моделей машинного обучения.
Например, линейная регрессия очень часто применяется в экономике, где линейность зависимости точно известна: прогнозирование продаж, активов, ВВП и так далее. Также она применяется банками и страховыми компаниями. В этой сфере важно не просто дать предсказание, но и объяснить его. И линейная регрессия лучше всего для этого подходит. Все ее параметры видны и понятны. В отличие от, например, нейросетей, которые, как мы увидим в следующих статьях цикла, для внешнего наблюдателя являются «черным ящиком».
Вместо послесловия
Как и обещал, показываю, как можно упростить формулы коэффициентов. Для этого нам понадобятся пара математических трюков и знания статистики.
Напомню исходное выражение:
Будем рассматривать только его первое слагаемое. Добавим к среднее значение, и сразу вычтем его для компенсации:
Раскроем скобки:
Разделим сумму на две части:
В первой части мы видим формулу квадрата разности:
Осталось разобраться со второй частью. Выносим за сумму:
А вот теперь тот самый трюк со статистикой. — это отклонение от среднего. И самое интересное, что сумма таких отклонений всегда равна нулю (это следует из статистики):
Таким образом эту часть выражения можно опустить.
Вернемся к исходному уравнению, и так же обработаем его вторую часть:
Второе слагаемое так же обратится в ноль, и мы получаем итоговое уравнение:
Отсюда, перенеся второе слагаемое направо, поменяв в нем знак и поделив, получаем:
Вопросы и ответы
Это означает, что модель предполагает линейную (прямую) зависимость между входными данными и результатом. Формула предсказания — это уравнение прямой (или уравнение плоскости/гиперплоскости для нескольких признаков). Если реальные данные описываются более сложной зависимостью, модель будет давать неточные результаты.
Модуль неудобен математически — он не имеет производной в точке нуля, что мешает применять стандартные методы оптимизации. Квадрат разности имеет производную везде, и при этом выполняет ту же роль: чем больше ошибка, тем больше значение функции. Кроме того, квадрат дополнительно штрафует за крупные ошибки, что часто полезно на практике.
Это способ подбора параметров модели, при котором минимизируется сумма квадратов разностей между правильными ответами и предсказаниями модели. Геометрически это означает, что мы проводим прямую (или плоскость) так, чтобы суммарное расстояние от неё до всех точек данных было минимальным.
Из школьной математики известно, что экстремум функции (минимум или максимум) находится там, где производная равна нулю. Функция потерь линейной регрессии представляет собой параболоид — поверхность с единственным минимумом. Поэтому точка, где производная равна нулю, гарантированно даёт нам минимум, а не максимум.
Принцип остаётся тем же, только формула расширяется. Вместо получаем , где каждому признаку соответствует свой коэффициент. Для двух признаков модель строит плоскость, для большего числа — гиперплоскость. Процесс обучения аналогичен: считаем производные по каждому коэффициенту, приравниваем к нулю и решаем полученную систему уравнений.
Главное ограничение — модель может хорошо описывать только линейные зависимости. В реальных данных связь между признаками и результатом часто нелинейная, и прямая линия (или плоскость) не сможет её улавливать. Поэтому линейную регрессию используют там, где зависимость действительно близка к линейной, и всегда после предварительной проверки данных. Зато в таких случаях она работает значительно быстрее более сложных моделей.
Вектор — это просто упорядоченный набор чисел. Например, если мы определяем вес человека по росту и обхвату талии, входные данные состоят из двух чисел: , где — рост, а — обхват талии. Это и есть вектор из двух элементов. Чем больше признаков мы используем, тем больше элементов в векторе и тем больше коэффициентов нужно найти при обучении.
Без формула выглядела бы как , то есть прямая обязательно проходила бы через начало координат. Это сильно ограничивает модель — далеко не все зависимости проходят через точку . Коэффициент позволяет сдвигать прямую вверх или вниз, делая модель гораздо более гибкой и точной.