🔴 Сложный ⏱️ 50 минут

Полиномиальная регрессия

📋 Содержание урока

Полиномиальная регрессия

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

Возникает соблазнительная идея: что, если не менять саму механику линейной регрессии — метод наименьших квадратов, формулы для весов, градиентный спуск, — а просто дать ей больше материала для работы? Что, если, помимо исходного признака $x$, подсунуть модели ещё и $x^2$, и $x^3$, и так далее, как будто это независимые новые столбцы данных? Тогда модель по-прежнему будет искать веса $w_0, w_1, w_2, \dots$ линейным способом — минимизируя сумму квадратов ошибок точно так же, как в уроке 310, — но предсказание $\hat y = w_0 + w_1 x + w_2 x^2 + w_3 x^3 + \dots$ перестанет быть прямой линией на графике зависимости $y$ от $x$. Это и есть ключевой фокус полиномиальной регрессии: модель остаётся линейной по параметрам $w$ (поэтому решается той же самой математикой МНК), но становится нелинейной по исходному признаку $x$ — и именно эта нелинейность позволяет ей изгибаться, повторяя параболы, кубические кривые и более сложные формы.

У этой идеи сразу же обнаруживается обратная сторона, и обнаруживается она ровно там, где ты уже ждёшь подвоха после урока 304. Если добавление $x^2$ помогает модели поймать параболу, что мешает добавить $x^{10}$, $x^{15}$, $x^{20}$ — и получить модель, которая пройдёт вообще через каждую обучающую точку без единой ошибки? Ничего не мешает, и в этом уроке ты увидишь на конкретных числах, как именно это происходит: чем выше степень полинома, тем ниже ошибка на обучающей выборке — вплоть до идеального нуля, — но при этом кривая между точками и особенно за пределами обучающего диапазона начинает вести себя абсолютно неадекватно, взлетая и падая на огромные величины. Степень полинома — это буквально числовой рычаг сложности модели, тот самый параметр, который двигает модель между недообучением и переобучением, которые ты уже умеешь распознавать по определению из урока 304, только теперь ты увидишь механику этого сдвига в чистом, предельно наглядном виде на одном и том же наборе точек.

В этом уроке ты разберёшь, как именно строятся полиномиальные признаки для одной переменной и для нескольких переменных сразу (включая признаки взаимодействия вроде $x_1 \cdot x_2$), проведёшь сквозной численный эксперимент, который покажет степень 1 в явном недообучении, степень 3-4 в разумном балансе и степень под два десятка в катастрофическом переобучении на одних и тех же точках, познакомишься с sklearn.preprocessing.PolynomialFeatures как со стандартным практическим инструментом и поймёшь, почему при высоких степенях полинома регуляризация — тема следующего урока — становится не факультативным улучшением, а практически обязательным условием работоспособности модели.

История

Идея приближать сложную зависимость полиномом гораздо старше самого термина «машинное обучение» и даже старше статистики в её современном виде. Ещё в XVIII веке математики вроде Жозефа Луи Лагранжа занимались задачей интерполяции — построения полинома, который проходит точно через заданный набор точек. Формула Лагранжа, носящая его имя, даёт явный способ построить такой полином для любого конечного набора точек с попарно различными значениями $x$: интерполяционный полином степени $n-1$ проходит точно через любые $n$ точек. Этот математический факт, абсолютно нейтральный сам по себе, окажется впоследствии ключом к пониманию переобучения — если полином можно заставить пройти точно через любые точки, ничего не мешает ему пройти и через точки, искажённые случайным измерительным шумом, что не имеет отношения к реальной закономерности.

Практическая подгонка полиномов к зашумлённым астрономическим наблюдениям расцвела в начале XIX века вместе с методом наименьших квадратов — тем же самым методом, чьё появление в контексте линейной регрессии подробно разбиралось в уроке 310 на примере предсказания орбиты астероида Цереры Карлом Гауссом. Метод МНК, опубликованный Адриеном Мари Лежандром в 1805 году и обоснованный Гауссом чуть позже, с самого начала применялся не только к прямым линиям, но и к полиномам более высоких степеней — астрономам нужно было описывать траектории небесных тел, которые редко бывают строго линейными функциями времени, и полиномиальная аппроксимация естественно расширяла тот же самый вычислительный аппарат на кривые линии.

Ключевое предупреждение о том, что «больше степеней не значит лучше», пришло чуть позже и с неожиданной стороны — из чистой численной математики, а не из статистики. В 1901 году немецкий математик Карл Рунге (Carl Runge) описал явление, которое сегодня называют феноменом Рунге: если интерполировать некоторые вполне гладкие функции полиномом высокой степени по равномерно расположенным узлам, интерполяционный полином начинает демонстрировать дикие, нарастающие с ростом степени колебания вблизи краёв интервала — притом что в самих узлах полином, разумеется, проходит точно через заданные значения. Это был чисто математический результат безо всякого отношения к статистике и переобучению в современном смысле, но по сути он описал ровно тот же самый эффект, который ты увидишь дальше в этом уроке: идеальная подгонка в заданных точках не гарантирует разумного поведения между ними и уж тем более за их пределами. Спустя почти столетие статистическая теория обучения — работы Вапника и Червоненкиса, разложение ошибки на bias и variance, разобранное в уроке 304, — дала строгий язык для того же самого наблюдения, но уже применительно к обучению моделей на данных, а не к чистой интерполяции: полиномиальная регрессия с тех пор остаётся одним из самых наглядных учебных примеров именно потому, что переобучение здесь можно в буквальном смысле увидеть глазами на одном простом графике.

Идея добавления полиномиальных признаков

Интуиция

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

Отсюда рождается простой, но мощный трюк. Если истинная зависимость между $x$ и $y$ похожа на параболу, а не на прямую, ничто не мешает буквально вычислить новый столбец данных — значение $x^2$ для каждого наблюдения — и подать линейной регрессии на вход не один признак $x$, а два: $x$ и $x^2$. Модель, ничего не зная о том, что второй признак вычислен из первого, найдёт для них свои собственные веса $w_1$ и $w_2$ точно так же, как находила бы веса для двух совершенно независимых измерений. А поскольку итоговое предсказание $\hat y = w_0 + w_1 x + w_2 x^2$ теперь содержит квадратичный член, график этой функции от $x$ — уже не прямая, а парабола, изгибающаяся ровно так, как позволяют найденные веса.

