Собесов

alexeygrigorev/data-science-interviews: cross-validation

Статистика и теорверВалидация моделейСредняяMiddle

Условие

Что такое cross-validation? Зачем k-fold лучше одного train/test split? Какие виды CV вы знаете и когда что использовать?

Решение

Подход

Cross-validation — способ оценить, насколько модель обобщается, разбивая данные на несколько train/validation-разбиений и усредняя метрику.

Основные схемы

  • k-fold — делим данные на k равных кусков, k-1 на train, 1 на val; повторяем k раз. Стандартное k = 5 или 10.
  • Stratified k-fold — сохраняет долю классов в каждом фолде. Обязателен на классификации, особенно при дисбалансе.
  • Leave-one-out (LOO) — крайний случай k = n. Дорогой по вычислениям, имеет смысл при очень маленьких выборках.
  • Group k-fold — гарантирует, что записи одной группы (например, одного пользователя) не попадут одновременно в train и в val. Без этого вы получаете утечку и завышенный score.
  • TimeSeriesSplit — для временных рядов: train всегда раньше val по времени. Перемешивать временной ряд нельзя.

Зачем k-fold лучше одного split

  • Один split — это одна точка оценки; повезёт с выборкой — получите завышенный, не повезёт — заниженный результат. k-fold даёт среднее и std.
  • На маленьких выборках случайное разбиение может оставить весь редкий класс в val или train.
from sklearn.model_selection import (
    KFold, StratifiedKFold, GroupKFold, TimeSeriesSplit,
    cross_val_score
)
 
scores = cross_val_score(model, X, y, cv=StratifiedKFold(5), scoring="roc_auc")
print(scores.mean(), scores.std())

Подводные камни

  1. Утечка через препроцессинг: если фитить StandardScaler или SelectKBest на всех данных до split, статистики «подсмотрят» val. Препроцессинг должен жить внутри Pipeline и фититься только на train-фолде.
  2. На временных рядах нельзя shuffle. Использовать TimeSeriesSplit, а не KFold.
  3. На сильно несбалансированных классах без stratify фолд может оказаться без позитивов вообще.
  4. Подбор гиперпараметров и финальная оценка — на разных уровнях. Иначе результат на CV завышен; для честной оценки — nested CV или отдельный hold-out.

Эталонный ответ

Cross-validation — это среднее качества модели по нескольким train/val разбиениям. k-fold даёт стабильную оценку. Используйте Stratified для классификации, Group — когда есть зависимые наблюдения, TimeSeriesSplit — для временных рядов. Препроцессинг — внутри Pipeline, чтобы не было утечки.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти