Course
Когда ваши данные изгибаются, не имеет смысла использовать прямую линию для оценки новых точек. Иначе вы получите модель, которая не улавливает закономерность, даёт большие остатки и плохие прогнозы. Реальные данные редко ведут себя линейно — будь то моделирование влияния дозировки лекарства на отклик, зависимости прочности материала от температуры или изменения цен активов во времени.
Полиномиальная регрессия исправляет это, расширяя линейную регрессию так, чтобы подгонять кривые вместо прямых. Достаточно добавить несколько членов более высоких степеней — x², x³ — и модель сможет отслеживать реальную форму ваших данных.
В этой статье я расскажу, что такое полиномиальная регрессия, какая математика за ней стоит, как реализовать её на Python и как избежать самой распространённой ловушки — переобучения.
Если вы новичок в машинном обучении, сначала прочитайте наш учебник Основы линейной регрессии в Python.
Что такое полиномиальная регрессия?
Полиномиальная регрессия — это алгоритм, к которому вы обращаетесь, когда прямой линией ваши данные не описать.
Линейная регрессия моделирует связь между переменными прямой линией. Это работает, когда связь действительно линейна, — но большинство реальных данных такими не являются. Вспомните, как тормозной путь автомобиля меняется с ростом скорости или как скорость роста растения реагирует на удобрение. Эти зависимости искривляются. Прямая линия их не опишет, что бы вы ни делали.
Полиномиальная регрессия расширяет линейную, добавляя в уравнение члены более высоких степеней. Вместо подгонки y = b0 + b1x вы подгоняете что-то вроде y = b0 + b1x + b2x² + b3x³. Степень полинома — тот самый n в «n-й степени» — определяет, сколько перегибов может иметь кривая.
Коротко и по делу — вот ключевое отличие между ними:
-
Линейная регрессия: Подгоняет прямую линию. По одному коэффициенту на признак, одна степень свободы у кривой.
-
Полиномиальная регрессия: Подгоняет кривую. Каждый дополнительный член (
x²,x³, …) придаёт модели больше гибкости следовать форме данных.

Линейная и полиномиальная регрессия
Под капотом полиномиальная регрессия всё ещё является линейной моделью. «Линейная» здесь относится к тому, как модель обращается со своими коэффициентами, а не к форме получаемой кривой. Вы добавляете новые признаки (x², x³) и подгоняете по ним линейное уравнение.
Итак, когда её действительно стоит применять?
Выбирайте полиномиальную регрессию, когда график остатков линейной модели показывает закономерность — это признак нелинейной связи. Она также хорошо подходит, если предметная область подсказывает кривую зависимость — в физике, биологии или экономике.
Обратная сторона — полиномы высокой степени могут быть нестабильными. Полиномы степени 2 или 3 покрывают большинство реальных кривых, но при более высоких степенях вы, скорее всего, подгоняете шум, а не сигнал.
Зачем использовать полиномиальную регрессию?
Большинство реальных связей между переменными нелинейны.
Прямая линия может оказаться «рядом», но «рядом» недостаточно, когда вы прогнозируете что-то чувствительное. Если в данных есть изгиб, линейная модель будет систематически его пропускать.
Полиномиальная регрессия справляется лучше, позволяя модели изгибаться. Вместо того чтобы проталкивать через данные прямую, вы подгоняете кривую, способную следовать форме зависимости.
Вот области из разных сфер бизнеса, где это действительно важно:
- Биология и медицина: Зависимости «доза — отклик» редко линейны. Низкая доза может почти не влиять, средняя — работать хорошо, а высокая — вызывать побочные эффекты. Эту S-образную кривую нужно моделировать полиномом, чтобы её уловить
- Инженерия: Зависимости напряжения и деформации материалов, аэродинамическое сопротивление и тепловое расширение следуют нелинейным закономерностям, которые хорошо моделируются полиномиальной регрессией
- Финансы: Доходности активов, ценообразование опционов и кривые спроса часто демонстрируют убывающий или ускоряющийся эффект, который прямая линия не передаст
- Конвейеры машинного обучения: Полиномиальные признаки — быстрый способ добавить нелинейность в линейную модель без перехода к более сложному алгоритму
Общая идея во всех случаях одна: связь между входом и выходом меняется при разных значениях x. Линейная регрессия предполагает, что изменение постоянно. Полиномиальная — нет.
При этом полиномиальная регрессия — не панацея.
Лучше всего она работает, когда предметные знания подсказывают кривую зависимость или когда график остатков явно показывает закономерность, которую прямая линия не исправит. Применяйте её под конкретную задачу — а не просто потому, что у линейной модели недостаточно высокое R² .
Понимание математики полиномиальной регрессии
Знание базовой математики полиномиальной регрессии поможет лучше её понять.
Полиномиальные члены
В линейной регрессии ваша модель выглядит так:

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

