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

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

Пример: слишком много узлов
Слишком много узлов приводит к переобучению. Модель слишком гибкая, чтобы обобщать.
Нужно столько узлов, чтобы уловить реальные изгибы в данных, но не настолько много, чтобы модель начала запоминать шум. В следующих разделах — как принимать такое решение на практике.
Типы сплайнов
Сплайны бывают нескольких разновидностей, и выбор сводится в основном к тому, какой полином используется в каждом сегменте и какие накладываются ограничения.
Линейные сплайны
Линейные сплайны — самый простой вариант. Каждый сегмент — прямая линия, а сегменты соединяются в узлах.

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

Пример кубических сплайнов
В каждом узле должны выполняться три условия: совпадение значений, первых и вторых производных. Это означает отсутствие скачков, острых углов и внезапных изменений кривизны. Кривая проходит через узлы, не оставляя визуальных следов перехода.
Кубическая степень — минимальная, позволяющая плавно менять кривизну. Поэтому она так популярна. Более высокие степени редко дают полезную гибкость и лишь усложняют управление моделью.
Естественные кубические сплайны
Естественные кубические сплайны — разновидность, которая добавляет дополнительные ограничения на границах данных.

Пример естественных кубических сплайнов
Проблема обычных кубических сплайнов в том, что они могут странно вести себя на краях, особенно там, где мало данных. Крайние слева и справа сегменты — всё ещё кубические полиномы, а кубики при экстраполяции могут быстро «уходить» вверх или вниз.
Естественные кубические сплайны обходят это, принуждая вторую производную к нулю в обоих граничных узлах. На практике это означает, что кривая становится линейной за пределами крайних узлов. Экстраполяция ведёт себя куда стабильнее, поэтому естественные кубические сплайны — лучший выбор, когда важны прогнозы на границах данных.
B-сплайны
B-сплайны (от basis splines, базисные сплайны) — другой способ построения сплайнов. Вместо явного определения каждого полиномиального сегмента B-сплайны представляют сплайн как взвешенную сумму базисных функций.

Пример B-сплайнов
Каждая базисная функция — это небольшой сплайн, отличный от нуля только в ограниченной области. Полный сплайн — сумма этих базисов, каждый умножен на коэффициент, который оценивает регрессия.
B-сплайны численно стабильны и легко расширяются. Большинство современных реализаций сплайнов в Python и R используют представление через B-сплайны, даже если интерфейс выглядит как «обычные» сплайны. Если вы вызывали bs() в R или использовали SplineTransformer в scikit-learn, вы уже работали с B-сплайнами.
Регрессия со сплайнами и полиномиальная регрессия
И полиномиальная регрессия, и регрессия со сплайнами справляются с нелинейными зависимостями, но подходят к этому по-разному. Разница в том, как строится кривая.
Полиномиальная регрессия
Полиномиальная регрессия подгоняет один глобальный полином по всему диапазону предиктора. Вы выбираете степень (2, 3, 5, 10), и модель находит один набор коэффициентов, минимизирующий ошибку на всех данных. У кривой одно уравнение, и оно описывает зависимость повсюду.
Звучит аккуратно, но есть проблема. Один полином должен уравновешивать подгонку по всему диапазону, поэтому то, что происходит в одной области, влияет на другие. Если вы повышаете степень, чтобы учесть резкий изгиб в середине данных, кривая начнёт «размахиваться» на краях. Это и есть упомянутый феномен Рунге — полиномы высоких степеней становятся нестабильными у границ данных.
Другая проблема — у полиномиальной регрессии нет локальности. «Шип» при x = 5 может изменить форму аппроксимации при x = 50, потому что каждое наблюдение влияет на одно и то же глобальное уравнение.
Регрессия со сплайнами
Регрессия со сплайнами разбивает диапазон предиктора на сегменты и подгоняет в каждом полином низкой степени. Полиномы плавно соединены в узлах, но каждый из них в основном определяется данными своей области.
Это даёт локальную гибкость. Область с резким изгибом получает более изогнутый полином. Область с плоским трендом — почти плоский. И поскольку каждый сегмент низкой степени (обычно кубический), ни один участок не ведёт себя странно на краях. Вы получаете более гладкую и стабильную подгонку, особенно у границ данных.
Сравнение бок о бок

Полиномиальная регрессия против регрессии со сплайнами
Если зависимость лишь слегка нелинейна и вас устраивает глобальная аппроксимация, полиномиальная регрессия может подойти. Если шаблон сложнее или важны прогнозы у границ, безопаснее выбрать сплайны.
Выбор числа и расположения узлов
Выбор узлов — самая значимая часть регрессии со сплайнами. Слишком мало — недообучение, слишком много — переобучение. А место, где вы их ставите, определяет, какие паттерны сможет уловить модель.
Есть несколько подходов, и чаще всего вы комбинируете пару из них.
- Экспертные знания домена: Если вы знаете предметную область — используйте это. В клиническом исследовании узлы можно поставить на известных клинических порогах. В ценообразовании — в точках, где ожидается смена поведения потребителей. Такой выбор наиболее интерпретируем, потому что сегменты соответствуют реальным границам.
- Равномерное размещение узлов: Задайте число узлов и равномерно рассейте их по диапазону предиктора. Это работает, когда данные примерно равномерны вдоль оси предиктора. Если же есть плотные и разреженные области, равномерные узлы могут попасть туда, где почти нет данных, и подгонка станет нестабильной.
- Узлы по квантилям: Вместо равных позиций по оси x ставьте узлы по квантилям предиктора. При 4 узлах и квантильном размещении это будут 20-й, 40-й, 60-й и 80-й процентили. Так в каждом сегменте будет примерно одинаковое число наблюдений, и подгонка станет надёжнее в разреженных областях.
- Кросс-валидация: Пробуйте различное число узлов, подгоняйте сплайн для каждого варианта и сравнивайте качество на отложенных данных. Побеждает конфигурация с минимальной валидационной ошибкой. Это снимает гадание, но увеличивает вычислительные затраты; результат по-прежнему зависит от выбранной стратегии размещения (равномерно, по квантилям), по которой вы проводите поиск.
Компромисс здесь тот же, что и в любой регрессии: гибкость против сложности. Больше узлов — больше гибкости: модель улавливает тонкие паттерны, но и легче подгоняет шум. Меньше узлов — модель стабильнее и интерпретируемее, но может упустить реальные закономерности.
Начните с 3–5 узлов, поставленных по квантилям, затем проверьте остатки. Если видите систематические паттерны, которые сплайн не ловит, добавьте узел в этой области. Если подгонка выглядит «рваной», удалите один. Кросс-валидация оправдана, когда нужно обосновать выбор или когда модель идёт в продакшн.
Регрессия со сплайнами в машинном обучении и статистике
Регрессия со сплайнами встречается везде, где нужно смоделировать гладкий нелинейный эффект, не навязывая конкретную функциональную форму. Вот несколько типичных областей:
- Тренды во временных рядах: Часто сплайны используют для отделения плавного тренда во временном ряду от краткосрочных колебаний. Сплайн по времени как предиктору даёт гибкую трендовую линию, которая адаптируется к смене направления без перереагирования на шум. Экономисты и аналитики делают это постоянно, когда хотят описать базовую траекторию величины — например, ВВП или цены акций — без допущений о линейности или экспоненциальности.
- Экономика и эконометрика: Сплайны применяют для моделирования зависимостей, где эффект переменной меняется по её диапазону. Влияние дохода на потребление не постоянно — домохозяйства с низкими и высокими доходами тратят по-разному. Сплайн это «увидит» без задания конкретной формы.
- Здравоохранение и биостатистика: Многие исходы здоровья нелинейно зависят от предикторов вроде возраста, ИМТ, давления или уровней биомаркеров. Риск часто имеет U- или J-образную форму — оба экстремума опасны, середина безопасна. Линейная модель это упустит. Кубические и естественные кубические сплайны — стандартный инструмент для таких эффектов; они встроены в большинство пакетов статистики, используемых в клинических исследованиях.
- Экологическое и средовое моделирование: Сплайны применяют и при моделировании отклика видов или климатических переменных на экологические градиенты. Температура, высота, осадки часто нелинейно влияют на такие исходы, как численность вида или урожайность. Сплайны позволяют подогнать кривую отклика без предварительного задания её формы.
Во всех этих случаях сплайны дают гибкость там, где она нужна, не заставляя угадывать функциональную форму зависимости. Это делает их хорошим выбором для исследовательского моделирования и надёжным вариантом для продакшн-моделей, когда важна интерпретируемость.
Регрессия со сплайнами в Python
В Python есть три распространённых способа подогнать сплайновую регрессию: scikit-learn для ML-пайплайнов, patsy для формульной спецификации и statsmodels для статистической инференции. Рассмотрим каждый.
Использование scikit-learn
scikit-learn предоставляет SplineTransformer, который преобразует числовой признак в набор базисных функций B-сплайнов. Затем вы подаёте эти признаки в любую линейную регрессию.
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import SplineTransformer
from sklearn.pipeline import make_pipeline
# Data
np.random.seed(42)
x = np.linspace(0, 10, 100).reshape(-1, 1)
y = np.sin(x).ravel() + 0.3 * x.ravel() + np.random.normal(0, 0.3, 100)
# Spline features + linear regression pipeline
model = make_pipeline(
SplineTransformer(n_knots=5, degree=3),
LinearRegression()
)
model.fit(x, y)
y_pred = model.predict(x)
print("R^2 score:", model.score(x, y))

