Что такое data leakage и как его избежать?
Data leakage (утечка данных) — это ситуация, при которой в процессе обучения модели в неё попадает информация, недоступная на этапе предсказания. Эта информация необоснованно улучшает качество модели на обучении или валидации, но приводит к плохой обобщающей способности и обманчивым метрикам. Data leakage — одна из самых опасных и часто встречающихся ошибок в машинном обучении, особенно в задачах с временными рядами, медициной, бизнес-прогнозированием и компьютерным зрением.
1. Типы data leakage
A. Target Leakage (утечка цели)
Это когда в обучающие признаки (features) попадает информация напрямую связанная с целевой переменной (label), которая не будет доступна в реальной жизни.
Примеры:
-
В банковской задаче предсказания дефолта признак был ли долг выплачен не должен участвовать — он уже содержит результат.
-
В медицине признак «назначено химиотерапевтическое лечение» может быть сигналом, что у пациента диагностировали рак.
-
В сегментации изображений использование ground truth маски как признака.
B. Train/Test Contamination
Ситуация, когда данные из тестовой или валидационной выборки случайно или напрямую попадают в тренировочную, или наоборот.
Примеры:
-
Изображения одного и того же пациента оказались и в train, и в val.
-
Применение нормализации (например, StandardScaler) ко всему датасету перед разделением на train/test.
-
Augmentation или обрезки одного и того же изображения в train и test.
C. Temporal Leakage
Использование данных из будущего при обучении модели, которая должна предсказывать на основе прошлого.
Примеры:
-
Предсказание цены акции на основе признаков, рассчитанных с использованием данных из будущего.
-
В задачах временных рядов использование скользящих средних, включающих значения после момента предсказания.
D. Feature Engineering Leakage
Ошибки при создании новых признаков, которые нечаянно используют будущие или зависимые данные.
Примеры:
-
Создание признака: «кол-во покупок за последние 7 дней», где "последние" включают будущее событие.
-
Использование mean target encoding на всём датасете перед разделением.
2. Примеры data leakage в CV (компьютерное зрение)
-
Использование тестовых данных в фазе аугментации или нормализации.
-
Использование изображения и его обрезки (crop) в train и test одновременно.
-
Применение min/max нормализации ко всему датасету перед разделением.
-
В задачах классификации изображений — попадание разных кадров одного видеопотока в train и test.
-
Использование ground truth сегментации в качестве маски входа.
3. Как обнаружить data leakage
A. Подозрительно высокая точность
Если метрики на validation/test подозрительно выше, чем на новых или продакшн-данных, это потенциальный признак утечки.
B. Сравнение метрик
-
Если разница между train и val очень мала, а на реальных данных всё плохо — это симптом утечки.
-
Попробуйте обучить очень простую модель (например, логистическую регрессию). Если она показывает 95–100% точность, стоит проверить данные.
C. Шаг за шагом анализ пайплайна
-
Проверьте порядок трансформаций: сначала разбиение, потом нормализация.
-
Убедитесь, что признаки не используют целевую переменную.
-
Временные данные не должны использовать будущее.
4. Как избежать data leakage
A. Корректное разделение данных
-
Сначала делите на train/val/test, затем делаете любые трансформации.
-
Используйте GroupKFold, если есть связанные группы (например, ID пациента, ID сессии, ID камеры).
-
Для временных рядов — всегда разбивайте по времени: train = [t0, t1], test = [t2], где t2 > t1.
B. Трансформации только на train
Любые действия, зависящие от статистики данных (нормализация, PCA, scaling, target encoding) нужно производить только на train, а затем применять к test.
Пример (sklearn):
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test) # только transform, без fit
C. Разделение по группам
В изображениях: если есть многократные снимки одного объекта, разделяйте по объекту, а не по изображению.
Пример:
- Кадры одного пациента: всё должно быть только в train или только в test.
D. Использование временных срезов
-
Для временных задач используйте только доступные на момент t данные.
-
Например, предсказание отказа техники в 2025-08-01 должно использовать только данные до 2025-07-31.
E. Автоматизированные пайплайны
- Используйте Pipeline из sklearn, tf.data в TensorFlow, или DataModule в PyTorch Lightning — они позволяют чётко разделить стадии препроцессинга.
F. Отдельные списки ID
-
Храните списки ID (например, ID изображений или пациентов), чтобы избежать пересечений.
-
Не используйте random split, если есть групповые зависимости.
5. Case Study — неправильная нормализация
Плохо:
\# Сначала нормализация, потом разделение
X_scaled = scaler.fit_transform(X)
X_train, X_test = train_test_split(X_scaled, test_size=0.2)
Хорошо:
\# Сначала split, потом fit на train
X_train, X_test = train_test_split(X, test_size=0.2)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
6. Data leakage в соревнованиях (например, Kaggle)
-
Случайные лики через файл submission.csv (например, ID с сортировкой)
-
Использование переменных, совпадающих с целевыми
-
Обработка теста вместе с train (например, PCA на всём датасете)
7. Data Leakage через метки
Пример:
В задаче классификации болезней, если в train данных много из одной больницы, а в test из другой, и hospital_id оказался признаком, модель научится ассоциировать больницы с диагнозом, а не признаки пациента.
8. Инструменты и советы
-
sklearn.model_selection.GroupKFold — для разделения по группам
-
Pipeline + ColumnTransformer — позволяет избежать утечки в признаках
-
Детальный логгинг split-а — логируйте, какие ID куда попали
-
Feature importance — если какая-то переменная имеет 99% важности, проверьте, не target ли это замаскированно
Data leakage — это критическая ошибка, способная полностью разрушить доверие к модели. В лучшем случае она приводит к завышенным метрикам, в худшем — к фатальным ошибкам на продакшене. Поэтому грамотное построение пайплайна обработки данных, аккуратное разделение, осознанное feature engineering и понимание сути признаков — основа борьбы с утечками.