Условие
Что такое 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())Подводные камни
- Утечка через препроцессинг: если фитить
StandardScalerилиSelectKBestна всех данных до split, статистики «подсмотрят» val. Препроцессинг должен жить внутриPipelineи фититься только на train-фолде. - На временных рядах нельзя shuffle. Использовать
TimeSeriesSplit, а неKFold. - На сильно несбалансированных классах без stratify фолд может оказаться без позитивов вообще.
- Подбор гиперпараметров и финальная оценка — на разных уровнях. Иначе результат на CV завышен; для честной оценки — nested CV или отдельный hold-out.
Эталонный ответ
Cross-validation — это среднее качества модели по нескольким train/val разбиениям. k-fold даёт стабильную оценку. Используйте Stratified для классификации, Group — когда есть зависимые наблюдения, TimeSeriesSplit — для временных рядов. Препроцессинг — внутри Pipeline, чтобы не было утечки.