R2 в scikit-learn
Компонент SplineTransformer создаёт сплайновый базис с 5 узлами и кубическими полиномами. Затем LinearRegression оценивает коэффициенты для каждой базисной функции. Здесь можно подставить любой регрессор sklearn — ridge, lasso, любой линейный метод на трансформированных признаках.
Этот подход вписывается в рабочие процессы sklearn, но вы не получите статистический вывод — стандартные ошибки или p-значения. Для этого нужны patsy или statsmodels.
Использование patsy
patsy — формульный интерфейс для построения проектировочных матриц. Это самое близкое к формульной системе R в Python и стандартный способ создавать сплайновые признаки для statsmodels.
import numpy as np
import pandas as pd
from patsy import dmatrix
import statsmodels.api as sm
np.random.seed(42)
x = np.linspace(0, 10, 100)
y = np.sin(x) + 0.3 * x + np.random.normal(0, 0.3, 100)
df = pd.DataFrame({"x": x, "y": y})
# B-spline basis using patsy
spline_basis = dmatrix("bs(x, df=6, degree=3)", data=df, return_type="dataframe")
# Fit with statsmodels OLS
model = sm.OLS(df["y"], spline_basis).fit()
print(model.summary())

Итоги модели patsy
Функция bs() внутри формулы говорит patsy построить базис B-сплайнов с 6 степенями свободы и степенью 3 (кубический). patsy возвращает проектировочную матрицу, которую мы подаём прямо в sm.OLS(). Параметр df управляет числом базисных функций сплайна — большие значения дают больше гибкости, аналогично добавлению узлов.
Если нужны естественные сплайны, замените bs() на ns():
spline_basis = dmatrix("ns(x, df=6)", data=df, return_type="dataframe")
Использование statsmodels с формулами
В statsmodels есть формульный API, интегрированный с patsy. Это самый лаконичный вариант, когда нужен сплайн в одну строку с полным статистическим выводом.
import statsmodels.formula.api as smf
model = smf.ols("y ~ bs(x, df=7, degree=3)", data=df).fit()
print(model.summary())

