Валидация и переобучение
Разбираемся с train/val/test split, кросс-валидацией и как бороться с переобучением.
Зачем нужна валидация
Вы обучили модель, она идеально предсказывает на обучающих данных. Но на новых данных — мусор. Знакомая ситуация? Это переобучение — главная ловушка в ML. Валидация — набор техник, которые помогают обнаружить эту проблему до того, как модель попадёт в продакшен.
Переобучение и недообучение
Overfitting (переобучение) — модель «запомнила» обучающую выборку, включая шум и случайные закономерности. На обучении всё отлично, на новых данных — плохо. Признак: train loss ↓↓, val loss ↑.
Underfitting (недообучение) — модель слишком простая, она не может уловить реальные закономерности. Плохо и на обучении, и на тесте. Признак: train loss ↑, val loss ↑.
- Underfitting: линейная регрессия на нелинейных данных — модель «не дотягивает»
- Overfitting: полином 100-й степени на 10 точках — модель «проходит через каждую точку», но бесполезна для предсказания
- Золотая середина: модель достаточно сложная, чтобы уловить паттерны, но достаточно простая, чтобы не запоминать шум
Bias-Variance Tradeoff
Ошибку модели можно разложить на три компоненты:
Разложение ошибки модели
- 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)
L2 штрафует квадрат весов — все веса уменьшаются, но не обнуляются
L1-регуляризация (Lasso)
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 до любой обработки данных
Материалы
Официальная документация по кросс-валидации в sklearn
Наглядное объяснение Bias-Variance tradeoff
Раздел про валидацию и переобучение
Практическое руководство по кросс-валидации на Kaggle