Определение

Полиномиальная регрессия степени $d$ от одной переменной — это линейная регрессия, применённая не к исходному признаку $x$, а к расширенному набору признаков $\phi(x) = (x, x^2, x^3, \dots, x^d)$, полученному возведением $x$ в степени от 1 до $d$. Модель имеет вид

$$\hat y = w_0 + w_1 x + w_2 x^2 + w_3 x^3 + \dots + w_d x^d$$

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

$$L(w_0, \dots, w_d) = \sum_i \bigl(y_i - \hat y_i\bigr)^2$$

Ключевое свойство: $\hat y$ линейна по вектору параметров $w = (w_0, \dots, w_d)$ — она получается как скалярное произведение $w$ на вектор признаков $(1, x, x^2, \dots, x^d)$ — и поэтому решается той же математикой МНК (нормальные уравнения, градиентный спуск), что и обычная линейная регрессия. При этом $\hat y$ нелинейна по исходной переменной $x$: график $\hat y(x)$ — это кривая степени $d$, а не прямая.

Обрати внимание на формулировку «линейна по параметрам, нелинейна по $x$» — это не игра слов, а суть всего приёма. Полиномиальная регрессия не изобретает новый алгоритм оптимизации для нелинейных моделей; она превращает задачу нелинейной аппроксимации в задачу линейной регрессии над расширенным признаковым пространством, полностью переиспользуя всё, что ты уже знаешь про МНК из урока 310.

Пример 1: от прямой к параболе на трёх точках вручную

Возьми три точки: $(x,y) = (-1, 4), (0, 1), (1, 2)$. Прямая линия $\hat y = w_0 + w_1 x$, минимизирующая МНК по этим трём точкам, при всём старании не сможет пройти через все три сразу — они явно не лежат на одной прямой (первая точка выше второй, третья снова выше второй — характерный «провал» посередине, типичный признак параболы, а не прямой). А вот парабола $\hat y = w_0 + w_1 x + w_2 x^2$ с тремя свободными параметрами и тремя точками имеет ровно достаточно степеней свободы, чтобы пройти через каждую точку точно — это система из трёх линейных уравнений с тремя неизвестными:

$$w_0 - w_1 + w_2 = 4, \qquad w_0 = 1, \qquad w_0 + w_1 + w_2 = 2$$

Из второго уравнения сразу $w_0 = 1$. Складывая первое и третье: $2w_0 + 2w_2 = 6 \Rightarrow w_2 = 2$. Вычитая первое из третьего: $2w_1 = -2 \Rightarrow w_1 = -1$. Итоговая модель: $\hat y = 1 - x + 2x^2$. Проверка: при $x=-1$: $1+1+2=4$ ✓; при $x=0$: $1$ ✓; при $x=1$: $1-1+2=2$ ✓. Три точки — три параметра — точное совпадение, без единой ошибки, просто в силу алгебры, а не потому что модель «поняла» какую-то глубокую закономерность.

Пример 2: полиномиальные признаки на практике через PolynomialFeatures

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
import numpy as np

x = np.array([-1, 0, 1]).reshape(-1, 1)  # sklearn ждёт 2D-массив признаков
y = np.array([4, 1, 2])

poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(x)
print(X_poly)
# [[-1.  1.]
#  [ 0.  0.]
#  [ 1.  1.]]
# столбцы: x, x^2 — ровно те два новых признака, что были в примере 1

model = LinearRegression()
model.fit(X_poly, y)
print(model.intercept_, model.coef_)  # 1.0 [-1.  2.]  — совпадает с ручным расчётом

PolynomialFeatures(degree=2) берёт исходный столбец $x$ и достраивает рядом с ним столбец $x^2$ (параметр include_bias=False убирает лишний столбец из единиц — свободный член $w_0$ и так добавляется отдельно внутри LinearRegression). Дальше LinearRegression, ничего не зная о происхождении второго столбца, находит для него вес точно так же, как для любого другого признака. На практике эти два шага почти всегда объединяют в единый pipelinemake_pipeline(PolynomialFeatures(degree=d), LinearRegression()) — чтобы преобразование признаков и обучение модели выполнялись одной командой и не забывались по отдельности при предсказании на новых данных.

Пример 3: полином третьей степени восстанавливает кубическую зависимость

Пусть истинная зависимость кубическая: $y = 1 + 2x - 0{,}3x^2 + 0{,}05x^3 + \varepsilon$, где $\varepsilon$ — небольшой случайный шум. Обучи на таких данных линейную регрессию (degree=1) и полиномиальную регрессию третьей степени (degree=3):

import numpy as np

def f(x):
    return 1 + 2*x - 0.3*x**2 + 0.05*x**3

np.random.seed(11)
x_train = np.linspace(-4, 6, 22)
y_train = f(x_train) + np.random.normal(0, 1.5, size=22)

coeffs_deg1 = np.polyfit(x_train, y_train, 1)
coeffs_deg3 = np.polyfit(x_train, y_train, 3)
print("степень 1:", np.round(coeffs_deg1, 3))
print("степень 3:", np.round(coeffs_deg3, 3))
# степень 1: [ 2.351 -1.319]                         — только наклон и сдвиг
# степень 3: [ 0.037 -0.243  1.995  0.532]            — близко к истинным 0.05, -0.3, 2, 1

Коэффициенты полинома третьей степени — $\hat y \approx 0{,}037x^3 - 0{,}243x^2 + 1{,}995x + 0{,}532$ — оказываются близки к истинным коэффициентам, которые были заложены в функцию f(x) при генерации данных ($0{,}05$, $-0{,}3$, $2$, $1$). Модель третьей степени не просто снизила ошибку — она восстановила саму форму зависимости, которую линейная модель первой степени в принципе не могла уловить, потому что у неё нет квадратичного и кубического членов, за которые можно было бы «зацепиться».

