← Назад к вопросам

Что такое data leakage и как его избежать?

2.2 Middle🔥 191 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Data Leakage: определение и опасность

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

Это одна из самых распространённых ошибок в машинном обучении, которая приводит к переоценке качества моделей и их низкой производительности в продакшене.

Виды утечек данных

1. Утечка через признаки (Feature Leakage)

Это происходит, когда модель использует информацию, которая не будет доступна во время инференса:

# Плохо: признак содержит информацию о целевой переменной
df["days_until_death"] = (df["death_date"] - df["today_date"]).days
# Этот признак идеально коррелирует с целевой переменной (прогнозируем смертность)
# Хорошо: использовать только информацию, известную на момент предсказания
df["age_at_prediction"] = (df["prediction_date"] - df["birth_date"]).days

2. Утечка через статистику (Statistical Leakage)

Применение масштабирования, нормализации или вычисление статистики на всём датасете перед разделением:

# Плохо: статистика рассчитана на всём датасете
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)  # Использует mean и std ВСЕ данных
X_train, X_test = train_test_split(X_scaled)

# Хорошо: разделить сначала, потом масштабировать
X_train, X_test = train_test_split(X)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)  # Только обучающие данные
X_test_scaled = scaler.transform(X_test)  # Transform по статистике X_train

3. Утечка через время (Temporal Leakage)

Викристання данных из будущего при работе с временными рядами:

# Плохо: использование будущих значений для текущего предсказания
df["next_day_volume"] = df["volume"].shift(-1)  # Данные из будущего!

# Хорошо: использовать только исторические данные
df["prev_day_volume"] = df["volume"].shift(1)  # Данные из прошлого

Как избежать утечек

Принцип "Обучение → Валидация → Тест"

Все преобразования данных должны выполняться только на обучающем наборе:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# 1. Разделить данные
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 2. Создать pipeline с преобразованиями
pipeline = Pipeline([
    ("scaler", StandardScaler()),
    ("model", LogisticRegression())
])

# 3. Обучить на train (scaler.fit только на X_train)
pipeline.fit(X_train, y_train)

# 4. Оценить на test (используется скейлер из pipeline)
score = pipeline.score(X_test, y_test)

Мысленная проверка: "Инференс-тест"

Перед использованием признака спроси себя: "Будет ли эта информация доступна в момент предсказания в реальной системе?"

# Признак доступен в инференсе?
df["user_account_age"] = (today - df["account_created"]).days  # ✓ Да
df["future_purchase"] = df["purchase_date"].shift(-7)  # ✗ Нет, это из будущего

Кросс-валидация

Используй CV для надёжной оценки при малых данных:

from sklearn.model_selection import cross_val_score, TimeSeriesSplit

# Для регулярных данных
scores = cross_val_score(pipeline, X, y, cv=5)

# Для временных рядов (важно: тест всегда после обучения по времени)
cv = TimeSeriesSplit(n_splits=5)
scores = cross_val_score(pipeline, X, y, cv=cv)

Выводы

Data leakage — это серьёзная проблема, которая скрывается в деталях. Ключ к её избежанию:

  1. Осознание — понимание, когда информация становится доступной
  2. Строгий порядок — разделить данные → преобразовать обучающие → оценить на тестовых
  3. Автоматизация — использовать Pipeline и CV, чтобы избежать ручных ошибок
  4. Валидация — проверять, что модель работает в реальных условиях, а не только на тестах
Что такое data leakage и как его избежать? | PrepBro