Линейная регрессия на пальцах

Самая важная формула первого раздела — уравнение прямой — и её смысл в ML.

Линейная регрессия — модель, которая описывает зависимость метки от признаков прямой линией.

Уравнение прямой

Всё держится на школьной формуле прямой:

y = k * x + b

Здесь:

  • x — признак (например, площадь квартиры);
  • y — предсказание (цена);
  • kнаклон: на сколько растёт y, когда x увеличивается на единицу (цена за дополнительный квадратный метр);
  • bсдвиг: значение y при x = 0 (базовая цена).

Обучить линейную регрессию — значит подобрать такие k и b, чтобы прямая проходила как можно ближе к точкам данных. Это и есть «обучение» для этой модели: всего два числа, но они полностью задают зависимость.

Почему прямая, а не точное попадание

Реальные точки никогда не лежат идеально на одной линии: на цену влияют ремонт, вид из окна, настроение продавца — всё это шум, который мы не учли. Линейная регрессия не пытается пройти через каждую точку. Она ищет линию, которая в среднем ближе всего ко всем точкам сразу. Получается «линия тренда».

Считаем предсказание вручную

Пусть модель уже подобрала k = 150 000 (руб за м²) и b = 2 000 000 (базовая цена). Посмотрим, что она предскажет. Код запускается:

# Готовая прямая: y = k*x + b
k = 150_000      # цена за дополнительный квадратный метр
b = 2_000_000    # базовая часть цены

def predict(area):
    return k * area + b

for area in [40, 60, 80]:
    price = predict(area)
    print(f"{area} м2 -> {price/1_000_000:.2f} млн руб")

Вывод:

40 м2 -> 8.00 млн руб
60 м2 -> 11.00 млн руб
80 м2 -> 14.00 млн руб

Видно, как работает наклон: каждые +20 м² добавляют ровно 3 млн (20 × 150 000). А сдвиг b — это та часть цены, что есть даже у крошечной квартиры.

Несколько признаков

Обычно признаков больше одного. Тогда у каждого свой коэффициент:

y = k1*площадь + k2*комнаты + k3*этаж + ... + b

Идея та же — взвешенная сумма признаков плюс сдвиг. Геометрически это уже не линия на плоскости, а «плоскость» в многомерном пространстве, но смысл коэффициентов сохраняется: каждый показывает вклад своего признака.

# Линейная модель с двумя признаками
def predict(area, rooms):
    return 120_000 * area + 500_000 * rooms + 1_000_000

print(predict(40, 1) / 1_000_000, "млн")
print(predict(60, 2) / 1_000_000, "млн")
print(predict(80, 3) / 1_000_000, "млн")

Вывод:

6.3 млн
9.2 млн
12.1 млн

Откуда берутся k и b

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

Итог

  • Линейная регрессия — это прямая y = k*x + b.
  • k (наклон) — насколько растёт ответ при росте признака; b (сдвиг) — базовое значение.
  • Обучить модель = подобрать k и b, чтобы линия в среднем была ближе всего к точкам.
  • При нескольких признаках у каждого свой коэффициент: взвешенная сумма плюс сдвиг.
Проверьте себя
1. Что означает коэффициент k (наклон) в формуле y = k*x + b?
AЗначение y при x = 0
BНа сколько изменится y при увеличении x на единицу
CСреднюю ошибку модели
DКоличество признаков
2. Что значит «обучить» линейную регрессию?
AПровести прямую через каждую точку без исключений
BПодобрать коэффициенты k и b так, чтобы прямая в среднем была ближе всего к точкам
CУдалить из данных все выбросы
DПеревести задачу в классификацию
3. Почему линейная регрессия не проходит точно через все точки данных?
AИз-за ошибки в коде
BПотому что в данных есть шум и неучтённые факторы, поэтому ищут линию, близкую ко всем точкам в среднем
CПотому что прямая всегда горизонтальна
DПотому что точек слишком мало
Поддержать проект