Формула полиномиальной регрессии
Каждый новый член — x², x³ и так далее — даёт модели ещё один «перегиб». Полином степени 2 может подогнать одну кривизну. Полином степени 3 — кривую, которая один раз меняет направление. Степень n определяет, насколько гибка модель.
При этом сам алгоритм остаётся тем же. Вы лишь добавляете новые признаки. x² рассматривается как отдельная входная переменная, так же как и x. Модель по-прежнему подгоняет линейное уравнение — просто поверх преобразованных признаков.
Оценка методом наименьших квадратов
Подгонка полиномиальной регрессии работает так же, как и линейной — с помощью метода наименьших квадратов.
Идея в том, чтобы найти коэффициенты, минимизирующие сумму квадратов остатков:

Формула SSR
Каждая квадратичная разность — это остаток, то есть разрыв между предсказанным моделью и наблюдаемым. Возведение в квадрат не даёт отрицательным и положительным ошибкам взаимно компенсироваться и сильнее наказывает крупные ошибки по сравнению с мелкими.
На практике за вас всё делает библиотека. Но знание того, что целевая функция — наименьшие квадраты, помогает понять, почему выбросы так вредят полиномиальным моделям: один крупный остаток возводится в квадрат и тянет коэффициенты в свою сторону.
Интерпретация коэффициентов
В линейной регрессии b1 толкуется просто: при увеличении x на единицу y меняется на b1.
В полиномиальной регрессии всё сложнее. Если в модели есть b_1x + b_2x^2, влияние x на y зависит от текущего значения x — нельзя рассматривать b2 изолированно и делать вывод. Наклон кривой постоянно меняется, что видно по производной по x:

