Переобучение — это когда модель отлично работает на данных, на которых училась, и разваливается на новых. Она не выучила закономерность, а вызубрила обучающую выборку вместе со случайным шумом. Главный признак — большой разрыв между качеством на обучении и на отложенной проверке. Разберу, откуда это берётся, как поймать и чем лечить, без формул и на языке аналитика.
Что такое переобучение простыми словами?
Представьте студента, который вместо понимания темы вызубрил ответы к конкретным билетам. На знакомых вопросах он блистает, а стоит переформулировать — плывёт. Модель ведёт себя так же: если она слишком сложная относительно объёма данных, она подгоняется под каждую точку обучающей выборки, включая случайные выбросы, и теряет способность обобщать.
Обратная крайность — недообучение (underfitting): модель слишком простая и не улавливает даже реальную закономерность. Хорошая модель живёт между этими полюсами. Это и есть классический компромисс смещения и разброса (bias-variance tradeoff): простые модели ошибаются систематически, сложные — нестабильно реагируют на шум.
По каким признакам видно переобучение?
Самый надёжный сигнал — разрыв метрик. Вы считаете качество отдельно на обучающей выборке и на отложенной (той, что модель не видела). Если на обучении точность 0.98, а на проверке 0.72 — это учебниковое переобучение. Модель запомнила train и не переносит знание на test.
Второй признак виден на кривых обучения: с ростом сложности (или числа итераций) ошибка на обучении продолжает падать, а на валидации сначала падает, потом разворачивается и начинает расти. Точка разворота — момент, когда модель перестала учиться закономерности и начала заучивать шум.
Третий, более прикладной сигнал — модель «слишком хороша, чтобы быть правдой». Если на реальной бизнес-задаче вроде прогноза оттока вы вдруг получаете почти идеальное качество, первым делом ищите утечку данных, а не радуйтесь. Про метрики, по которым это ловят, я писал в разборе precision, recall и F1.
Откуда берётся переобучение?
Причин несколько, и обычно они складываются. Первая — слишком сложная модель на маленьких данных: глубокое дерево или бустинг с тысячами деревьев на паре тысяч строк запомнит их наизусть. Вторая — мало данных в принципе: чем меньше выборка, тем легче подогнаться под её случайности. Третья — слишком много признаков, особенно шумных или почти дублирующих друг друга.
Отдельная, самая коварная причина — утечка данных (data leakage), когда в признаки просачивается информация, которой на момент предсказания ещё не будет. Классика: посчитали среднее по таргету на всей выборке до разбиения, или взяли признак, который сам является следствием таргета. Модель показывает фантастику на валидации и проваливается в проде. Про утечку подробно — в разборе feature engineering.
Как правильно разбить данные, чтобы поймать переобучение?
Минимум — три части: train (учим), validation (подбираем гиперпараметры), test (финальная честная оценка, трогаем один раз в самом конце). Если подбирать параметры прямо на test, вы незаметно подгоняетесь и под него — и снова обманываете себя.
Надёжнее, чем один сплит, — кросс-валидация: данные делят на k частей, по очереди учат на k−1 частях и проверяют на оставшейся, метрики усредняют. Так оценка качества устойчива и не зависит от того, какие именно строки случайно попали в проверку. Важные детали: для дисбаланса классов берут стратифицированный вариант, а для временных рядов — специальный, который никогда не учится на будущем и не проверяется на прошлом. Разбор целиком — в статье про кросс-валидацию.
Как бороться с переобучением?
Рабочих рычагов несколько, и обычно комбинируют:
- Больше данных. Самое честное лекарство: чем больше выборка, тем сложнее подогнаться под её случайности. Не всегда доступно, но всегда помогает.
- Упростить модель. Ограничить глубину дерева, число деревьев, степень полинома. Меньше свободы — меньше шансов заучить шум.
- Регуляризация. Штраф за сложность в функцию потерь: L1 (Lasso, заодно обнуляет ненужные признаки) и L2 (Ridge, сжимает коэффициенты). Модель стимулируют быть проще.
- Ранняя остановка (early stopping). Для итеративных моделей — прекратить обучение в точке, где ошибка на валидации перестала падать, не дожидаясь, пока она развернётся вверх.
- Отбор и чистка признаков. Убрать шумные, дублирующие, «протекающие» фичи. Меньше лишнего входа — меньше поводов переобучиться.
- Ансамбли и dropout. Случайный лес усредняет много деревьев и снижает разброс; в нейросетях dropout случайно выключает нейроны, мешая заучиванию.
Я держу простой порядок действий: сначала честное разбиение и кросс-валидация, чтобы вообще увидеть проблему; потом упрощение модели и регуляризация; и всё это время — охота на утечку данных, потому что она обесценивает любые метрики.
Чем переобучение отличается от утечки данных?
Их часто путают, а лечатся они по-разному. Переобучение — модель слишком хорошо запомнила обучающую выборку, и на честной валидации это сразу видно как разрыв метрик. Утечка данных — в признаки попала запрещённая информация, и тогда даже валидация врёт: качество завышено везде, а провал случается только в реальном проде.
Практическое отличие: переобучение чинится валидацией и упрощением модели, а утечку валидация не ловит — её надо искать головой, проверяя каждый признак вопросом «а был бы он доступен в этот момент времени в реальности?». Если модель подозрительно хороша, я всегда сначала исключаю утечку и только потом думаю про сложность.
Отработать эти вещи руками полезнее, чем читать: в Python-тренажёре можно покрутить модели на живых данных, а связанные вопросы по ML и статистике с разбором собраны в банке вопросов.