Почему это важно

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

Полиномиальные признаки для нескольких переменных: взаимодействия

Интуиция

Реальные задачи почти никогда не сводятся к одному признаку. Представь, что ты предсказываешь продажи по бюджетам на телевизионную рекламу ($x_1$) и на рекламу в интернете ($x_2$). Можно, как и раньше, добавить $x_1^2$ и $x_2^2$, чтобы уловить нелинейный эффект насыщения каждого канала по отдельности — скажем, отдачу от рекламы на ТВ, которая растёт быстро сначала и выходит на плато при больших бюджетах. Но у двух признаков появляется и принципиально новая возможность, которой не было у одной переменной: они могут взаимодействовать друг с другом. Возможно, реклама на ТВ и в интернете работают не по отдельности, а усиливают друг друга — зритель видит ролик по телевизору, а затем встречает тот же бренд в ленте соцсетей, и совместный эффект оказывается больше простой суммы двух отдельных эффектов. Ни $x_1$, ни $x_2$, ни $x_1^2$, ни $x_2^2$ сами по себе не могут выразить такую синергию — для этого нужен отдельный признак, перемножающий оба бюджета: $x_1 \cdot x_2$.

Определение

Полиномиальные признаки степени $d$ для нескольких переменных $x_1, \dots, x_n$ — это все мономы от $x_1, \dots, x_n$ суммарной степени от 1 до $d$, включая как чистые степени отдельных переменных ($x_1^2, x_2^3, \dots$), так и признаки взаимодействия (interaction terms) — произведения разных переменных в степенях, суммарно не превышающих $d$ (например, $x_1 x_2$, $x_1^2 x_2$ при $d=3$).

Для двух переменных при $d=2$ полный набор новых признаков (без свободного члена) выглядит так:

$$\hat y = w_0 + w_1 x_1 + w_2 x_2 + w_3 x_1^2 + w_4 x_1 x_2 + w_5 x_2^2$$

Здесь $w_4 x_1 x_2$ — это и есть признак взаимодействия: его вес $w_4$ отражает, насколько эффект одной переменной зависит от значения другой, сверх того, что уже объясняется отдельными линейными и квадратичными членами каждой переменной.

Число всех таких признаков при $n$ исходных переменных и степени $d$ растёт комбинаторно и равно $\binom{n+d}{d} - 1$ (биномиальный коэффициент минус единица за вычетом свободного члена) — при росте $n$ и $d$ это число может стать очень большим очень быстро.

Пример 1: синергия рекламных каналов на конкретных числах

Возьми условный пример с четырьмя наблюдениями: бюджет на ТВ $x_1$ (тыс. руб.), бюджет на интернет-рекламу $x_2$ (тыс. руб.), продажи $y$ (тыс. руб.), сгенерированные по истинной модели с взаимодействием $y = 5 + 0{,}3x_1 + 0{,}4x_2 + 0{,}02\,x_1 x_2$:

$x_1$ (ТВ) $x_2$ (интернет) $y$ (продажи)
10 5 11
20 5 15
10 15 17
30 15 29

Обрати внимание на последнюю строку: при одновременном увеличении и ТВ-бюджета (до 30), и интернет-бюджета (до 15) продажи подскакивают до 29 — заметно сильнее, чем можно было бы объяснить простым сложением отдельных эффектов каждого канала. Если попытаться описать эти данные моделью без взаимодействия, $\hat y = w_0 + w_1 x_1 + w_2 x_2$, МНК найдёт какие-то усреднённые веса $w_1$ и $w_2$, но не сможет одновременно точно описать все четыре точки — модель без члена $x_1 x_2$ структурно не способна выразить тот факт, что отдача от ТВ-бюджета сама зависит от того, сколько потрачено на интернет-рекламу. Добавление признака $x_1 \cdot x_2$ (третьего столбца со значениями $50, 100, 150, 450$) даёт модели ровно ту степень свободы, которая нужна, чтобы восстановить исходную формулу.

Пример 2: PolynomialFeatures для двух переменных

from sklearn.preprocessing import PolynomialFeatures
import numpy as np

X = np.array([[10, 5], [20, 5], [10, 15], [30, 15]])

poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X)
print(poly.get_feature_names_out(['x1', 'x2']))
# ['x1' 'x2' 'x1^2' 'x1 x2' 'x2^2']
print(X_poly[0])  # для строки [10, 5]
# [10.  5. 100.  50.  25.]

Пять новых столбцов для двух исходных признаков при степени 2 — это в точности совпадает с формулой из определения: $x_1, x_2, x_1^2, x_1 x_2, x_2^2$. Метод get_feature_names_out — не просто удобство для отладки: он явно показывает, что признак взаимодействия $x_1 \cdot x_2$ создаётся автоматически, без необходимости вручную писать код для его вычисления, — именно поэтому PolynomialFeatures экономит массу рутинной работы по ручному feature engineering, особенно когда исходных признаков больше двух.

Пример 3: рост числа признаков с числом переменных и степенью

Посчитай, сколько новых признаков породит PolynomialFeatures(degree=3) для 5 исходных переменных: по формуле $\binom{n+d}{d} - 1$ при $n=5$, $d=3$ получаем $\binom{8}{3} - 1 = 56 - 1 = 55$ признаков — из пяти исходных столбцов получается пятьдесят пять. Если исходных признаков было, скажем, 20 (вполне типичная табличная задача), а степень взята равной 3, число новых признаков перевалит за полторы тысячи. Это не абстрактная неприятность: обучающая выборка с несколькими сотнями строк и полутора тысячами признаков — это ровно та ситуация «параметров больше, чем наблюдений», которая в уроке 304 была явно названа рецептом гарантированного переобучения.

Почему это важно

Признаки взаимодействия открывают перед моделью класс зависимостей, принципиально недоступных даже полиномиальной регрессии, применённой к каждому признаку по отдельности: эффекты, где влияние одной переменной меняется в зависимости от значения другой. Такие эффекты повсеместны в реальных задачах — совместное действие лекарств в медицине, взаимное усиление разных маркетинговых каналов, зависимость эффекта скидки от сезона года. Но комбинаторный рост числа признаков с ростом числа исходных переменных и степени полинома — это прямое предупреждение: щедро добавляя degree=3 или degree=4 на богатом наборе исходных признаков, легко незаметно для себя перейти от разумной модели к модели с тысячами параметров на выборке из сотен строк, то есть прямиком к переобучению, которое подробно разбирается в следующем разделе.