Производная по x
Сам наклон — функция от x. Это значит, что влияние изменения x на единицу различается в каждой точке кривой.
Поэтому не стоит пытаться интерпретировать отдельные коэффициенты в полиномиальной модели. Смотрите на кривую целиком. Постройте график предсказаний и данных.
Применение полиномиальной регрессии в Data Science
Полиномиальная регрессия встречается во многих областях, потому что криволинейные зависимости повсюду в реальных данных.
Финансы
Финансовые данные редко движутся по прямым.
Цены активов, рост выручки и кривые спроса склонны ускоряться, замедляться или менять направление в зависимости от рыночных условий. Линейная модель предполагает постоянную скорость изменения, что почти никогда не соответствует действительности. Полиномиальная регрессия позволяет моделировать такие сдвиги — например, как спрос потребителей сначала снижается медленно, а затем резко, когда цена превышает определённый порог.
Она также полезна для анализа трендов во времени. При подгонке кривой к историческим ценам или моделировании роста метрики на разных фазах делового цикла полином степени 2 или 3 часто гораздо лучше оценивает форму, чем прямая.
Инженерия
Физические процессы — одни из лучших примеров нелинейных связей.
Напряжение и деформация материалов, гидродинамика, тепловое расширение и аэродинамическое сопротивление описываются кривыми, а не линиями. Многие управляющие уравнения в физике по своей природе полиномиальны. Полиномиальная регрессия даёт вам основанный на данных способ подгонять эти кривые, когда у вас есть измерения, но нет аккуратного аналитического уравнения.
Хороший пример — сила лобового сопротивления, растущая пропорционально квадрату скорости. Линейная модель недооценит сопротивление на высоких скоростях, а полином второй степени правильно опишет зависимость.
Машинное обучение
В машинном обучении полиномиальная регрессия чаще используется как приём порождения признаков, а не как самостоятельная модель.
Добавляя полиномиальные члены — x², x³, взаимодействия — в набор признаков, вы даёте линейной модели возможность подгонять нелинейные шаблоны без перехода к более сложным алгоритмам. Это типичный первый шаг, когда линейная модель недообучается, и вы хотите добавить гибкости до того, как возьмётесь за дерево решений или нейросеть.
Это также полезная базовая модель.
Прежде чем обучать более сложную модель, подгонка полиномиальной регрессии показывает, какую долю дисперсии может объяснить простая кривая. Если полином третьей степени уже даёт почти всё, что нужно, возможно, ничего сложнее и не требуется.
Как выбрать правильную степень для полиномиальной регрессии
Выбор степени полинома — одно из важнейших решений. Ошибка в любую сторону приведёт к менее точной модели.
К счастью, пары строк кода на Python обычно достаточно, чтобы всё настроить.
Переобучение vs. недообучение
Недообучение происходит, когда степень слишком мала. Полином первой степени на изогнутых данных пропустит закономерность — высокий сдвиг, плохие предсказания и плохая работа как на обучении, так и на новых данных.
Переобучение — противоположная проблема и опаснее, потому что поначалу выглядит хорошо. Полином высокой степени может проходить почти через каждую точку обучения с почти нулевой ошибкой. Но модель просто запоминает шум. На новых данных она развалится.
Это видно, если сравнить ошибку на обучении и тесте для разных степеней:
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
np.random.seed(42)
# Generate sample data
x = np.linspace(-3, 3, 80).reshape(-1, 1)
y = 0.6 * x.ravel()**2 - x.ravel() + np.random.normal(0, 0.6, 80)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
for deg in [1, 2, 12]:
poly = PolynomialFeatures(deg)
model = LinearRegression()
model.fit(poly.fit_transform(x_train), y_train)
train_err = mean_squared_error(y_train, model.predict(poly.transform(x_train)))
test_err = mean_squared_error(y_test, model.predict(poly.transform(x_test)))
print(f"Degree {deg:>2} | Train MSE: {train_err:.4f} | Test MSE: {test_err:.4f}")

MSE при разных степенях
Или визуально:

Подгонка данных полиномами разной степени
Степень 1 показывает высокую ошибку на обоих множествах — это недообучение. Степень 2 — сбалансирована. Степень 12 имеет меньшую ошибку на обучении, но гораздо большую на тесте — это переобучение.
Кросс-валидация
Правильный способ найти лучшую степень — кросс-валидация, в частности k-блочная кросс-валидация.
Идея в том, чтобы разбить данные на k подмножеств, затем обучать на k-1 из них и тестировать на одном отложенном, повторяя так, чтобы каждое подмножество побывало тестовым хотя бы раз. В конце усредните ошибку по всем фолдам, проделайте это для каждой кандидатной степени и выберите ту, у которой средняя тестовая ошибка минимальна.
Реализация проще, чем объяснение:
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import make_pipeline
import matplotlib.pyplot as plt
np.random.seed(42)
# Generate sample data
x = np.linspace(-3, 3, 80).reshape(-1, 1)
y = 0.6 * x.ravel()**2 - x.ravel() + np.random.normal(0, 0.6, 80)
# Test degrees 1 through 10
degrees = range(1, 11)
mean_errors = []
for deg in degrees:
model = make_pipeline(PolynomialFeatures(deg), LinearRegression())
scores = cross_val_score(model, x, y, cv=5, scoring="neg_mean_squared_error")
mean_errors.append(-scores.mean())
print(f"Degree {deg:>2} | Mean error: {-scores.mean():.4f}")
best_degree = np.argmin(mean_errors) + 1

