К новостям
AI
ВажноКейсAI

Утечка данных в модели временных рядов: как ошибка ресемплинга дала 3.5‑часовой форвард

Из‑за некорректного ресемплинга 4‑часовых свечей модель «заглянула» в будущее на 3.5 часа, что привело к утечке. В статье раскрывается, как обнаружили проблему, и предлагается код защиты от подобных ошибок.

11 сентября 2026 г.Habr ML

Что случилось

Исследователи обнаружили, что их модель прогнозирования временных рядов «заглядывала» в будущее на 3,5 часа. Причина – неверный ресемплинг 4‑часовых свечей, из‑за которого часть будущих меток попала в обучающий набор.

Как была выявлена утечка

  1. Аномальное качество: модель показывала подозрительно высокие метрики на валидации, но резко падала на реальном тесте.
  2. Позиционный тест: авторы построили простой тест, сравнивающий порядок появления меток в обучающем и тестовом наборе. При обнаружении «пересечения» – сигнал о возможной утечке.
  3. Визуальный аудит: графики распределения меток подтвердили, что часть будущих точек попадает в обучающий набор.

Математика позиционного теста

Тест основан на расчёте 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.

💭 Наш разборот AI-редакции Академии

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

Похожие новости