Выбор степени полинома как выбор сложности модели

Интуиция

Вернись к главному вопросу урока 304: у модели есть некоторая «выразительная способность» относительно сложности реальных данных, и она может быть либо недостаточной (недообучение), либо избыточной (переобучение), а где-то между этими крайностями лежит оптимум. В полиномиальной регрессии эта абстрактная «сложность модели» превращается в одно конкретное, легко крутящееся число — степень полинома $d$. Чем выше $d$, тем больше у модели свободных параметров и тем причудливее кривая, которую она способна нарисовать. Ключевая особенность именно этого урока в том, что связь между $d$ и сложностью модели можно не просто объяснить словами, а буквально увидеть на одном и том же наборе точек, меняя только одно число.

Определение

Степень полинома $d$ как гиперпараметр сложности модели. Полиномиальная регрессия степени $d$ имеет $d+1$ свободных параметров (включая свободный член) для одной переменной. При $d=1$ модель совпадает с обычной линейной регрессией. При росте $d$ модель может описывать всё более изогнутые кривые, и при $d = n-1$ для $n$ обучающих точек с попарно различными значениями $x$ полином может пройти через каждую точку точно (интерполяция, обучающая ошибка равна нулю). Выбор $d$ — это прямой аналог выбора глубины дерева, числа слоёв сети или коэффициента регуляризации из урока 304: слишком малое $d$ даёт высокий bias (недообучение), слишком большое $d$ даёт высокую variance (переобучение), и задача практика — найти степень, минимизирующую ошибку не на обучающей, а на новой, тестовой выборке.

Пример 1: сквозной численный эксперимент — три степени на одних и тех же точках

Сгенерируем 22 обучающие точки по истинной кубической зависимости с умеренным шумом и 6 тестовых точек, часть из которых выходит за пределы обучающего диапазона $[-4, 6]$:

import numpy as np

def f(x):
    return 1 + 2*x - 0.3*x**2 + 0.05*x**3

np.random.seed(11)
x_train = np.linspace(-4, 6, 22)
y_train = f(x_train) + np.random.normal(0, 1.5, size=22)

x_test = np.array([-4.5, -1.5, 2.5, 4.5, 6.5, 7.0])
y_test = f(x_test) + np.random.normal(0, 1.5, size=6)

for deg in [1, 3, 4, 19]:
    coeffs = np.polyfit(x_train, y_train, deg)
    train_mse = np.mean((np.polyval(coeffs, x_train) - y_train) ** 2)
    test_mse = np.mean((np.polyval(coeffs, x_test) - y_test) ** 2)
    print(f"степень {deg}: train MSE = {train_mse:.2f}, test MSE = {test_mse:.2f}")

Результат этого эксперимента — предельно показательная таблица:

Степень Train MSE Test MSE Train $R^2$ Test $R^2$
1 3.17 8.76 0.945 0.935
3 1.88 2.45 0.967 0.982
4 1.79 4.01 0.969 0.970
19 0.02 ≈23 600 000 000 0.9996 −174 965 535

Читай эту таблицу слева направо как последовательность трёх режимов. Степень 1 — недообучение: обе ошибки заметно выше, чем у более гибких моделей, потому что прямая линия структурно не способна повторить изгиб кубической зависимости ни на обучающих, ни на новых точках — ошибка высока сама по себе, а не потому что модель «не увидела» какие-то конкретные точки. Степень 3 — золотая середина: она совпадает со степенью истинной зависимости, train MSE и test MSE низкие и близкие друг к другу (test даже чуть ниже train — обычное дело при небольшой тестовой выборке и случайном шуме). Степень 19 — катастрофическое переобучение: train MSE падает почти до нуля (модель на 22 точках при 20 параметрах подгоняется почти идеально), но test MSE взрывается до астрономических 23,6 миллиарда, а test $R^2$ уходит в глубокий минус — модель хуже, чем если бы она просто предсказывала среднее значение $y$ для любого входа.

Пример 2: что происходит с конкретными предсказаниями при переобучении

Посмотрим не только на агрегированную ошибку, а на конкретные числа предсказаний для одних и тех же шести тестовых точек $x = -4{,}5,\ -1{,}5,\ 2{,}5,\ 4{,}5,\ 6{,}5,\ 7{,}0$, где истинные значения (с шумом) равны $-17{,}54,\ -0{,}52,\ 5{,}85,\ 8{,}59,\ 16{,}15,\ 16{,}49$:

$x$ Истина Степень 1 Степень 3 Степень 19
−4.5 −17.54 −12.26 −17.00 −21 688.82
−1.5 −0.52 −4.93 −3.82 −3.74
2.5 5.85 4.84 4.97 3.94
4.5 8.59 9.72 8.92 9.11
6.5 16.15 14.61 14.55 19 309.20
7.0 16.49 15.83 16.40 374 998.29

Внутри обучающего диапазона (точки при $x=-1{,}5$, $2{,}5$, $4{,}5$) все три модели дают в целом разумные предсказания — даже полином 19-й степени там ещё не успевает окончательно «взбеситься», хотя уже заметно менее устойчив, чем степени 1 и 3. Но стоит выйти за границу обучающего диапазона (обучение шло на $x$ от $-4$ до $6$, а тестовые точки $-4{,}5$, $6{,}5$ и $7{,}0$ лежат чуть за этими границами) — и полином 19-й степени взрывается до значений в тысячи и десятки тысяч, притом что истинные значения там находятся в разумных пределах от $-18$ до $17$. Это прямая практическая иллюстрация того самого феномена Рунге из раздела «История»: полином высокой степени, идеально подогнанный под узлы внутри интервала, ведёт себя абсолютно непредсказуемо сразу за его пределами — и чем выше степень, тем резче этот эффект.

Пример 3: как выглядела бы сама кривая — качественное описание