Сравнение ошибок по степеням
Или визуально:

Сравнение ошибок кросс-валидации
Ошибка CV снижается по мере добавления полезных полиномиальных членов, а затем растёт, когда модель начинает переобучаться.
Когда две степени дают схожую ошибку CV, выбирайте меньшую. Более простая модель при той же точности — всегда лучший выбор.
Ключевые соображения и ограничения
Есть несколько способов, как полиномиальная регрессия может привести к неверным выводам. Рассмотрим их.
Чувствительность к выбросам
Выбросы сильнее влияют на полиномиальную регрессию, чем на линейную.
Метод наименьших квадратов возводит в квадрат каждый остаток перед суммированием. Один объект, сильно удалённый от тренда, вносит непропорционально большую ошибку, и модель изогнёт кривую, чтобы уменьшить эту ошибку — даже если это исказит подгонку на остальном диапазоне.
С ростом степени эффект усиливается. Полином высокой степени достаточно гибок, чтобы «погнаться» за выбросом, уводя кривую от основной массы данных ради одной плохой точки.
Обойти это можно, очистив данные перед подгонкой. Постройте график, найдите выбросы и решите, отражают ли они сигнал или шум. Если шум — ошибки измерения, опечатки, повреждённые записи — удалите их. Если реальны — рассмотрите более устойчивые к выбросам методы, такие как RANSAC или регрессия Хьюбера.
Переобучение
Каждый добавленный полиномиальный член повышает гибкость модели. В какой-то момент гибкость перестаёт помогать, и модель начинает подгонять случайный шум обучающих данных вместо реальной закономерности. В итоге кривая хорошо работает на обучении, но разваливается на новых данных.
Сложность в том, что переобучение незаметно, если смотреть только на ошибку обучения. Полином десятой степени почти всегда даст меньшую MSE на обучении, чем полином второй степени. Это не значит, что он лучше.
Вот как стоит действовать:
- Начинайте с малого: попробуйте степень 2 или 3, прежде чем идти выше. Большинству реальных кривых больше не нужно
- Всегда оценивайте на отложенных данных: ошибка обучения ничего не говорит о способности к обобщению.
- Кросс-валидация: используйте её, чтобы найти степень, после которой тестовая ошибка перестаёт улучшаться.
- Смотрите на кривую: если полином «бушует» за пределами диапазона обучающих данных, это признак переобучения.
Полиномиальная регрессия лучше всего работает, когда есть веские причины ожидать кривую зависимость и удаётся держать степень низкой.
Альтернативы полиномиальной регрессии
Полиномиальная регрессия подходит не всегда — некоторые альтернативы могут оказаться для вас лучше, без каламбура.
Сплайны
Сплайны решают проблему глобальной нестабильности.
При подгонке полинома десятой степени на каждый коэффициент влияют все точки. Изменение в одном участке данных сказывается на кривой повсюду. Сплайны избегают этого, деля данные на сегменты и подгоняя к каждому отдельный полином низкой степени. Сегменты соединяются в узлах (knots) с ограничениями, обеспечивающими гладкость на стыках.
Результат — кривая, гибкая там, где нужно, и стабильная в остальных местах.
В Python у scipy и scikit-learn есть надёжные реализации сплайнов:
from scipy.interpolate import UnivariateSpline
spline = UnivariateSpline(x, y, k=3)
y_pred = spline(x_new)

