Утечка данных в модели временных рядов: как ошибка ресемплинга дала 3.5‑часовой форвард
Из‑за некорректного ресемплинга 4‑часовых свечей модель «заглянула» в будущее на 3.5 часа, что привело к утечке. В статье раскрывается, как обнаружили проблему, и предлагается код защиты от подобных ошибок.
Что случилось
Исследователи обнаружили, что их модель прогнозирования временных рядов «заглядывала» в будущее на 3,5 часа. Причина – неверный ресемплинг 4‑часовых свечей, из‑за которого часть будущих меток попала в обучающий набор.
Как была выявлена утечка
- Аномальное качество: модель показывала подозрительно высокие метрики на валидации, но резко падала на реальном тесте.
- Позиционный тест: авторы построили простой тест, сравнивающий порядок появления меток в обучающем и тестовом наборе. При обнаружении «пересечения» – сигнал о возможной утечке.
- Визуальный аудит: графики распределения меток подтвердили, что часть будущих точек попадает в обучающий набор.
Математика позиционного теста
Тест основан на расчёте Kendall’s τ между индексами меток в обучающем и тестовом наборе. Если τ > 0.3, считается, что утечка вероятна. Формула проста и быстро вычисляется даже на больших датасетах.
Защита от подобных ошибок
import pandas as pd
from scipy.stats import kendalltau
def detect_leakage(train_df, test_df, time_col='timestamp'):
# сортируем по времени
train_sorted = train_df.sort_values(time_col)
test_sorted = test_df.sort_values(time_col)
# получаем позиции
train_pos = pd.Series(range(len(train_sorted)), index=train_sorted[time_col])
test_pos = pd.Series(range(len(test_sorted)), index=test_sorted[time_col])
# объединяем по времени
common = train_pos.index.intersection(test_pos.index)
if len(common) < 2:
return False
tau, _ = kendalltau(train_pos[common], test_pos[common])
return tau > 0.3
Код проверяет совпадения временных меток и выдаёт предупреждение, если корреляция слишком высока.
Что дальше
Авторы советуют проводить позиционный аудит на каждом этапе подготовки данных и использовать строгий ресемплинг, например, pd.Grouper(freq='4H', label='right', closed='right'), чтобы исключить «перетекание» будущих точек.
Статья полностью доступна на Habr ML.
Для разработчиков моделей временных рядов эта находка – предупреждение: даже небольшие ошибки в ресемплинге могут привести к серьёзной утечке. Позиционный тест – дешёвый и быстрый способ обнаружить проблему до продакшна. Внедрите автоматический чек в пайплайн, иначе рискуете получить иллюзорно хорошие метрики и потерять доверие заказчиков.