Итоги модели statsmodels
Вывод summary() даёт коэффициенты для каждой базисной функции сплайна, стандартные ошибки, p-значения и обычные статистики качества. Сами коэффициенты напрямую неинтерпретируемы, так как соответствуют базисам, а не реальным величинам. Интерпретируйте подгонку, построив прогнозы по диапазону предиктора.
Для большинства статистических задач формульный API statsmodels — самый удобный. Используйте scikit-learn, когда сплайны — часть большего ML-пайплайна.
Регрессия со сплайнами в R
R предлагает лучшую встроенную поддержку сплайнов среди основных языков. Пакет splines входит в базовую поставку R, и две его основные функции — bs() и ns() — работают прямо внутри любой регрессионной формулы.
Функция bs() создаёт базис B-сплайнов. Функция ns() формирует базис естественных кубических сплайнов. Обе дают матрицу сплайновых признаков, которую формульная система R автоматически включает в модель.
Использование bs() для B-сплайнов
# Data
set.seed(42)
x <- seq(0, 10, length.out = 100)
y <- sin(x) + 0.3 * x + rnorm(100, sd = 0.3)
df <- data.frame(x = x, y = y)
# Cubic B-spline with 6 degrees of freedom
library(splines)
model <- lm(y ~ bs(x, df = 6, degree = 3), data = df)
summary(model)

Вывод bs() в R
Формула y ~ bs(x, df = 6, degree = 3) говорит R заменить x на базис B-сплайнов степени 3 и с 6 степенями свободы. R сделает остальное — построит базисную матрицу, подгонит линейную модель и вернёт стандартный объект lm со всеми диагностическими сводками.
Можно явно задать позиции узлов, если нужен полный контроль:
model <- lm(y ~ bs(x, knots = c(2, 5, 8), degree = 3), data = df)
Это размещает узлы в x = 2, x = 5 и x = 8 вместо автоматического выбора R.
Использование ns() для естественных сплайнов
Для естественных кубических сплайнов (с линейным поведением за пределами границ) используйте ns():
model_natural <- lm(y ~ ns(x, df = 6), data = df)
summary(model_natural)

Вывод ns() в R
Синтаксис тот же, но поведение на границах иное. Естественные сплайны обычно безопаснее, когда важны прогнозы и интерпретация у краёв диапазона.
Интерпретация вывода
Коэффициенты в выводе summary() относятся к базисным функциям сплайна, а не к интерпретируемым величинам. Чтобы понять, что «выучила» модель, сделайте прогнозы на сетке значений x и постройте график:
x_grid <- data.frame(x = seq(0, 10, length.out = 200))
preds <- predict(model, newdata = x_grid)
plot(df$x, df$y)
lines(x_grid$x, preds, col = "green", lwd = 2)

Интерпретация вывода в R
Это стандартный приём в R: подогнать сплайн, предсказать на гладкой сетке и наложить кривую на данные. В R также можно использовать сплайновые члены вместе с другими предикторами в одной формуле:
model_multi <- lm(y ~ ns(x, df = 6) + other_var, data = df)
Так в одной модели подгоняется нелинейный эффект для x и линейный — для other_var. Эта гибкость — одна из причин широкой популярности сплайнов в рабочих процессах на базе R.
Преимущества регрессии со сплайнами
Вот несколько преимуществ сплайнов по сравнению с более популярными моделями машинного обучения:
- Моделируют нелинейности без знания формы: Не нужно задавать конкретную функциональную форму. Сплайны позволяют данным «рисовать» кривую, так что вы можете моделировать изгибы, плато и смены направления, не зная заранее, где они возникнут.
- Гладкая и интерпретируемая подгонка: На выходе — непрерывная кривая, а не «чёрный ящик». Её можно нарисовать, увидеть, как отклик меняется по диапазону предиктора, и объяснить это не технической аудитории.
- Стабильнее, чем полиномы высоких степеней: Каждый сегмент — полином низкой степени, поэтому ни один кусок не «выпрыгнет» на краях. Поведение на границах намного контролируемее, особенно у естественных кубических сплайнов.
- Встраиваются в обычные регрессионные процессы: Сплайны работают внутри стандартной линейной регрессии. Их можно комбинировать с другими предикторами, регуляризацией, смешанными эффектами и любыми инструментами поверх МНК.
Ограничения регрессии со сплайнами
Как и у большинства моделей, у сплайнов есть компромиссы, о которых важно знать:
- Выбор узлов — сложная часть: Нужно подобрать число и расположение узлов. Иногда сгодятся значения по умолчанию, но во многих случаях потребуется кросс-валидация или знания домена. Универсального правила нет.
- Интерпретация усложняется при избытке узлов: Сплайн с тремя узлами ещё прост для объяснения. С двадцатью — уже нет. Кривую всё ещё можно нарисовать, но строго объяснять поведение модели становится гораздо труднее.
- Переобучение всё ещё возможно: Сплайны стабильнее, чем полиномы высоких степеней, но не застрахованы от переобучения. Слишком много узлов, неудачное их размещение, множество выбросов или малая выборка — всё это может дать модель, которая хорошо подгоняется на обучении, но плохо обобщает.
- Коэффициенты напрямую неинтерпретируемы: Оцененные коэффициенты соответствуют базисным функциям, а не реальным величинам. Нельзя просто «считать» из них: «увеличение x на одну единицу меняет y на бета», как в линейной регрессии. Приходится интерпретировать визуально.
Распространённые ошибки при регрессии со сплайнами
Рассмотрим несколько ошибок, которые часто допускают новички:
- Слишком много узлов: Часто добавляют узлы, пока подгонка не станет выглядеть хорошо на обучении. Это классическая ловушка переобучения. Если сплайн «виляет» между каждой точкой — узлов слишком много. Проведите кросс-валидацию или начните с меньшего числа и добавляйте только тогда, когда остатки явно указывают на необходимость.
- Слишком мало узлов и предположение о линейности: Обратная ошибка. Если вы подогнали сплайн с одним-двумя узлами, а остатки всё ещё показывают кривизну, модель недообучена. Сплайн просто не имеет достаточно сегментов, чтобы следовать реальной зависимости. Добавьте узлы в областях, где остатки «хромают».
- Непонимание поведения на границах: Обычные кубические сплайны могут вести себя непредсказуемо на краях данных. Если вы делаете прогнозы близко к границам (или за их пределами), используйте естественные кубические сплайны. Они принуждают линейное поведение за граничными узлами и избегают «размаха», к которому склонны обычные кубические сплайны.
- Прямое сравнение со «свободными» нелинейными моделями: Сплайны не пытаются быть нейросетями или случайными лесами. Если сравнить сплайн с полностью нелинейной «чёрной коробкой» по чистой точности, «чёрный ящик» часто выиграет по метрикам. Но это не цель. Сплайны выигрывают по интерпретируемости и возможности встроить их в традиционный статистический анализ.
Регрессия со сплайнами и другие нелинейные методы
Сплайны — не единственный способ моделировать нелинейности, но они полезны, когда важна интерпретируемость. Вот как они сравниваются с распространёнными альтернативами.
Полиномиальная регрессия
Полиномиальная регрессия использует одно глобальное уравнение. Её проще задать, но она менее стабильна, особенно на границах. Сплайны превосходят полиномы по гибкости и стабильности, когда в зависимости более одного изгиба. Полиномы проще интерпретировать только при очень низких степенях (2 или 3). Дальше сплайны становятся и надёжнее, и понятнее.
Обобщённые аддитивные модели (GAM)
GAM по сути — сплайны «в масштабе». GAM позволяет подогнать сплайн для каждого предиктора независимо и сложить их аддитивно. Можно считать сплайновую регрессию GAM для одной переменной, а GAM — суммой сплайнов по нескольким переменным.
GAM аккуратнее работает с несколькими нелинейными предикторами, чем ручная подгонка сплайнов для каждого. В нём есть штрафы сглаживания, которые подбирают нужную степень гибкости и снимают часть работы по выбору узлов. Если у вас несколько предикторов и паре из них нужна нелинейность, чаще лучше подойдёт GAM.
Решающие деревья
Деревья идут совсем другим путём. Вместо гладкой кривой они разбивают пространство предикторов на прямоугольные регионы и предсказывают в каждом константу. Результат — ступенчатая функция.
В чём-то деревья гибче сплайнов — они могут моделировать взаимодействия и резкие изменения. Но подогнанная функция не гладкая и не непрерывная. Ещё она хуже обобщает в разреженных регионах. Сплайны лучше, если вам важны гладкость и стабильная экстраполяция. Деревья — если нужно моделировать чёткие границы или взаимодействия множества переменных.
Почему регрессия со сплайнами важна
Сплайны повсюду в прикладной статистике. Они встречаются в клинических исследованиях, экономическом анализе, науках об окружающей среде, моделировании временных рядов — везде, где нужно смоделировать гладкий нелинейный эффект, не прибегая к «чёрным ящикам».
Причина — баланс, который они предлагают: достаточно гибкости, чтобы справиться с «грязными» данными, и достаточно структуры, чтобы оставаться интерпретируемыми и стабильными.
Они также лежат в основе более продвинутых методов. Обобщённые аддитивные модели строятся прямо на сплайнах, сглаживающие сплайны развивают идею за счёт встроенной регуляризации, а многие современные методы нелинейной регрессии используют сплайновые базисы. Хотите понять эти методы — начните со сплайнов.
Итак, сплайны важны потому, что они практичны и потому что являются строительными блоками для многого, что следует дальше. Это не самые «мощные» модели, но одни из самых надёжных — а часто это и важно.
Заключение
Регрессия со сплайнами моделирует нелинейные зависимости, сочетая кусочные полиномы в точках, называемых узлами. Вся остальная вариативность — лишь варианты этой идеи.
Узлы и гладкость — две ключевые концепции. Всё остальное (типы сплайнов, базисные представления, реализация в R и Python) — разные способы работать с ними.
Попробуйте несколько типов сплайнов на своих данных. Сравните кубические, естественные кубические и B-сплайны. Сдвигайте узлы и смотрите, что происходит. Экспериментируйте: визуальная природа подгонки позволяет легко увидеть эффект каждого выбора.
Если хотите глубже погрузиться в математику сплайнов и многих других алгоритмов, запишитесь на наш трек Machine Learning Scientist in Python. В нём есть всё необходимое, чтобы быть готовыми к работе в 2026 году.
Вопросы и ответы о регрессии со сплайнами
Что такое регрессия со сплайнами простыми словами?
Регрессия со сплайнами — это способ моделировать криволинейные зависимости в данных, разбивая диапазон предиктора на сегменты и подгоняя в каждом небольшой полином. Сегменты плавно соединяются в точках, называемых узлами, так что в итоге получается одна непрерывная кривая. Она гибче линейной регрессии и стабильнее полиномиальной высокой степени.
Когда стоит использовать регрессию со сплайнами вместо линейной?
Используйте регрессию со сплайнами, когда зависимость между предиктором и откликом — не прямая линия. Если в линейной модели в остатках остаются паттерны — например, ошибки положительны в середине диапазона и отрицательны на краях — это признак нелинейности.
Что такое узлы в регрессии со сплайнами?
Узлы — это точки вдоль оси предиктора, где один полиномиальный сегмент заканчивается, а следующий начинается. Они определяют, насколько гибким может быть сплайн. Больше узлов — больше мест, где кривая может изгибаться. Выбор числа и расположения узлов — центральное решение в сплайн-регрессии: слишком мало — недообучение, слишком много — переобучение.
В чём разница между кубическими и естественными кубическими сплайнами?
Оба вида используют кубические полиномы между узлами, но по-разному ведут себя на границах данных. Обычные кубические сплайны могут непредсказуемо вести себя на краях, так как крайние участки — всё ещё полноценные кубические полиномы. Естественные кубические сплайны заставляют кривую быть линейной за пределами крайних узлов, что делает прогнозы у границ и за ними гораздо стабильнее.
Как выбрать число узлов для сплайновой модели?
Начните с 3–5 узлов, расположенных по квантилям предиктора, чтобы в каждом сегменте было примерно одинаковое число наблюдений. Если остатки показывают паттерны, которые сплайн не ловит, добавьте узел в этой области. Для более строгого подхода используйте кросс-валидацию: сравните разные числа узлов и выберите конфигурацию с наименьшей валидационной ошибкой.