Сплайн против полинома высокой степени
Повторим: выбирайте сплайны, когда данные ведут себя по-разному в разных областях или когда одна полиномиальная кривая не может описать форму без высокой степени.
Support Vector Regression
Support Vector Regression (SVR) использует иной подход.
Он не подгоняет кривую, минимизирующую квадратичную ошибку по всем точкам, а стремится найти функцию, которая остаётся в пределах заданной погрешности для как можно большего числа точек, игнорируя те, что попадают внутрь этого коридора. Это делает его менее чувствительным к выбросам, чем полиномиальная регрессия.
Связь с полиномиальной регрессией проявляется через трюк с ядрами. SVR с полиномиальным ядром может подгонять нелинейные зависимости, схожие с полиномиальной регрессией, — но с лучшей обобщающей способностью и большим контролем подгонки за счёт параметров регуляризации.
from sklearn.svm import SVR
model = SVR(kernel="poly", degree=3, C=1.0, epsilon=0.1)
model.fit(x_train, y_train)

SVR против полинома высокой степени
SVR — хороший выбор, когда в данных есть неизбежные выбросы, когда вам нужен больший контроль над балансом смещения и дисперсии или когда полиномиальная регрессия продолжает переобучаться, несмотря на кросс-валидацию.
Заключение
В этой статье я показал, как она расширяет линейную регрессию для подгонки кривых, как метод наименьших квадратов находит лучшие коэффициенты и почему интерпретация отдельных коэффициентов мало что даёт.
Выбранная степень важнее всего. Слишком низкая ведёт к недообучению, слишком высокая — к переобучению. Кросс-валидация даёт объективный способ найти «золотую середину». А если полиномиальная регрессия не подходит, сплайны и SVR — достойные альтернативы, о которых стоит знать.
Лучший способ наработать интуицию — применить всё это к собственным данным. Выберите набор, где вы подозреваете нелинейную связь, сначала подгоните линейную модель, постройте остатки и посмотрите, что полиномиальная регрессия делает иначе. Прочитайте наше руководство Нелинейные модели и инсайты на R, чтобы увидеть этот процесс в действии.
Частые вопросы о полиномиальной регрессии
Что такое полиномиальная регрессия и когда её использовать?
Полиномиальная регрессия — это расширение линейной регрессии, которое подгоняет к вашим данным изогнутую линию вместо прямой. Её применяют, когда связь между входными и выходными переменными нелинейна — например, когда график остатков линейной модели показывает закономерность. Это хороший первый шаг перед тем, как переходить к более сложным моделям, таким как деревья решений или нейросети.
Чем полиномиальная регрессия отличается от линейной?
Линейная регрессия подгоняет прямую, моделируя связь как y = b0 + b1x. Полиномиальная регрессия добавляет члены более высоких степеней, такие как x² и x³, давая модели достаточную гибкость, чтобы следовать за кривыми в данных. Обе используют один и тот же метод наименьших квадратов — полиномиальная регрессия просто рассматривает дополнительные члены как новые входные признаки.
Каковы основные риски использования полиномиальной регрессии?
Две главные угрозы — переобучение и чувствительность к выбросам. Полином высокой степени может «зазубрить» шум в обучающих данных и плохо работать на новых. Выбросы опасны, потому что метод наименьших квадратов возводит каждый остаток в квадрат — одна плохая точка может увести кривую от остальной массы данных.
Как выбрать правильную степень для модели полиномиальной регрессии?
Начните со степени 2 или 3 — большинству реальных кривых связей этого достаточно. Далее используйте k-блочную кросс-валидацию, чтобы сравнить среднюю тестовую ошибку для кандидатных степеней, и выберите ту, при которой ошибка перестаёт снижаться. Если две степени дают схожие результаты, всегда выбирайте меньшую.
Когда использовать сплайны или SVR вместо полиномиальной регрессии?
Выбирайте сплайны, когда данные ведут себя по-разному в разных областях или когда один полином постоянно даёт нестабильные кривые на краях диапазона. А SVR с полиномиальным ядром лучше подойдёт, когда выбросы неизбежны и вам нужна модель, которая не будет «гнуться» под них. Обе альтернативы дают больше контроля над подгонкой ценой некоторого снижения интерпретируемости.