Обязательно

Валидация и переобучение

Разбираемся с train/val/test split, кросс-валидацией и как бороться с переобучением.

Время изучения: 20 мин

Зачем нужна валидация

Вы обучили модель, она идеально предсказывает на обучающих данных. Но на новых данных — мусор. Знакомая ситуация? Это переобучение — главная ловушка в ML. Валидация — набор техник, которые помогают обнаружить эту проблему до того, как модель попадёт в продакшен.

Переобучение и недообучение

Overfitting (переобучение) — модель «запомнила» обучающую выборку, включая шум и случайные закономерности. На обучении всё отлично, на новых данных — плохо. Признак: train loss ↓↓, val loss ↑.

Underfitting (недообучение) — модель слишком простая, она не может уловить реальные закономерности. Плохо и на обучении, и на тесте. Признак: train loss ↑, val loss ↑.

  • Underfitting: линейная регрессия на нелинейных данных — модель «не дотягивает»
  • Overfitting: полином 100-й степени на 10 точках — модель «проходит через каждую точку», но бесполезна для предсказания
  • Золотая середина: модель достаточно сложная, чтобы уловить паттерны, но достаточно простая, чтобы не запоминать шум

Bias-Variance Tradeoff

Ошибку модели можно разложить на три компоненты:

Error=Bias2+Variance+Noise\text{Error} = \text{Bias}^2 + \text{Variance} + \text{Noise}

Разложение ошибки модели

  • Bias (смещение) — систематическая ошибка модели. Высокий bias → модель слишком простая, не может уловить закономерности → underfitting
  • Variance (разброс) — насколько сильно меняются предсказания при обучении на разных подвыборках. Высокая variance → модель слишком чувствительна к данным → overfitting
  • Noise — неустранимый шум в данных, на него повлиять нельзя

Суть трейдоффа: увеличивая сложность модели, мы уменьшаем bias, но увеличиваем variance (и наоборот). Задача — найти баланс, минимизирующий суммарную ошибку.

Train/Test Split

Почему нельзя оценивать модель на тех же данных, на которых она обучалась? Потому что модель «видела» эти примеры — она может просто запомнить их. Нам же важно, как она работает на новых, невиданных данных.

Решение: делим данные на train (обучение) и test (оценка). Обычное соотношение — 80/20 или 70/30. Модель обучается только на train, а качество измеряем только на test.

Train/Val/Test Split

Проблема: мы подбираем гиперпараметры (глубину дерева, learning rate, число эпох), оценивая их на test. Но тогда test перестаёт быть «невиданным» — мы неявно подстраиваемся под него!

Решение: делим данные на три части. Train — обучаем модель. Validation — подбираем гиперпараметры. Test — финальная оценка, трогаем только один раз в конце.

  • Train (~60-70%) — обучение модели
  • Validation (~15-20%) — подбор гиперпараметров, выбор лучшей модели
  • Test (~15-20%) — финальная оценка, не трогаем до самого конца

Почему нельзя подбирать гиперпараметры на тестовой выборке?

Если вы подбираете гиперпараметры на test — вы «подсматриваете» в ответы. Test перестаёт быть объективной оценкой. Метрики на test будут оптимистично завышены, а в продакшене модель покажет себя хуже. Для подбора гиперпараметров всегда используйте validation или кросс-валидацию.

Кросс-валидация

Проблема train/val split: один фиксированный validation может быть «неудачным» — особенно при малом объёме данных. Кросс-валидация решает это — каждый пример побывает и в train, и в val.

K-Fold Cross-Validation

Делим данные на K частей (folds). K раз обучаем модель: каждый раз одна часть — валидация, остальные K-1 — обучение. Итоговая метрика — среднее по K запускам.

  • K=5 или K=10 — стандартный выбор
  • Плюс: используем все данные и для обучения, и для валидации
  • Минус: обучаем K моделей вместо одной — дороже по времени

Stratified K-Fold

В задачах классификации (особенно с дисбалансом) важно, чтобы в каждом фолде было одинаковое соотношение классов. Stratified K-Fold делает именно это — стратифицирует разбиение по целевой переменной.

Leave-One-Out (LOO)

Экстремальный случай: K = N (число объектов). Каждый раз оставляем один объект для валидации, обучаем на всех остальных. Даёт минимальный bias, но максимальную variance и очень дорого вычислительно. Используется при очень малых выборках.

Регуляризация — борьба с переобучением

Регуляризация штрафует модель за сложность — добавляет к функции потерь слагаемое, зависящее от весов модели. Чем больше веса — тем больше штраф. Это не даёт модели «запоминать» шум.

L2-регуляризация (Ridge)

Lridge=Lbase+λjwj2L_{\text{ridge}} = L_{\text{base}} + \lambda \sum_{j} w_j^2

L2 штрафует квадрат весов — все веса уменьшаются, но не обнуляются

L1-регуляризация (Lasso)

Llasso=Lbase+λjwjL_{\text{lasso}} = L_{\text{base}} + \lambda \sum_{j} |w_j|

L1 штрафует модуль весов — часть весов обнуляется → встроенный отбор признаков

λ (лямбда) — гиперпараметр, контролирующий силу регуляризации. Маленький λ — почти без регуляризации, большой λ — модель «зажата» и может недообучиться.

Другие методы борьбы с переобучением

Early Stopping

Следим за loss на валидации во время обучения. Когда val loss перестаёт уменьшаться (или начинает расти) — останавливаем обучение. Простой и эффективный приём, особенно для нейросетей и бустинга.

Dropout

Во время обучения нейросети случайно «выключаем» часть нейронов (обычно 20-50%). Это не даёт сети полагаться на конкретные нейроны и заставляет учить более робастные признаки. На инференсе dropout отключается.

На собесе: что такое data leakage и как его избежать?

Data leakage — утечка информации из теста/будущего в обучение. Примеры: (1) нормализация по всему датасету до split — стандартное отклонение «знает» тестовые данные; (2) использование будущих данных для предсказания прошлого (temporal leakage); (3) дубликаты в train и test. Как избежать: сначала split, потом всё остальное (нормализация, feature engineering). Для временных рядов — только split по времени.

Итого

  • Overfitting = модель запомнила шум, underfitting = модель слишком простая
  • Bias-Variance tradeoff: сложность модели ↑ → bias ↓, variance ↑
  • Train/Test split — минимум для оценки. Train/Val/Test — для подбора гиперпараметров
  • Кросс-валидация (K-Fold) — надёжнее одного split, особенно при малых данных
  • Регуляризация (L1, L2), early stopping, dropout — инструменты борьбы с переобучением
  • Data leakage — коварная проблема, всегда делайте split до любой обработки данных