Если построить графики предсказаний трёх моделей поверх облака обучающих точек, картина выглядит так. Кривая степени 1 — прямая линия, которая проходит рядом с общим трендом точек, но заметно промахивается мимо изгиба в начале и в конце диапазона, где данные явно отклоняются от прямой вверх или вниз. Кривая степени 3 — плавная, слегка изогнутая линия, которая проходит близко к большинству точек, не пытаясь зацепить каждую из них в отдельности, и за счёт этого выглядит «разумно» продолженной и за пределами обучающего диапазона. Кривая степени 19 — это самая наглядная часть картинки: между соседними обучающими точками она делает резкие, дикие скачки вверх-вниз, будто исполняя серию волн со всё большей амплитудой, а сразу за левым и особенно за правым краем обучающего диапазона взмывает или обрушивается на величины, в тысячи раз превышающие масштаб самих данных. При этом в 22 обучающих точках, через которые кривая обязана пройти точно (или почти точно), она формально не ошибается вовсе — вся эта дикость аккуратно спрятана между узлами и за пределами диапазона, там, где обучающая ошибка её не видит.

Почему это важно

Этот эксперимент — не абстрактная иллюстрация, а прямое переиздание bias-variance разложения из урока 304 на языке одного управляемого числа. Низкая степень означает высокий bias: класс прямых линий или пологих кривых просто не содержит истинную кубическую зависимость, сколько бы обучающих точек ни было. Высокая степень означает взрывной рост variance: небольшое изменение шума в конкретных 22 точках (другой seed, другая случайная выборка того же распределения) даст совершенно другой набор из 20 коэффициентов и, соответственно, совершенно другую дикую кривую между узлами — предсказания полинома 19-й степени крайне нестабильны относительно конкретной случайной выборки, тогда как предсказания полинома 3-й степени от выборки к выборке меняются гораздо меньше. Выбор степени — это ровно тот компромисс, для которого в уроке 306 разбирается кросс-валидация: перебираются несколько степеней (например, от 1 до 10), для каждой честно измеряется ошибка на отложенных данных, и выбирается та степень, при которой эта ошибка минимальна — не train MSE, который у высоких степеней обманчиво стремится к нулю, а именно ошибка на данных, которые модель не видела при обучении.

Зачем нужна регуляризация при высоких степенях полинома

Интуиция

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

Определение

Регуляризация при полиномиальной регрессии добавляет к обычной функции потерь МНК штрафное слагаемое, зависящее от величины весов $w_1, \dots, w_d$ (свободный член $w_0$ обычно не штрафуется):

$$L_{\text{ridge}}(w) = \sum_i (y_i - \hat y_i)^2 + \lambda \sum_{j=1}^{d} w_j^2$$

Коэффициент $\lambda \geq 0$ управляет силой штрафа: при $\lambda = 0$ задача совпадает с обычным МНК из этого урока и допускает сколь угодно большие коэффициенты (что и приводит к дикому поведению кривой при высокой степени); при растущем $\lambda$ оптимальные веса вынужденно сжимаются к нулю, и кривая становится более гладкой ценой небольшого роста ошибки на обучающих данных. Подбор $\lambda$ — отдельная задача, которой посвящён следующий урок; полиномиальная регрессия — один из самых наглядных примеров того, зачем этот инструмент вообще нужен.

Пример 1: коэффициенты полинома 19-й степени без регуляризации — насколько они велики

Посмотри на масштаб коэффициентов полинома 19-й степени из численного эксперимента этого урока: старшие коэффициенты по модулю достигают значений порядка $10^{-6}$–$10^{-3}$ при младших степенях и одновременно скачут по знаку от члена к члену — соседние коэффициенты то положительны, то резко отрицательны, компенсируя друг друга в узлах интерполяции почти до сокращения, но не между ними. Именно эта чувствительная, «на грани взаимного уничтожения» конфигурация коэффициентов и порождает дикие колебания кривой между точками: небольшая ошибка округления или крошечное изменение одного обучающего значения способны кардинально сдвинуть результат этой хрупкой балансировки. Регуляризация напрямую атакует эту проблему, ограничивая суммарную величину коэффициентов и не позволяя им вырастать до таких экстремальных, взаимно компенсирующихся значений.

Пример 2: как Ridge изменил бы поведение полинома высокой степени — качественно

Возьми ту же самую задачу — полином 19-й степени на 22 точках, — но вместо обычного МНК используй Ridge-регрессию с умеренным $\lambda$. Штраф $\lambda \sum w_j^2$ сделает для оптимизатора невыгодным решение с огромными по модулю компенсирующими друг друга коэффициентами: цена в виде штрафа за такие коэффициенты перевесит выигрыш от чуть более точного прохождения через каждую обучающую точку. В результате оптимальное решение сдвинется в сторону меньших по модулю весов, кривая станет заметно более гладкой, обучающая ошибка перестанет быть нулевой (пройти через каждую точку идеально уже невыгодно), зато поведение кривой между точками и за пределами обучающего диапазона перестанет быть катастрофическим — то самое улучшение test MSE ценой небольшого ухудшения train MSE, о котором подробно шла речь в разделе «Способы борьбы с переобучением» урока 304.

Пример 3: регуляризация как практический стандарт при degree > 2-3

На практике, когда специалист по data science решает использовать PolynomialFeatures со степенью выше двух-трёх — особенно если признаков несколько и учитываются взаимодействия, — регуляризованная линейная модель (Ridge или Lasso) становится не опциональным улучшением, а практически обязательным элементом пайплайна:

from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.linear_model import Ridge
from sklearn.pipeline import make_pipeline

model = make_pipeline(
    PolynomialFeatures(degree=4, include_bias=False),
    StandardScaler(),   # масштабирование важно: x^4 может быть в тысячи раз больше x
    Ridge(alpha=1.0)    # alpha в sklearn — это и есть лямбда штрафа
)
model.fit(X_train, y_train)

