Data Leakage
Утечка данных приводит к попаданию в обучение или оценку информации, недоступной во время предсказания, завышая метрики, которые не подтверждаются в рабочей среде. Разбираем причины и способы устранения.
Утечка данных в машинном обучении (ML) возникает, когда обучающие данные или оценка модели содержат информацию, недоступную ей при реальных прогнозах, например примеры из тестовой выборки, сведения из будущего или признаки, кодирующие ответ. На этапе разработки модель кажется точной и хорошо проходит тестирование модели, но в production показывает худшие результаты, потому что использованный ею обходной путь больше недоступен. Утечки — одна из главных причин невоспроизводимых результатов: в обзоре научных исследований с применением машинного обучения были выявлены 294 затронутые публикации в 17 областях. А в прогнозировании гражданских войн после устранения утечки сложные модели утратили заявленное преимущество перед логистической регрессией, появившейся десятилетия назад.
Как происходит утечка данных#
Утечка возникает из-за способа разделения или обработки данных либо выбора входных признаков. Одни и те же ошибки встречаются в моделях для таблиц, анализе временных рядов и задачах компьютерного зрения, например распознавании действий:
- Пересечение обучающих и тестовых данных: Этапы, обучаемые на данных, например расчёт статистик нормализации, заполнение пропусков или отбор признаков, выполняются на всём наборе данных до разделения. В результате обучающие данные содержат информацию о выборке для оценки. Так же влияют дубли изображений и их аугментированные копии, созданные до разделения.
- Утечка между группами: Связанные образцы попадают в разные выборки, например соседние кадры одного видео, несколько снимков одного пациента или фотографии одной сцены. Тогда модель может получить высокий результат, распознавая сцену или человека вместо изучения самой задачи.
- Утечка из будущего: При случайном разделении упорядоченных по времени данных или расчёте признаков с использованием значений, полученных после момента прогноза, модель заглядывает в будущее.
- Утечка целевой переменной: входной признак является следствием целевой переменной или её косвенным показателем, например поле «получал лечение» в модели прогнозирования заболевания.
- Повторное использование оценки: настройка по тестовой выборке или присутствие вопросов бенчмарка в обучающих данных крупной языковой модели, собранных из интернета, превращает оценку в сигнал для обучения.
Целевая переменная может утекать и через изображения. В наборе данных ChestX-ray14 на 80% рентгеновских снимков пневмоторакса из тестовой выборки также виден дренаж грудной клетки — трубка для лечения этого состояния. Классификатор, обученный на этом наборе, показал AUC ROC 0.94 на снимках с дренажом и только 0.77 на снимках без него, то есть в случаях без лечения, которые детектор и должен выявлять.
Демонстрация утечки в коде#
Обучение этапа, зависящего от данных, до перекрёстной проверки — классическая ошибка, эффект которой легко измерить. В примере ниже генерируется чистый шум, поэтому ни одна модель не может добиться точности выше 50% на новых данных. Затем отбираются 20 признаков, лучше всего разделяющих метки, и дважды выполняется перекрёстная проверка логистической регрессии: сначала отбор обучается на всех образцах, затем — внутри конвейера scikit-learn, который заново обучает его на каждой обучающей части.
import numpy as np
from sklearn.feature_selection import SelectKBest
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import make_pipeline
# Pure noise: 100 samples, 5,000 random features, random labels (true accuracy is 50%)
rng = np.random.default_rng(0)
X = rng.normal(size=(100, 5000))
y = rng.integers(0, 2, size=100)
# Leaky: pick the 20 features that best separate the labels using every sample, then cross-validate
X_selected = SelectKBest(k=20).fit_transform(X, y)
leaky = cross_val_score(LogisticRegression(), X_selected, y, cv=5).mean()
# Correct: feature selection is refit inside each training fold
pipeline = make_pipeline(SelectKBest(k=20), LogisticRegression())
clean = cross_val_score(pipeline, X, y, cv=5).mean()
print(f"Leaky CV accuracy: {leaky:.2f}, correct CV accuracy: {clean:.2f}")В версии с утечкой точность на случайных метках составляет 85%, а в конвейере — 48%, то есть соответствует случайному угадыванию. При 5000 признаков и 100 образцах некоторые признаки случайно коррелируют с метками. Если выбирать их с учётом частей для проверки, эта случайность отражается на оценке каждого разбиения.
Как предотвратить утечку данных#
Профилактика начинается с разделения данных: его проводят до любого этапа, обучаемого на данных, чтобы выборки для валидации и тестирования оставались неиспользованными:
- Выполняй разделение до проектирования признаков: обучай масштабировщики, заполнители пропусков, кодировщики и селекторы признаков только на обучающей выборке, а затем без изменений применяй их к остальным выборкам.
- Разделяй данные по группам или времени: помещай все образцы одного пациента, видео или сцены в одну выборку; для проверки на будущих данных обучай модель на прошлом.
- Удаляй дубли с помощью хешей и эмбеддингов: до обучения сравнивай хеши файлов, чтобы найти точные копии, и сходство эмбеддингов, чтобы выявить почти дублирующиеся данные между выборками.
- Проверяй входные данные: выясняй, доступен ли каждый признак в момент прогноза, и рассматривай отдельный доминирующий признак или подозрительно высокий результат как ошибку, требующую проверки.
Утечка также искажает выбор контрольной точки. Ultralytics YOLO обучается на изображениях train, указанных в файле YAML набора данных, и сохраняет best.pt из эпохи с наивысшим показателем качества на валидации — для обнаружения это mAP50-95. Поэтому почти дублирующиеся кадры, одновременно попавшие в train и val, завышают и оценку, по которой выбирается контрольная точка, и публикуемую оценку.
Утечка данных и смежные понятия#
- Переобучение: модель запоминает шум в корректных обучающих данных и показывает низкий результат на чистой валидационной выборке. Из-за утечки сама оценка на валидации становится неверной, и поэтому переобученная модель может казаться эффективной.
- Обучение на несущественных признаках: модель полагается на случайный сигнал, например водяной знак или фон, коррелирующий с меткой. Утечка возникает, когда этот сигнал попадает в обучающие или оценочные данные из источника, недоступного при эксплуатации модели.
- Безопасность данных: в кибербезопасности утечкой данных называют раскрытие конфиденциальной информации неавторизованным лицам. От этого защищают средства контроля доступа, шифрование и предотвращение утечек данных. Эти два значения связаны только общим названием.










