Что такое регрессия: линейная модель, МНК и виды регрессии

Что такое регрессия: линейная модель, МНК и виды регрессии Полезное

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

Ниже разберем, чем регрессия отличается от классификации и от регрессионного тестирования, как устроена простая линейная модель Y = a + bx, что такое метод наименьших квадратов и коэффициент R^2, какие бывают виды регрессии и где проходит граница их применимости. Примеры на Python запущены, вывод в статье — реальный.

Регрессия, классификация и регрессионное тестирование

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

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

Простая линейная регрессия

Простая линейная регрессия — это модель, которая описывает связь двух переменных прямой линией. Ее уравнение:

Y = a + b*x

  • Y — предсказанное значение (зависимая переменная, отклик).
  • x — входной признак (независимая переменная, предиктор).
  • b — наклон (угловой коэффициент): на сколько меняется Y при росте x на единицу.
  • a — свободный член (пересечение): значение Y при x = 0.

Задача обучения — подобрать такие a и b, чтобы прямая прошла как можно ближе к точкам наблюдений. «Ближе» формализуют через функцию потерь: считают, насколько предсказания отклоняются от реальных y, и минимизируют это отклонение.

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

Стандартный способ подбора a и b — метод наименьших квадратов (МНК). Для каждой точки берут остаток — вертикальное расстояние от точки до линии, — возводят его в квадрат и складывают. Наилучшая прямая та, у которой сумма квадратов остатков минимальна.

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

Соберем модель на маленьком наборе «площадь квартиры -> цена» без сторонних библиотек, чтобы формула была видна целиком:

# Простая линейная регрессия методом наименьших квадратов (МНК), без библиотек.
# Данные: площадь квартиры (кв. м) -> цена (млн руб).
x = [28, 33, 41, 45, 52, 60, 68, 75]
y = [3.1, 3.6, 4.2, 4.7, 5.4, 6.1, 6.8, 7.6]

n = len(x)
mx = sum(x) / n            # среднее по x
my = sum(y) / n            # среднее по y

# Ковариация и дисперсия x (числитель и знаменатель формулы наклона)
Sxy = sum((xi - mx) * (yi - my) for xi, yi in zip(x, y))
Sxx = sum((xi - mx) ** 2 for xi in x)

b = Sxy / Sxx              # наклон (угловой коэффициент)
a = my - b * mx            # свободный член (пересечение)

# Коэффициент детерминации R^2: доля разброса y, объясненная моделью
ss_res = sum((yi - (a + b * xi)) ** 2 for xi, yi in zip(x, y))
ss_tot = sum((yi - my) ** 2 for yi in y)
r2 = 1 - ss_res / ss_tot

print("наклон b   =", round(b, 4))
print("свободный член a =", round(a, 4))
print("R^2        =", round(r2, 4))

# Прогноз для новой площади 50 кв. м
x_new = 50
print("прогноз цены для 50 кв. м =", round(a + b * x_new, 2), "млн руб")

Вывод программы:

наклон b   = 0.0948
свободный член a = 0.4233
R^2        = 0.9985
прогноз цены для 50 кв. м = 5.16 млн руб

Наклон 0.0948 читается так: каждый дополнительный квадратный метр добавляет к цене около 0.095 млн руб, то есть 95 тысяч. Свободный член здесь — лишь точка пересечения оси, буквального смысла «цена нулевой площади» у него нет.

Как понять, что модель хорошая

Коэффициент детерминации R^2 показывает, какую долю разброса y объясняет модель. R^2 = 1 — идеальное попадание, R^2 = 0 — модель не лучше среднего. В примере вышло 0.9985, потому что данные почти легли на прямую; на реальных данных так гладко не бывает.

Только на R^2 полагаться нельзя, обычно смотрят и на средние ошибки прогноза:

  • MAE (средняя абсолютная ошибка) — средний модуль отклонения, в тех же единицах, что y.
  • RMSE (корень из средней квадратичной ошибки) — похоже на MAE, но сильнее наказывает крупные промахи.

Важна граница: высокий R^2 на обучающих данных еще не значит, что модель будет точна на новых. Проверять качество нужно на отложенной выборке, которую модель не видела при обучении.

Виды регрессии

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

Вид регрессии В чем идея Когда брать
Линейная прямая Y = a + bx связь близка к линейной, признаков немного
Множественная линейная несколько признаков: Y = a + b1x1 + b2x2 + … на результат влияет сразу много факторов
Полиномиальная добавляет степени признака (x^2, x^3) связь заметно изогнута, нелинейна
Гребневая (ridge, L2) линейная + штраф за большие коэффициенты признаки коррелируют, модель переобучается
Лассо (lasso, L1) штраф, обнуляющий часть коэффициентов нужен автоматический отбор признаков
Эластичная сеть (elastic net) смесь L1 и L2 много коррелирующих признаков сразу
Логистическая предсказывает вероятность класса ответ — категория, а не число (это уже классификация)