Обрати внимание на порядок шагов: масштабирование (StandardScaler) ставится после генерации полиномиальных признаков и до регуляризованной модели — это не случайность. Штраф $\lambda \sum w_j^2$ одинаково штрафует все веса вне зависимости от масштаба соответствующего признака, а признаки вроде $x^4$ по абсолютной величине могут отличаться от признака $x$ на много порядков; без масштабирования регуляризация начнёт несправедливо сильнее «давить» на признаки с изначально малыми значениями просто из-за их масштаба, а не из-за их реальной значимости для предсказания.

Почему это важно

Связь между степенью полинома и необходимостью регуляризации — это не отдельный факт, который нужно запомнить изолированно, а прямое следствие всего, что было показано в этом уроке: чем больше параметров у модели относительно объёма данных, тем сильнее она рискует объяснять шум вместо закономерности, и тем важнее иметь механизм, ограничивающий её свободу подгонки. Полиномиальные признаки — идеальная лаборатория для понимания регуляризации именно потому, что здесь «сложность модели» — это одно явное число (степень $d$), а «размер коэффициентов» — это буквально видимые, легко печатаемые числа, в отличие от абстрактных весов нейросети с миллионами параметров. В следующем уроке 312 ты разберёшь Ridge- и Lasso-регуляризацию формально, с выводом формул и разбором, чем L1-штраф принципиально отличается от L2 — а этот раздел дал тебе конкретную, осязаемую причину, зачем это всё вообще понадобится на практике.

Практика: 30 заданий

Базовые задания (1–10)

Задание 1: Сколько свободных параметров (включая свободный член $w_0$) у полиномиальной регрессии одной переменной степени $d=5$?


Задание 2: Дан признак $x=3$. Выпиши вектор полиномиальных признаков, которые создаст PolynomialFeatures(degree=3, include_bias=False).


Задание 3: Модель $\hat y = 2 + 1{,}5x - 0{,}4x^2$ обучена методом полиномиальной регрессии. Вычисли предсказание при $x=2$.


Задание 4: Является ли полиномиальная регрессия линейной моделью? Обоснуй ответ в терминах параметров и в терминах исходного признака.


Задание 5: Для двух исходных признаков $x_1, x_2$ при степени degree=2 сколько новых столбцов (без свободного члена) создаст PolynomialFeatures? Перечисли их.


Задание 6: Модель А (степень 1) показывает train MSE = 9.5, test MSE = 10.1. Модель Б (степень 15) показывает train MSE = 0.01, test MSE = 850. Какая из моделей недообучена, а какая переобучена?


Задание 7: Напиши минимальный код на sklearn, который строит pipeline из PolynomialFeatures(degree=2) и LinearRegression, обучает его на X_train, y_train и предсказывает на X_test.


Задание 8: Данные явно имеют изогнутую, параболическую форму, но обучена только линейная регрессия (степень 1), и train MSE, и test MSE остаются высокими и близкими друг к другу. Какой самый прямой следующий шаг стоит попробовать?


Задание 9: Через сколько заданных точек общего положения (с попарно различными значениями $x$) может пройти точно полином степени $d$?


Задание 10: Дано 10 обучающих точек с попарно различными значениями $x$. При какой минимальной степени полином гарантированно сможет пройти через все точки точно (обучающая ошибка станет равна нулю)?


Продвинутые задания (11–20)

Задание 11: Дан набор из 5 точек: $(1,2), (2,5), (3,10), (4,17), (5,26)$. Похоже ли это на линейную или на квадратичную зависимость? Обоснуй, глядя на разности между соседними значениями $y$.


Задание 12: Используя данные и коэффициенты сквозного примера этого урока (степень 1: коэффициенты примерно $w_1=2{,}35$, $w_0=-1{,}32$), вычисли предсказание модели при $x=10$, далеко за пределами обучающего диапазона $[-4,6]$, и обсуди, насколько такому предсказанию можно доверять.


Задание 13: Даны данные о синергии рекламных каналов из примера этого урока: истинная модель $y=5+0{,}3x_1+0{,}4x_2+0{,}02\,x_1x_2$. Вычисли $y$ при $x_1=25$, $x_2=10$.


Задание 14: Используя таблицу метрик из сквозного эксперимента этого урока (степень 1: train 3.17/test 8.76; степень 3: train 1.88/test 2.45; степень 19: train 0.02/test ≈23,6 млрд), объясни, почему нельзя выбирать степень полинома, ориентируясь только на train MSE.


Задание 15: Тестовый $R^2$ полинома 19-й степени в сквозном примере этого урока оказался равен примерно $-174\,965\,535$. Объясни, как $R^2$ вообще может быть настолько сильно отрицательным, если по определению он не должен опускаться ниже 0 для "разумной" модели.


Задание 16: Сколько новых полиномиальных признаков (без свободного члена) создаст PolynomialFeatures(degree=2) для трёх исходных переменных $x_1, x_2, x_3$? Перечисли их.


Задание 17: Почему важно вызывать poly.fit_transform(X_train), а затем poly.transform(X_test) — а не fit_transform отдельно для train и отдельно для test?


Задание 18: Почему полином высокой степени особенно сильно "взрывается" именно за пределами обучающего диапазона $x$, а не только между точками внутри диапазона?


Задание 19: В терминах bias-variance разложения из урока 304: какая составляющая ошибки доминирует у полинома степени 1 на кубических данных, а какая — у полинома степени 19 на 22 точках?


Задание 20: Опиши концептуально (без кода), как кросс-валидация из урока 306 помогает выбрать степень полинома, не полагаясь на единственное train/test разбиение.


Задания-челленджи (21–30)

Задание 21: Используя формулу $\binom{n+d}{d}-1$, посчитай, сколько полиномиальных признаков создаст PolynomialFeatures(degree=3) для 5 исходных переменных.


Задание 22: Объясни своими словами феномен Рунге и почему он связан именно с равномерно расположенными узлами интерполяции, а не с интерполяцией вообще.


Задание 23: Дан набор из 3 точек: $(0,1), (1,4), (2,9)$. Найди коэффициенты полинома второй степени $\hat y = w_0+w_1x+w_2x^2$, проходящего точно через все три точки (реши систему уравнений вручную).


