Что такое CV-leak и какие источники бывают?
Answer from AI
sobes.tech AI
Что хотят услышать интервьюеры:
CV-leak — это утечка информации из валидации в обучение, из-за которой оценка модели на кросс-валидации становится завышенной и не отражает качество на новых данных. Важно понимать, что leak может возникать не только из-за явной ошибки в разбиении, но и из-за неверно построенного пайплайна. Хороший ответ должен показать знание типовых источников утечки в табличных задачах и умение их предотвращать.
Определение:
CV-leak, или cross-validation leakage, — это ситуация, когда при кросс-валидации в обучающий процесс попадает информация, которая в реальной задаче недоступна на момент предсказания. В результате модель или вся схема оценки «подсматривает» в валидацию, и метрика получается слишком оптимистичной.
Источник утечки может быть на уровне данных, препроцессинга, feature engineering, target encoding, подбора гиперпараметров или повторного использования валидационных фолдов для принятия решений.
Пример использования:
Типичный случай в tabular/boosting-задачах — target encoding посчитан по всему датасету до разбиения на фолды. Тогда значение признака для объекта частично зависит от его собственной целевой переменной и от целевых переменных объектов из валидации, что искажает CV.
Другой пример — нормализация, отбор признаков или вычисление агрегатов выполнены на всём датасете до split, а не внутри каждого train-fold.
# Неправильно: преобразование сделано до кросс-валидации
X_encoded = target_encode(X, y) # использует весь y, включая будущую валидацию
scores = cross_val_score(model, X_encoded, y, cv=5)
Правильный подход — считать такие преобразования только на train-fold и применять к val-fold в рамках каждого фолда.
for train_idx, val_idx in cv.split(X, y):
X_tr, X_val = X.iloc[train_idx], X.iloc[val_idx]
y_tr, y_val = y.iloc[train_idx], y.iloc[val_idx]
encoder.fit(X_tr, y_tr)
X_tr_enc = encoder.transform(X_tr)
X_val_enc = encoder.transform(X_val)
model.fit(X_tr_enc, y_tr)
pred = model.predict(X_val_enc)
Пояснение кода:
В первом фрагменте target encoding обучается на полном наборе данных, поэтому каждый фолд косвенно использует информацию о себе через статистики по y. Это и есть утечка, которая делает CV-метрику слишком хорошей.
Во втором фрагменте на каждом фолде сначала выделяется train и validation. Затем энкодер обучается только на train, после чего тем же преобразованием обрабатывается val. Так имитируется реальный сценарий, где будущие данные неизвестны.
Код не требуется для всех источников утечки, но на собеседовании важно уметь разложить пример по шагам: где именно происходит подготовка данных, на каких объектах она считается и почему это нарушает честность оценки.
Ключевые моменты:
- CV-leak завышает метрики и создаёт ложное ощущение качества модели.
- Самые частые источники: preprocessing до split, target encoding, feature selection, агрегации по всему датасету, time leakage, неправильный grouping.
- Любые операции, использующие статистику данных, нужно выполнять внутри фолда только на train-part.
- Для табличных задач особенно опасны encoding по целевой, глобальные mean/median/imputation и подбор признаков по всей выборке.
- Временные ряды требуют строгого разделения по времени; случайный CV там часто даёт leakage.
- Утечка может быть не только в данных, но и в процессе выбора модели, если решения принимаются по одному и тому же CV без отдельного holdout.