Логистическая регрессия попала в список из-за названия, но по сути решает задачу классификации: на выходе — вероятность от 0 до 1, а не произвольное число. Держите это в голове, чтобы не выбрать ее для предсказания цены.

Полиномиальная регрессия и переобучение

Если точки ложатся не на прямую, а на кривую, добавляют степени признака: Y = a + b1x + b2x^2 + … Формально это все та же линейная регрессия, только признаками становятся x, x^2, x^3 и так далее.

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

Регуляризация: ridge, lasso, elastic net

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

  • Гребневая (ridge, L2) штрафует сумму квадратов коэффициентов. Она уменьшает их, но не обнуляет — все признаки остаются в модели.
  • Лассо (lasso, L1) штрафует сумму модулей и умеет обнулять часть коэффициентов, то есть заодно отбирает признаки.
  • Эластичная сеть комбинирует оба штрафа и хорошо работает, когда коррелирующих признаков много.

Эффект ridge проще увидеть на одном признаке: для центрированных данных наклон превращается из Sxy/Sxx в Sxy/(Sxx + alpha), где alpha — сила штрафа. Чем больше alpha, тем сильнее наклон сжимается к нулю:

# Гребневая регрессия (ridge) на одном признаке: L2-штраф сжимает наклон к нулю.
# Для центрированных данных наклон МНК = Sxy / Sxx,
# наклон ridge = Sxy / (Sxx + alpha), где alpha - сила регуляризации.
x = [28, 33, 41, 45, 52, 60, 68, 75]
y = [3.1, 3.6, 4.2, 4.7, 5.4, 6.1, 6.8, 7.6]

n = len(x)
mx = sum(x) / n
my = sum(y) / n
Sxy = sum((xi - mx) * (yi - my) for xi, yi in zip(x, y))
Sxx = sum((xi - mx) ** 2 for xi in x)

print("alpha : наклон")
for alpha in [0, 10, 100, 1000]:
    b = Sxy / (Sxx + alpha)
    print(f"{alpha:5d} : {b:.4f}")

Вывод программы:

alpha : наклон
    0 : 0.0948
   10 : 0.0943
  100 : 0.0901
 1000 : 0.0625

При alpha = 0 получается обычный МНК. С ростом alpha наклон плавно уменьшается: модель становится проще и устойчивее к шуму, но при чрезмерном штрафе начинает недооценивать реальную связь. Значение alpha подбирают по качеству на проверочной выборке, а не наугад.

Типичные ошибки и границы

Регрессия — мощный, но не всесильный инструмент, и большинство провалов однотипны:

  • Экстраполяция. Модель обучена на площадях 28-75 кв. м; прогноз для 500 кв. м она даст, но верить ему нельзя — за пределами данных связь может измениться.
  • Корреляция вместо причины. Если два признака растут вместе, это не значит, что один вызывает другой. Регрессия ловит связь, а не причинность.
  • Выбросы. Одна аномальная точка сильно тянет линию МНК за собой, потому что ошибка возводится в квадрат. Данные стоит осматривать до обучения.
  • Переобучение. Слишком гибкая модель (высокая степень полинома, много признаков) запоминает шум. Лечится регуляризацией и честной проверкой на отложенных данных.

Выводы

  • Регрессия предсказывает непрерывное число по признакам; предсказание категории — это уже классификация, а регрессионное тестирование — вообще из другой области.
  • Простую линейную модель Y = a + bx подбирают методом наименьших квадратов: наклон равен ковариации x и y, деленной на дисперсию x.
  • Качество смотрят по R^2, MAE и RMSE и обязательно на отложенной выборке — высокий R^2 на обучающих данных еще не гарантирует точности на новых.
  • Виды регрессии выбирают под задачу; регуляризация ridge, lasso и elastic net сдерживает разбухание коэффициентов и переобучение при многих коррелирующих признаках.
  • Главные грабли однотипны: экстраполяция за пределы данных, подмена причины корреляцией, выбросы и переобучение.

Где применяется и что учить дальше

Регрессия — одна из первых моделей, с которой знакомятся в анализе данных. На ней держатся прогноз спроса и цен, оценка рисков в скоринге, планирование нагрузки, анализ A/B-тестов и зависимости метрик от факторов. Понимание МНК, метрик качества и регуляризации нужно почти в любой задаче предсказания чисел.

Освойте тему на практике

Если хочется освоить регрессию и другие базовые модели на практике — с подготовкой данных, обучением и оценкой качества, — посмотрите курс Machine Learning. Basic. Понять формат и уровень до старта помогают бесплатные открытые уроки Otus — живые занятия с преподавателями.

FAQ

Чем регрессия отличается от корреляции? Корреляция — это одно число, сила и направление линейной связи двух величин. Регрессия строит саму модель связи и позволяет по x предсказывать конкретное значение y.

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

Обязательно ли масштабировать признаки? Для обычной линейной регрессии — нет, результат не изменится. Но для ridge, lasso и elastic net масштаб важен: штраф зависит от величины коэффициентов, поэтому признаки приводят к сопоставимому масштабу.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)