Задание 24: При обучении PolynomialFeatures(degree=10) на признаке $x$ со значениями порядка сотен (например, площадь квартиры в квадратных метрах) практики часто сталкиваются с численной нестабильностью и предупреждениями о плохой обусловленности матрицы. Почему это происходит и что стоит сделать перед генерацией высоких степеней?


Задание 25: Объясни качественно (без вывода формул), как добавление штрафа $\lambda\sum w_j^2$ к функции потерь МНК способно "укротить" дикое поведение полинома высокой степени между обучающими точками, не меняя саму степень полинома.


Задание 26: Напиши код pipeline из трёх шагов: PolynomialFeatures(degree=5), StandardScaler, Ridge(alpha=10) — и объясни, почему именно в этом порядке, а не, скажем, со StandardScaler перед PolynomialFeatures.


Задание 27: Докажи (в общем виде, не для конкретных чисел), почему train MSE полинома степени $n-1$ на $n$ точках общего положения всегда точно равно нулю.


Задание 28: Две модели показывают на одной и той же выборке одинаковый train $R^2=0{,}98$: полином второй степени и полином десятой степени. Test $R^2$ у них 0,95 и 0,40 соответственно. Объясни разницу и предложи план из минимум трёх шагов для выбора между ними и для дальнейшего улучшения.


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


Задание 30: Спроектируй полный практический процесс подбора степени полинома и силы регуляризации для новой задачи регрессии с одним признаком: опиши по шагам, что делается на train/validation/test выборках и в каком порядке, обосновывая каждый шаг материалом этого и предыдущих уроков.


Частые ошибки

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

Правильно: оптимальная степень минимизирует ошибку на новых данных (test/validation), а не на обучающей выборке — слишком высокая степень даёт почти нулевую обучающую ошибку ценой катастрофического переобучения

💡 Почему: train MSE монотонно убывает с ростом степени почти по определению — у более гибкой модели больше возможностей подогнаться под конкретные обучающие точки, но это никак не гарантирует обобщающую способность

Ошибка: «Полиномиальная регрессия — это нелинейная модель, и её нельзя решать обычным МНК»

Правильно: полиномиальная регрессия линейна по параметрам $w$ и решается той же самой математикой МНК, что и обычная линейная регрессия — нелинейность относится только к зависимости от исходного признака $x$

💡 Почему: путаница возникает из-за того, что график $\hat y(x)$ действительно кривая, а не прямая — но линейность модели определяется линейностью относительно оптимизируемых параметров, а не формой итогового графика

Ошибка: «Достаточно посмотреть на предсказания внутри обучающего диапазона, чтобы понять, хороша ли модель»

Правильно: особенно опасно поведение модели за пределами обучающего диапазона и в промежутках между точками — именно там полином высокой степени обычно демонстрирует самые дикие отклонения

💡 Почему: обучающая ошибка измеряется только в конкретных обучающих точках, и катастрофическое поведение между ними или за диапазоном никак не отражается в train MSE

Ошибка: «PolynomialFeatures нужно применять к train и test независимо, вызывая fit_transform на каждом»

Правильно: преобразование (в частности, любые последующие шаги вроде масштабирования) настраивается только на train через fit, а к test применяется уже настроенное преобразование через transform

💡 Почему: независимая настройка на test создаёт риск непоследовательной обработки данных и, в более общем пайплайне с масштабированием, приводит к утечке статистик тестовой выборки в процесс, что искажает честную оценку качества модели

Ошибка: «Забывают, что число признаков растёт комбинаторно при нескольких переменных, и получают тысячи признаков из пары десятков исходных столбцов»

Правильно: для многомерных данных степень полинома стоит выбирать особенно осторожно (часто degree=2 уже достаточно), явно проверяя итоговое число сгенерированных признаков относительно объёма выборки

💡 Почему: при $n$ исходных признаках число новых столбцов растёт как $\binom{n+d}{d}$ — уже при $n=20$, $d=3$ получаются полторы тысячи признаков, что почти гарантированно приводит к переобучению на выборках разумного размера

Ошибка: «Полиномиальные признаки высокой степени можно генерировать без масштабирования — это просто линейная регрессия, масштаб не важен»

Правильно: признаки вроде $x^{10}$ могут отличаться от $x$ на много порядков по абсолютной величине, что вызывает численную нестабильность при решении МНК и несправедливое распределение регуляризационного штрафа между признаками

💡 Почему: хотя формально алгебра МНК не требует одинакового масштаба признаков, на практике плохо обусловленные матрицы приводят к ошибкам округления, а регуляризация в её стандартной форме штрафует все веса одинаково вне зависимости от масштаба соответствующего признака

Главное запомнить

  • Полиномиальная регрессия добавляет к исходному признаку $x$ новые признаки $x^2, x^3, \dots, x^d$ — модель остаётся линейной по параметрам $w$ и решается методом МНК, но становится нелинейной по $x$

  • Для нескольких переменных, помимо чистых степеней каждого признака, добавляются признаки взаимодействия вроде $x_1 \cdot x_2$, улавливающие эффекты, где влияние одной переменной зависит от значения другой

  • Число новых признаков при $n$ исходных переменных и степени $d$ растёт комбинаторно как $\binom{n+d}{d}-1$ — уже при умеренных $n$ и $d$ признаков может стать больше, чем строк данных

  • Степень полинома $d$ — это явный, управляемый гиперпараметр сложности модели: низкая степень даёт высокий bias (недообучение), высокая степень — высокую variance (переобучение)

  • Полином степени $n-1$ всегда может пройти точно через любые $n$ точек с попарно различными $x$ — это чисто алгебраический факт (невырожденность матрицы Вандермонда), не имеющий отношения к качеству модели

  • Сквозной численный эксперимент показал: степень 1 — недообучение (train MSE 3.17, test MSE 8.76), степень 3 — золотая середина (train 1.88, test 2.45), степень 19 — катастрофа (train 0.02, test ≈23,6 млрд, отрицательный $R^2$)

  • Полином высокой степени особенно неадекватно ведёт себя между обучающими точками и за пределами обучающего диапазона — это явление известно как феномен Рунге и предшествует современному понятию переобучения на столетие

  • Оптимальная степень подбирается через кросс-валидацию (урок 306) по ошибке на отложенных данных, а не по train MSE, который у высоких степеней обманчиво стремится к нулю

  • Регуляризация (Ridge/Lasso, урок 312) становится практически обязательной при степенях выше 2-3, особенно при нескольких исходных признаках — она ограничивает величину коэффициентов и не даёт кривой вести себя катастрофически

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

