🏢 Ситуация
Четверг, 11:00. В канале #ml-alerts тревога: скоринг-модель соседней команды, показавшая на тесте ROC-AUC 0.97, в проде выдаёт 0.61 — хуже, чем старые ручные правила. CTO Виктор требует разбора. Лена назначает вас в инцидент-группу:
«Лучший способ научиться валидации — расследовать чужой фейл. Найди, где именно они себя обманули. Смотри на три вещи: как делили данные, что попало в признаки и когда считались статистики.»
🎯 Ваша задача
- Понять переобучение и недообучение через bias/variance.
- Освоить кросс-валидацию и валидацию по времени.
- Составить каталог утечек данных — и найти утечку в инциденте.
📚 Теория
Переобучение и недообучение
- Недообучение (high bias): модель слишком проста, плоха и на train, и на тесте.
- Переобучение (high variance): модель выучила шум; на train блестяще, на новых данных — провал.
Диагностика по разрыву: train_metric ≫ val_metric → переобучение. Обе низкие → недообучение. Andrew Ng: «Смотрите на train error и val error как врач на два анализа — сочетание говорит о диагнозе».
Лечение переобучения: больше данных, проще модель, регуляризация, early stopping. Лечение недообучения: сложнее модель, лучше признаки, дольше обучение.
Кросс-валидация
Один train/test split — одна случайная оценка. K-fold CV: делим данные на K частей, K раз обучаемся на K−1 частях и валидируемся на оставшейся; усредняем. Получаем оценку и её разброс.
StratifiedKFold— при дисбалансе классов.TimeSeriesSplit/ split по времени — если данные имеют время (почти всегда в бизнесе!). Обучаемся на прошлом, валидируемся на будущем. Случайный сплит транзакций за 2 года = модель «видела будущее».- GroupKFold — если у одного клиента много строк: все строки клиента должны попасть в один фолд, иначе модель узнаёт клиента, а не закономерность.
Каталог утечек данных (выучить наизусть)
- Утечка таргета в признаки: признак — следствие таргета («число звонков коллекторов» для дефолта).
- Утечка через время: признаки/агрегаты посчитаны с использованием будущего (не point-in-time).
- Утечка через препроцессинг: scaler/encoder/imputer обучен на всех данных до сплита.
- Утечка через дубликаты/группы: один клиент и в train, и в test.
- Утечка через отбор признаков: feature selection сделан на всех данных, потом «честная» CV.
Симптом всех утечек одинаков: подозрительно высокая метрика офлайн и провал в проде.