Восемь фильтров между сырыми данными и обучением модели: практический гайд по валидации датасетов
Даже безупречный алгоритм не спасет модель от катастрофических ошибок, если входящие данные содержат информацию из будущего или нарушены семантические контракты. Одна пропущенная проверка качества может поднять метрики на тестовой выборке и обрушить эффективность в продакшене. В этой статье рассматривается алгоритмизированный подход к валидации данных, включающий проверку целостности схемы, устранение утечек таргета и корректность временных срезов.

# Восемь фильтров между сырыми данными и обучением модели
В разработке систем машинного обучения часто происходит классическая ситуация: на отложенной выборке модель показываетROC-AUC 0.94, все команды празднуют успех, а через две недели после выхода в продакшен метрики падают до 0.71. Причиной такого расхождения редко бывает ошибка в коде модели или гиперпараметрах. Чаще всего проблема кроется в данных: в обучающую выборку попал признак, который в момент фактического предсказания еще не существовал, или метка была размечена с задержкой, которой не учитывался алгоритм.
Этот текст описывает практический набор из восьми проверок, необходимых перед вызовом model.fit(). Цель — превратить процесс подготовки данных из «черного ящика» в прозрачный пайплайн с четко фиксированными артефактами и понятными рисками.
Почему валидация важнее обучения
Пренебрежение качеством данных стоит дорого. Яркий пример — компания Unity в начале 2022 года. Из-за ошибок в платформе и попадания некорректных данных от крупного клиента эффективность рекламного инструмента Audience Pinpointer упала, а выручка компании существенно снизилась. Общий ущерб менеджмент оценил в 110 миллионов долларов. Важно отметить: никто не «сломал» код. Пайплайн работал корректно, обучаясь на данных, которые все считали валидными, но которые на самом деле утратили свою семантику.
В контексте финтеха и e-commerce типичной задачей является бинарная классификация с сильным дисбалансом классов (например, реальная доля мошенничества может составлять 0,3%). В таких условиях стандартная метрика точности (accuracy) становится бессмысленной: модель, которая всегда предсказывает «не мошенник», будет иметь точность 99,7%, но окажется полностью непригодной для бизнеса. Ключевыми становятся PR-AUC и бизнес-метрики на рабочих точках, такие как Recall при фиксированном уровне ложных срабатываний.
«Гранулярность — это принцип, согласно которому одна строка в датасете должна соответствовать ровно одному значимому событию (например, одной транзакции).»
1. Контракт схемы и целостность данных
Первым этапом проверки является декларативное объявление схемы данных. Использование инструментов вроде pandera позволяет валидировать типы данных, уникальность ключей и диапазоны значений до начала любого преобразования. Если колонка исчезла или изменила тип, это не должно вызывать молчаливое приведение к NaN, а должно вызывать сбой сборки пайплайна.
* Что проверяем: уникальность transaction_id, отсутствие пропусков в обязательных полях (client_id, event_ts), валидность диапазонов (например, amount >= 0) и перечисленных значений (channel входит в список {web, mobile, pos}). * Зеленый сигнал: контракт валидируется на каждой новой партиции данных, а исторические инциденты закреплены в качестве регрессионных тестов.
2. Гранулярность и дубликаты
Следующий риск — нарушение гранулярности. Часто ключ для группировки выбирают неправильно, используя пару «клиент + время», когда естественным ключом должна быть сама транзакция. Если две легитимные операции одного клиента произошли в одну миллисекунду, некорректный ключ может привести к их слиянию или созданию дублей, что исказит статистику.
Также необходимо проверить пересечение обучающей и тестовой выборок. Если ключ дублируется между тренировкой и валидацией, модель может просто запомнить конкретные строки, а не выучить закономерности, что приведет к завышенным метрикам.
* Что проверяем: уникальность идентификатора транзакции, отсутствие полных дублей строк и отсутствие пересечения transaction_id между train и test. * Зеленый сигнал: правило гранулярности зафиксировано документально как «одна строка = одна транзакция», а стратегия сплита обоснована постановкой задачи.
3. Целостность и зрелость таргета
В антифрод-системах метка (is_fraud) формируется не мгновенно. Между транзакцией и подтвержденным мошенничеством (или отсутствием его) может проходить от 30 до 90 дней. Строки, созданные недавно, могут иметь метку «0» (честная), пока проверка не завершится. Если такие «незрелые» строки попадут в обучающую выборку, модель будет обучаться на ложных отрицательных результатах.
Кроме того, при сильном дисбалансе классов нужно смотреть не только на ROC-AUC, но и на PR-AUC, так как модель может быть смещена в сторону предсказания мажоритарного класса.
* Что проверяем: долю «незрелых» строк, где событие еще не закроется в течение определенного окна (например, 60 дней), и стабильность распределения классов. * Зеленый сигнал: известно процентное соотношение классов, выбрана метрика на рабочей точке, а окно вызревания отсчитывается строго от даты сборки датасета.
4. Утечка таргета (Target Leakage)
Это одна из самых коварных проблем. Она возникает, когда в датасет попадает признак, известный системе только после момента предсказания. Классический пример — поле manual_review_result, которое оператор заполняет в течение суток после того, как транзакция ушла на ручной разбор. Если этот признак доступен в обучающей выборке, но отсутствует в продакшене (так как решение принимается до разбора), модель получит ложно завышенный результат на тестах (0.94), но покажет реальные цифры в боевом трафике (0.86).
Защита от этого дефекта лежит не столько в коде, сколько в контракте доступности каждого признака: его значение должно быть известно до момента предсказания (feature_available_at <= prediction_time).
* Что проверяем: для каждого признака определяется время, когда он становится известен системе относительно момента предсказания. * Зеленый сигнал: в описании датасета для каждого признака указано время его доступности.
5. Point-in-time корректность и временной сплит
Ошибка возникает, если признаки рассчитываются с использованием агрегатов, которые «заглядывают в будущее». Например, если для вычисления «среднего чека за 7 дней» используется простое скользящее окно без учета временной метки поступления данных, признак может оказаться некорректным.
Правильный подход — использование as-of join, который гарантирует, что в момент расчета признака учитываются только те события, которые поступили в систему строго до момента расчета. Простая сортировка и сдвиг (shift) часто не учитывают причинно-следственные связи событий, происходящих в одну и ту же миллисекунду.
* Что проверяем: временной сплит (train/test по дате), воспроизводящий условия продакшена, и отсутствие агрегатов, использующих будущие данные. * Зеленый сигнал: сплит воспроизводит сценарий использования модели, а расхождение между временным и случайным сплитом обосновано.
6. Пропуски и значения-заглушки
Числа вроде -1, 9999 или дата 1970-01-01 часто используются как заглушки для пропущенных значений. Однако, если их не обработать явно, модель интерпретирует их как реальные данные и выучит, что, например, возраст -1 коррелирует с мошенничеством.
Список заглушек должен быть поколоночным и согласованным со схемой. Глобальный список всех возможных значений — плохая практика, так как ноль в поле amount является легитимным.
* Что проверяем: наличие значений-заглушек, которые формально не являются NaN, и их доля. * Зеленый сигнал: для каждой колонки с пропусками записано, чем её закрывать и почему медиана «по умолчанию» не является решением.
7. Категории: кардинальность и новизна
Категориальные признаки требуют особого внимания к их уникальности. Большое количество уникальных значений (высокая кардинальность) не всегда является ошибкой, но оно создает риски при инференсе. Если в тестовой выборке или продакшене появятся категории, не встречавшиеся при обучении, модель может упасть или вернуть некорректный результат, если не предусмотрена политика для неизвестных значений (unseen).
* Что проверяем: количество уникальных значений относительно размера выборки и наличие новых категорий в тестовой выборке. * Зеленый сигнал: политика обработки неизвестных категорий выбрана до начала обучения (например, отдельный бакинг или отсечение редких значений).
8. Фиксация артефактов и манифест
Последний, но не менее важный шаг — обеспечение воспроизводимости. Живые витрины данных меняются: вчерашний срез сегодня уже другой. Чтобы коллега мог воспроизвести ваши метрики, необходимо зафиксировать не только файл данных, но и весь контекст сборки: хэш файла, версию схемы, код пайплайна, SQL-запрос и окружение.
Манифест должен содержать адреса и хэши всех артефактов, участвовавших в сборке. Это доказывает, что результат получен именно с теми данными, на которые вы ссылаетесь.
* Что проверяем: наличие хэша файла данных, хэша кода пайплайна и версии окружения. * Зеленый сигнал: коллега способен воспроизвести метрику по манифесту, который адресует все необходимые артефакты.
Заключение
Подход к валидации датасета должен быть системным. Эти восемь проверок формируют барьеры, предотвращающие попадание «грязных» данных в процесс обучения. Они переводят ответственность за качество данных от моделиста к инженеру и аналитику, обеспечивая стабильность и предсказуемость работы AI-систем.
*Автор статьи, Сергей Прощаев, Tech Lead в FinTech & E‑commerce, делится опытом, основанным на работе с реальными антифрод- и скоринговыми моделями.*