Связь с темами курса

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

Но по-настоящему центральная связь этого урока — с уроком 304 про переобучение и недообучение. Там эти понятия были определены абстрактно и проиллюстрированы разными моделями (линейная регрессия против параболических данных, дерево решений без ограничения глубины, k-NN с $k=1$, большая нейросеть на маленьком датасете) и был приведён краткий пример с полиномами разных степеней. Этот урок довёл именно тот пример до полноценного, самостоятельного разбора: одна и та же техника — полиномиальная регрессия — на одном и том же наборе точек демонстрирует весь спектр от явного недообучения через золотую середину до катастрофического переобучения, управляемого единственным явным числом — степенью полинома. Если урок 304 объяснял механизм bias-variance компромисса в общем виде, то этот урок дал самую прозрачную, буквально видимую на графике и в коэффициентах иллюстрацию того же самого механизма.

Следующий урок 312 разбирает Ridge- и Lasso-регуляризацию формально — с выводом того, почему L2-штраф плавно сжимает веса к нулю, а L1-штраф способен занулять их точно (soft thresholding, уже частично затронутый в уроке 291 про проксимальные методы). Этот урок дал конкретную, практическую причину, зачем регуляризация вообще нужна именно в контексте полиномиальных признаков: без неё высокие степени полинома оказываются почти неприменимы на практике, а с ней те же самые степени становятся управляемым, полезным инструментом. Урок 306 про кросс-валидацию, в свою очередь, даёт формальный протокол для того самого подбора степени и силы регуляризации, который в этом уроке был описан лишь на уровне идеи (задание 20 и 30).

Интересные факты

  • Феномен Рунге можно наблюдать даже на функции, которая выглядит абсолютно безобидно и гладко — классический пример самого Рунге использовал функцию $f(x) = \frac{1}{1+25x^2}$ на интервале $[-1,1]$: несмотря на то, что эта функция всюду гладкая и не имеет никаких резких изменений, её интерполяция полиномами возрастающей степени по равномерным узлам расходится всё сильнее именно у краёв интервала, а не улучшается, как можно было бы наивно ожидать.

  • Проблема, которую решает Ridge-регуляризация применительно к полиномам, была известна математикам-вычислителям задолго до машинного обучения под названием «плохая обусловленность» (ill-conditioning): матрица Вандермонда для высоких степеней полинома становится численно почти вырожденной, и даже без всякого разговора о переобучении простое точное решение системы уравнений МНК начинает страдать от катастрофического накопления ошибок округления.

  • В scikit-learn PolynomialFeatures поддерживает параметр interaction_only=True, который создаёт только признаки взаимодействия (вроде $x_1x_2$, $x_1x_2x_3$), полностью пропуская чистые степени отдельных признаков ($x_1^2$, $x_2^2$) — удобно, когда есть основания полагать, что нелинейность связана именно с совместным эффектом переменных, а не с нелинейной формой зависимости от каждой переменной по отдельности.

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

Лайфхаки

  • Прежде чем перебирать степени полинома вручную, построй график зависимости train MSE и validation MSE от степени (кривая, аналогичная кривой обучения по эпохам из урока 304) — точка, где validation MSE перестаёт падать и начинает расти, обычно видна на глаз гораздо быстрее, чем при переборе отдельных чисел.

  • Если после добавления полиномиальных признаков (особенно высокой степени или для нескольких переменных сразу) в консоли появляются предупреждения о плохой обусловленности (ill-conditioned matrix) — это почти всегда сигнал одновременно и к масштабированию признаков, и к переоценке того, действительно ли нужна такая высокая степень.

  • Не добавляй признаки взаимодействия для всех пар признаков подряд «на всякий случай» — при большом числе исходных переменных это быстро создаёт сотни бесполезных столбцов; сначала подумай о предметной области задачи и выбери пары признаков, для которых совместный эффект правдоподобен (как в примере с удобрениями и осадками).

  • Держи в голове простое эмпирическое правило: для задач с одним-двумя признаками и умеренным объёмом данных часто достаточно степени 2-3; более высокие степени редко нужны без явной регуляризации, а на практике деревья решений и градиентный бустинг зачастую справляются с сильно нелинейными зависимостями лучше и проще, чем полиномы очень высокой степени.

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

  • Используй pipeline, объединяющий PolynomialFeatures, масштабирование и модель, а не отдельные вызовы fit/transform — это не только удобство, но и страховка от типичной ошибки, когда преобразование забывают применить одинаково к train и к test.

Полиномиальная регрессия на первый взгляд выглядит как небольшое техническое расширение линейной регрессии — подумаешь, добавили пару новых столбцов. Но за этим простым приёмом стоит одна из самых поучительных демонстраций во всём машинном обучении: одно-единственное число, степень полинома, крутит модель от беспомощного недообучения через уверенный, разумный баланс до эффектного, катастрофического переобучения — и всё это можно увидеть на одних и тех же нескольких точках, буквально своими глазами. Именно поэтому этот урок стоит держать в памяти не как изолированный факт про степени $x$, а как рабочую интуицию, которая будет всплывать снова и снова при работе с гораздо более сложными моделями — деревьями, ансамблями, нейросетями, — где точно такой же компромисс между гибкостью и устойчивостью присутствует всегда, просто не так наглядно виден. В следующем уроке ты возьмёшь ровно ту проблему, которую здесь удалось только обозначить и объяснить качественно, — неконтролируемый рост коэффициентов при высоких степенях — и получишь для неё строгий, формальный инструмент: регуляризацию Ridge и Lasso.

Понял тему? Закрепи в боте! 🚀

Попрактикуйся на задачах и получи персональные рекомендации от AI

💪 Начать тренировку
💬 Есть вопрос? Спроси бота!