Полиномиальная регрессия: когда прямая линия не работает
🎯 Зачем это нужно?
Представь, что ты анализируешь зависимость температуры процессора от нагрузки 🖥️. Линейная регрессия говорит: “чем больше нагрузка, тем горячее процессор”, но это не так! При малых нагрузках температура почти не растет, а потом резко скачет вверх - это классическая нелинейная зависимость.
🚗 Автопром: Расход топлива от скорости (минимум на 60-80 км/ч, потом растет квадратично) 📱 Игры: FPS от настроек графики (сначала линейно падает, потом обваливается) 💰 Финансы: Прибыль от рекламного бюджета (сначала растет быстро, потом выходит на плато)
📚 История вопроса
В 1805 году Лежандр и Гаусс изобрели метод наименьших квадратов для… предсказания траектории астероида! 🌌 Они поняли: орбиты планет - это не прямые линии, а эллипсы (полиномы 2-й степени).
Современный бум полиномиальной регрессии начался в 1960-х с появлением компьютеров. Внезапно стало возможно вычислять полиномы высоких степеней за секунды!
💡 Интуиция
Линейная регрессия - это как пытаться нарисовать портрет только прямыми линиями. Получится… странно 😅
Полиномиальная регрессия добавляет “изгибы”: x², x³, x⁴. Чем выше степень, тем более изогнутую кривую можем нарисовать. Но есть ловушка: слишком много изгибов = переобучение!
[МЕДИА: image_01] Описание: График показывающий линейную vs полиномиальную регрессию на данных с явно нелинейной зависимостью Промпт: “comparison plot showing linear regression (straight red line) vs polynomial regression (curved blue line) fitting data points, scatter plot with clear nonlinear pattern, professional data science visualization style, clean white background”
Полиномиальная регрессия - это тот же МНК, но мы добавляем новые признаки!
Вместо: y = w₀ + w₁x Делаем: y = w₀ + w₁x + w₂x² + w₃x³ + … + wₙxⁿ
📐 Формальное определение
Полиномиальная регрессия степени n: y = β₀ + β₁x + β₂x² + β₃x³ + … + βₙxⁿ + ε
где:
- βᵢ - коэффициенты полинома
- n - степень полинома (гиперпараметр)
- ε - шум
Трансформация признаков: X = [1, x, x², x³, …, xⁿ]
Затем применяем обычный МНК: β̂ = (XᵀX)⁻¹Xᵀy
🔍 Примеры с разбором
Пример 1: Анализ производительности алгоритма
У нас есть данные времени выполнения сортировки от размера массива:
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
# Данные: размер массива vs время (мс)
sizes = np.array([100, 500, 1000, 2000, 5000, 10000])
times = np.array([0.1, 2.5, 10.1, 40.5, 250.8, 1001.2])
# Полиномиальная регрессия степени 2
poly_reg = Pipeline([
('poly', PolynomialFeatures(degree=2)),
('linear', LinearRegression())
])
poly_reg.fit(sizes.reshape(-1, 1), times)
[МЕДИА: image_02] Описание: График времени выполнения алгоритма сортировки vs размера массива с квадратичной аппроксимацией Промпт: “algorithm performance analysis plot, scatter points showing execution time vs array size, quadratic polynomial fit curve, computer science visualization style, professional look, labeled axes”
Получили: time ≈ 0.00001·size² - коэффициент при x² показывает, что сложность O(n²)!
Пример 2: Проклятие размерности
Что будет, если взять степень 5 для 6 точек?
# Полином степени 5 для 6 точек
poly_overfitted = PolynomialFeatures(degree=5)
X_poly = poly_overfitted.fit_transform(sizes.reshape(-1, 1))
print(f"Размерность: {X_poly.shape}") # (6, 6) - ровно столько, сколько точек!
Получим интерполяцию - кривая пройдет через каждую точку, но обобщать не будет! 😱
🎮 Практика
Базовый уровень 🟢
Задание 1: Реализуй полиномиальную регрессию степени 3 для предсказания цены квартиры от площади
# Данные: площадь (м²) vs цена (млн руб)
areas = [30, 45, 60, 75, 90, 120, 150]
prices = [3.2, 4.1, 5.8, 7.2, 8.9, 12.5, 16.8]
# Твой код здесь
Задание 2: Объясни, почему R² может быть выше у полиномиальной регрессии, но качество предсказаний хуже?
Задание 3: Найди оптимальную степень полинома для данных с помощью cross-validation
Задание 4: Реализуй полиномиальную регрессию “с нуля” через матричные операции numpy
Продвинутый уровень 🟡
Задание 5: Исследуй bias-variance tradeoff: постройте кривые обучения для полиномов степени 1, 3, 9, 15
Задание 6: Создай регуляризованную полиномиальную регрессию (Ridge) и сравни с обычной
Задание 7: Реализуй выбор степени полинома через информационные критерии (AIC, BIC)
Задание 8: Постройте доверительные интервалы для полиномиальной регрессии
Челлендж 🔴
Задание 9: Реализуй ортогональные полиномы (Чебышева) для улучшения численной устойчивости
Задание 10: Создай adaptive polynomial regression, который автоматически выбирает степень по данным
Задание 11: Исследуй кусочно-полиномиальную регрессию (piecewise polynomial) для данных с разрывами
⚠️ Частые ошибки
❌ Ошибка: “Чем выше степень, тем лучше модель”
✅ Правильно: Высокая степень = переобучение на малых данных
💡 Почему: Полином степени n-1 может точно пройти через n точек, но обобщать не будет
❌ Ошибка: Забываем про масштабирование признаков ✅ Правильно: x² и x¹⁰⁰ имеют совершенно разные масштабы! 💡 Почему: Большие степени создают огромные числа, градиентный спуск “ломается”
❌ Ошибка: Используем полиномы для экстраполяции далеко за пределы данных
✅ Правильно: Полиномы хороши только для интерполяции
💡 Почему: Полиномы высоких степеней “взрываются” на краях
❌ Ошибка: Не проверяем мультиколлинеарность между степенями x ✅ Правильно: x и x² сильно коррелируют, используй регуляризацию 💡 Почему: Высокая корреляция → неустойчивые коэффициенты
❌ Ошибка: Выбираем степень по R² на обучающей выборке ✅ Правильно: Используй кросс-валидацию для выбора гиперпараметров 💡 Почему: R² всегда растет с увеличением степени, это не показатель качества
🎓 Главное запомнить
✅ Суть: Полиномиальная регрессия = обычный МНК + новые признаки (x², x³, …)
✅ Ключевая идея: Степень полинома - это гиперпараметр, баланс между недообучением и переобучением
✅ Где применяется: Всюду, где зависимость явно нелинейна, но нужна интерпретируемость
🔗 Связь с другими темами
Назад: Линейная регрессия (урок 310) - базовый случай полиномиальной (степень 1)
Вперед: Регуляризация (Ridge/Lasso) поможет бороться с переобучением полиномов высоких степеней
Параллельно: Kernel trick в SVM использует похожую идею - неявно строить полиномиальные признаки
Понял тему? Закрепи в боте! 🚀
Попрактикуйся на задачах и получи персональные рекомендации от AI
💪 Начать тренировку