Почему полиномиальная регрессия ломается на реальных данных (и вы об этом не знаете)
Вы берете нелинейные данные. Применяете PolynomialFeatures. Увеличиваете степень. Ждете магию точности. А получаете катастрофу на краях графика - дикие колебания, которые не имеют ничего общего с реальностью. Это явление Рунге, и оно убивает вашу модель тихо, без предупреждений.
Карл Рунге обнаружил это в 1901 году, но мы до сих пор наступаем на те же грабли. Полиномы высокой степени хотят пройти через все точки. Абсолютно все. Даже через выбросы. Результат? Модель, которая идеально работает на тренировочных данных и полностью бесполезна на новых.
Если ваша полиномиальная регрессия степени 10+ выглядит слишком хорошо на графике - проверьте крайние точки. Скорее всего, вы уже в ловушке Рунге.
Сплайны: Когда математика работает на вас, а не против
Представьте вместо одного гигантского полинома на весь диапазон данных - набор маленьких полиномиков, каждый на своем отрезке. Каждый ведет себя прилично. В местах стыков они гладко соединяются. Это сплайны. Не глобальное решение, а локальное. Умное.
Scikit-Learn добавил SplineTransformer в версии 0.23. Многие пропустили этот релиз. А зря. Это один из самых полезных трансформеров для работы с нелинейными зависимостями, который не требует глубокого понимания математики сплайнов.
SplineTransformer на практике: Шаг за шагом
1 Когда не использовать сплайны (да, с этого начнем)
Не применяйте SplineTransformer если:
- У вас меньше 20-30 наблюдений (не хватит данных для определения узлов)
- Зависимость явно линейная (не усложняйте)
- Данные имеют разрывы или скачки (сплайны требуют гладкости)
- Вы работаете с категориальными признаками (это не их история)
2 Базовая настройка: Три параметра, которые меняют всё
SplineTransformer в Scikit-Learn настраивается тремя ключевыми параметрами:
| Параметр | Что делает | Типичные значения |
|---|---|---|
| n_knots | Количество узлов (мест стыков) | 5-10 для большинства задач |
| degree | Степень полиномов | 3 (кубические сплайны) |
| knots | Расположение узлов | 'quantile' или 'uniform' |
Начните с n_knots=5, degree=3, knots='quantile'. Это работает в 80% случаев. 'quantile' размещает узлы по квантилям распределения - больше узлов там, где больше данных. Умно.
3 Интеграция в пайплайн: Не делайте это вручную
Самая частая ошибка - применять SplineTransformer отдельно, а потом подавать в модель. Нет. Используйте Pipeline. Всегда.
Почему? Потому что при кросс-валидации вы хотите, чтобы трансформация применялась отдельно к каждому фолду. Иначе информация из тестового фолда просочится в тренировочный через параметры трансформера. Та же проблема, что и с ковариационным сдвигом, только на этапе препроцессинга.
Правильный пайплайн: SplineTransformer → StandardScaler → Ridge/LinearRegression. Scaler после сплайнов, потому что сплайны создают фичи разного масштаба.
4 Регуляризация: Сплайны любят Ridge
SplineTransformer создает много фичей. Для одного признака с 5 узлами и степенью 3 получится 5 + 3 = 8 фичей. Для 10 признаков - 80. Это много. Без регуляризации переобучитесь.
Используйте Ridge регрессию вместо LinearRegression. ElasticNet если хотите отбор признаков. Lasso работает, но осторожно - он может слишком агрессивно обнулять фичи сплайнов.
Продвинутые техники: Что не пишут в документации
Узлы по бизнес-логике
Иногда равномерное или квантильное распределение узлов не имеет смысла. У вас есть физические границы, пороги, точки изменения поведения. Задайте узлы вручную через параметр knots, передав массив позиций.
Например, в прогнозировании спроса: узлы на 0°C (замерзание), 20°C (комфорт), 30°C (жара). Математика не знает вашей предметной области. Вы знаете.
Экстраполяция: Слабое место сплайнов
Сплайны плохо экстраполируют за пределы тренировочного диапазона. Последний кусочек полинома продолжается за последний узел. Если зависимость на краях нелинейна - будет провал.
Решение? Добавьте фичу-индикатор "за пределами диапазона" или используйте отдельную модель для экстраполяции. Или просто признайте, что за пределами тренировочных данных вы не можете делать надежные предсказания (это честно).
Взаимодействия признаков
SplineTransformer работает с каждым признаком отдельно. Хотите взаимодействия? Используйте PolynomialFeatures после сплайнов (осторожно, будет много фичей) или создавайте кастомные взаимодействия вручную.
Лучший подход: начните без взаимодействий. Добавляйте только если видите в данных сигнал о необходимости. Не создавайте сложность без причины.
Сравнение с альтернативами: Когда что выбирать
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| SplineTransformer | Нет явления Рунге, интерпретируемость, стабильность | Плохая экстраполяция, нужно настраивать узлы | Большинство нелинейных регрессий |
| PolynomialFeatures | Простота, взаимодействия | Явление Рунге, переобучение | Только низкие степени (1-3) |
| Ядерные методы | Мощность, универсальность | Черный ящик, масштабируемость | Мало данных, сложные паттерны |
| Нейросети | Гибкость, автоматическое выделение признаков | Требуют много данных, сложная настройка | Очень сложные нелинейности, много данных |
Частые ошибки и как их избежать
Ошибка 1: Слишком много узлов. Начинается переобучение. Правило: не более n/20 узлов, где n - количество наблюдений. Для 1000 наблюдений - максимум 50 узлов, но лучше 10-15.
Ошибка 2: Забыть про масштабирование после сплайнов. Фичи сплайнов имеют разный масштаб. Ridge и Lasso чувствительны к масштабу. Всегда StandardScaler после SplineTransformer.
Ошибка 3: Использовать сплайны для категориальных признаков. Не делайте этого. Для категориальных - OneHotEncoding или embeddings. Сплайны для непрерывных признаков.
Ошибка 4: Не проверять поведение на краях. Постройте график предсказаний за пределами тренировочного диапазона. Если творится безумие - уменьшите степень или добавьте узлы на краях.
SplineTransformer в продакшене: Чего ждать
В продакшене SplineTransformer ведет себя предсказуемо - это плюс. Но есть нюансы:
- Скорость: Быстрее ядерных методов, медленнее PolynomialFeatures. Для реального времени с тысячами признаков проверьте производительность.
- Память: Матрица дизайна растет линейно с количеством узлов. 100 признаков × 10 узлов = 1000 фичей. Убедитесь, что влезает в память.
- Обслуживание: Параметры сплайнов (узлы) фиксируются при обучении. Новые данные за пределами исходного диапазона? Нужно переобучать или расширять диапазон узлов.
Для сравнения, в задачах с языковыми моделями, где важны сложные взаимодействия, подходы вроде mHC от DeepSeek показывают, как далеко можно уйти от линейных преобразований. Но для табличных данных сплайнов часто достаточно.
Что дальше? Будущее кусочной аппроксимации
SplineTransformer - не конечная точка. В разработке:
- Адаптивные сплайны с автоматическим выбором узлов (пока делаем вручную)
- Многомерные сплайны для взаимодействий (сейчас только одномерные)
- Интеграция с градиентным бустингом (LightGBM уже умеет работать со сплайновыми фичами)
Пока эти технологии созревают, SplineTransformer остается лучшим выбором для добавления нелинейности в линейные модели. Проще, чем нейросети. Стабильнее, чем полиномы. Понятнее, чем ядерные методы.
Полиномиальная регрессия не умерла. Она просто уступила место более умным инструментам. Явление Рунге было не ошибкой математики, а указанием на ее пределы. SplineTransformer - один из способов эти пределы обойти. Без магии. Без черных ящиков. Просто кусочки полиномов, которые ведут себя прилично.
Попробуйте на своих данных. Начните с замены PolynomialFeatures на SplineTransformer в следующем проекте. Разница в стабильности предсказаний вас удивит. Особенно на краях графика, где полиномы обычно сходят с ума.