Машинное обучение
Полиномиальная регрессия
Линейная регрессия предсказывает цену дома по площади - прямая линия, простая формула, всё работает. Но заказчик приносит новый датасет: зависимость между дозой лекарства и эффектом. Эффект сначала растёт, потом падает - параболой. Прямая линия промахивается катастрофически. Можно ли заставить линейную регрессию моделировать кривые? И если да - где остановиться, чтобы модель не заучила шум вместо закономерностей?
- **Фармакология:** зависимость доза-эффект почти всегда нелинейна - малая доза не действует, оптимальная лечит, чрезмерная вредит. Полиномиальные модели помогают найти оптимальную дозу, а overfitting может стоить жизней, если модель "увидит" ложный оптимум
- **Экономика:** кривая Лаффера показывает, что налоговые поступления сначала растут с увеличением ставки, а потом падают - классическая парабола. Политические решения на триллионы долларов зависят от правильной оценки этой кривой
- **Инженерия:** прочность моста нелинейно зависит от толщины балки - квадратично. Линейная модель недооценит прочность тонких балок и переоценит толстых, что может привести к аварии или перерасходу материалов
Предварительные знания
Подгонка кривых и опасность высоких степеней
Подгонка полинома к данным старше, чем кажется. В 1815 году Жозеф Диаз Жергонн опубликовал работу о подгонке полиномов к наблюдениям и о выборе точек для измерений, ранний образец того, что сегодня называют планированием эксперимента. Предостережение пришло в 1901 году от Карла Рунге. Он показал, что если протащить полином высокой степени через равноотстоящие точки, у краёв интервала он начинает резко осциллировать, уходя далеко от тех данных, которые должен описывать. Феномен Рунге - классическая иллюстрация того, почему более высокая степень не делает модель автоматически лучше и почему вместо простого наращивания степени берут регуляризацию или неравномерные узлы.
Полиномиальные признаки
В прошлом уроке мы построили линейную регрессию: модель ищет прямую y = w*x + b, которая лучше всего описывает данные. Но что если данные описываются не прямой, а параболой? Например, брошенный вверх мяч: его высота зависит от времени квадратично. Прямая линия *никогда* не сможет описать параболическую траекторию, сколько бы мы ни подбирали w и b.
Фикс в одну строку: **добавить новые признаки как степени x**. Если у нас есть признак x, мы создаём новые: x^2, x^3 и т.д. Теперь модель ищет y = w1*x + w2*x^2 + b - а это уже парабола! Ключевой момент: модель по-прежнему **линейна по параметрам** (w1, w2, b). Мы не изменили алгоритм обучения - мы обогатили входные данные.
**Почему это работает?** Полиномиальная регрессия - это обычная линейная регрессия, которая получает «усиленный» набор признаков. Мы не меняем алгоритм, мы меняем *представление данных*. Это важный принцип ML: правильные признаки (feature engineering) часто важнее сложного алгоритма. - Степень 1: y = w1*x + b (прямая) - Степень 2: y = w1*x + w2*x^2 + b (парабола) - Степень 3: y = w1*x + w2*x^2 + w3*x^3 + b (кубическая кривая) - Степень n: n+1 параметр, n изгибов
Когда признаков несколько, PolynomialFeatures создаёт ещё и **interaction features** - произведения разных признаков. Если у нас x1 (площадь дома) и x2 (расстояние до центра), то degree=2 даст: [x1, x2, x1^2, x1*x2, x2^2]. Произведение x1*x2 захватывает эффект *взаимодействия*: большой дом далеко от центра может стоить иначе, чем предсказывает линейная сумма. Количество признаков растёт как C(n+d, d), где n - число исходных признаков, d - степень. При n=10, d=3 это уже **286 признаков** из 10 исходных.
Почему полиномиальную регрессию называют 'линейной по параметрам', хотя она моделирует кривые?
Overfitting: модель запоминает шум
Полиномиальные признаки дают модели предельную гибкость. Полином степени 20 может пройти через каждую точку в датасете из 20 наблюдений - *идеально*. Ошибка на обучающих данных будет равна нулю. Звучит прекрасно? На практике это катастрофа. Такая модель не выучила закономерность - она **запомнила** конкретные точки вместе с шумом. Стоит показать ей новые данные, и предсказания будут дикими.
**Overfitting (переобучение)** - ситуация, когда модель слишком хорошо подстраивается под обучающие данные, включая шум и случайные отклонения, и теряет способность обобщать на новые данные. Главный диагностический признак: **train error значительно меньше test error**. Если модель показывает 99% на train и 60% на test - это классический overfitting.
**Чем больше параметров у модели - тем больше риск overfitting.** Полином степени d при n признаках имеет C(n+d, d) коэффициентов. Если параметров больше, чем точек данных, модель может подогнаться под обучающую выборку *идеально* - а значит, наверняка запомнит шум. Это как выучить ответы на экзамен наизусть вместо понимания материала: сдашь именно этот экзамен, но провалишь любой другой.
**Как бороться с overfitting - 4 основных подхода:** 1. **Больше данных** - чем больше примеров, тем сложнее модели запомнить каждый. Шум в разных точках разный, и модель вынуждена искать закономерность 2. **Регуляризация** (L1, L2) - штраф за слишком большие коэффициенты. Заставляет модель быть "скромнее" (подробно в уроке ml-08) 3. **Уменьшить сложность** - снизить степень полинома, убрать лишние признаки 4. **Cross-validation** - оценивать модель на нескольких разбиениях данных, а не на одном (подробно в уроке ml-44)
Overfitting - не свойство самих данных, а свойство **соотношения между сложностью модели и количеством данных**. Тот же полином степени 15 не переобучится, если в датасете 10 миллионов точек. А линейная модель может переобучиться, при 3 точках и 100 признаках. Правило большого пальца: количество обучающих примеров должно быть в 5-10 раз больше количества параметров модели.
У модели train MSE = 0.02, test MSE = 14.7. Какой наиболее вероятный диагноз?
Underfitting: модель слишком проста
Если overfitting - это "модель запомнила ответы на экзамен", то **underfitting** - это "студент не подготовился и не понимает материал". Модель настолько проста, что не может уловить даже основную закономерность в данных. Результат: плохие предсказания и на обучающих данных, и на тестовых.
Главный диагностический признак underfitting: **и train error, и test error высокие, а разрыв между ними маленький**. Модель не может хорошо описать даже те данные, на которых обучалась. Это значит, что модель слишком *ограничена* для задачи - у неё не хватает "выразительной силы". Прямая линия никогда не станет параболой, сколько бы данных ни было предоставлено.
**Как исправить underfitting:** 1. **Добавить признаки** - полиномиальные, interaction features, domain-specific (если знаете физику задачи) 2. **Увеличить сложность модели** - повысить степень полинома, перейти к более мощной модели (деревья, нейросети) 3. **Уменьшить регуляризацию** - если она слишком сильная, модель может быть искусственно упрощена 4. **Feature engineering** - создать новые признаки, которые лучше описывают задачу **НЕ помогает:** добавить больше данных. Миллион точек не поможет прямой стать параболой. Проблема в архитектуре модели, не в количестве данных.
Между underfitting и overfitting находится **sweet spot** - оптимальная сложность модели. В нашем примере с квадратичными данными: степень 1 - underfitting, степень 2-3 - sweet spot, степень 10+ - overfitting. Поиск этого sweet spot - одна из главных задач ML-инженера, и для этого существуют формальные инструменты: cross-validation и learning curves.
Модель показывает train MSE = 8.4 и test MSE = 8.9. Что из перечисленного НАИМЕНЕЕ вероятно поможет улучшить результат?
Bias-Variance Tradeoff
Underfitting и overfitting - это симптомы. А причина? За ними стоит фундаментальный баланс из двух источников ошибки: **bias** и **variance**. Понимание этого баланса - один из самых важных навыков в ML, потому что он определяет стратегию улучшения любой модели.
**Bias (предвзятость)** - ошибка из-за упрощающих предположений модели. Если истинная зависимость - парабола, а модель ищет прямую, bias будет высоким. Модель *систематически* промахивается, потому что её "мировоззрение" слишком примитивно. Даже бесконечное количество данных не исправит bias - прямая никогда не станет параболой.
**Variance (разброс)** - ошибка из-за чувствительности к конкретной выборке данных. Полином степени 15 на разных случайных подвыборках даст *совершенно разные* кривые - потому что он подстраивается под шум каждой конкретной выборки. Модель "нервная": малейшее изменение в данных меняет предсказания радикально.
**Формула полной ошибки:** Total Error = Bias^2 + Variance + Irreducible Noise - **Bias^2** - квадрат систематической ошибки. Уменьшается при усложнении модели - **Variance** - разброс предсказаний. Увеличивается при усложнении модели - **Irreducible Noise** - шум в самих данных. Не зависит от модели, это наш "потолок" Именно поэтому это *tradeoff*: снижая bias (усложняя модель), мы неизбежно повышаем variance, и наоборот. Цель - найти точку, где сумма Bias^2 + Variance минимальна.
**Learning curves** - ещё один способ диагностики. Если строить график train/test error по мере увеличения количества данных: - **High bias (underfitting):** обе кривые сходятся к высокому уровню ошибки. Больше данных не поможет - нужна более сложная модель. - **High variance (overfitting):** большой gap между кривыми. Больше данных поможет - gap сужается, потому что модели сложнее запомнить шум в большой выборке. Это практически полезно: learning curves подсказывают, стоит ли собирать больше данных или лучше сменить модель.
Чем сложнее модель, тем лучше она работает - нужно просто выбрать полином максимальной степени
Существует оптимальная сложность: слишком простая модель не видит закономерность (underfitting), слишком сложная запоминает шум (overfitting). Лучшая модель балансирует bias и variance
Total error = Bias^2 + Variance + Noise. Усложнение модели снижает bias, но повышает variance. После определённой точки рост variance перевешивает снижение bias, и общая ошибка начинает расти. Поэтому полином степени 2 для квадратичных данных часто лучше, чем полином степени 20 - несмотря на то, что степень 20 даёт нулевой train error
Модель с high variance показывает train error = 0.5 и test error = 12.3. Что из перечисленного с наибольшей вероятностью уменьшит test error?
Ключевые идеи
- **Полиномиальные признаки** превращают линейную регрессию в нелинейную модель: [x] -> [x, x^2, x^3, ...]. Модель остаётся линейной по параметрам - меняется только представление данных
- **Overfitting:** слишком сложная модель запоминает шум. Диагностика: train error маленький, test error огромный, gap большой
- **Underfitting:** слишком простая модель не видит закономерность. Диагностика: и train, и test error высокие, gap маленький
- **Bias-Variance Tradeoff:** Total Error = Bias^2 + Variance + Noise. Усложнение модели снижает bias, но повышает variance - а оптимальная сложность лежит в точке минимума суммы. Именно поэтому полином степени 2 предсказывает эффект лекарства лучше, чем полином степени 20, даже если последний идеально проходит через все обучающие точки
Связанные темы
Полиномиальная регрессия и bias-variance tradeoff тесно связаны с несколькими темами, которые мы разберём дальше:
- Линейная регрессия — Фундамент полиномиальной регрессии - тот же алгоритм, но с расширенным набором признаков
- Регуляризация (Ridge, Lasso) — Главное оружие против overfitting: штраф за большие коэффициенты заставляет модель быть проще, даже если у неё много признаков
- Градиентный спуск — Метод оптимизации, которым обучаются модели - минимизация функции потерь шаг за шагом, включая полиномиальные модели
- Cross-Validation — Надёжный способ оценить модель и выбрать оптимальную сложность (степень полинома), не переобучаясь на тестовых данных
Вопросы для размышления
- При 1000 точках и признаках underfitting: что эффективнее как первый шаг - добавить полиномиальные признаки или собрать больше данных? Как learning curves помогают это определить?
- Для прогноза погоды и для медицинской диагностики - в каком из этих приложений overfitting опаснее underfitting? Чем обусловлена разница в ответах?
- Bias-variance tradeoff предполагает, что одновременно снизить и bias, и variance нельзя. Но deep learning модели с миллиардами параметров показывают низкий bias и низкий variance на больших датасетах. Как это согласуется с теорией?
Связанные уроки
- ml-06-linear-regression — Полиномиальная регрессия - расширение линейной через feature engineering
- ml-08-regularization — Высокая степень полинома ведёт к overfitting - нужна регуляризация
- ml-05-evaluation — Bias-variance tradeoff определяет выбор оптимальной степени
- calc-07-derivative-rules