Как использовать кросс-валидацию для оценки модели
Что проверяют
Понимаете ли вы, что кросс-валидация это способ честно оценить качество модели и его разброс, а не приём против переобучения. Следом обычно спрашивают, как не допустить утечки данных между фолдами и какую схему взять для временных рядов.
Как отвечать
Суть: данные делятся на k частей, модель k раз учится на всех частях, кроме одной, и проверяется на оставшейся. Итог это среднее метрики и стандартное отклонение. Большой разброс между фолдами сам по себе сигнал: модель нестабильна или данных мало.
Схема выбирается под данные:
KFold: базовый вариант, обычно 5 или 10 фолдов, сshuffle=True, если строки упорядочены. По умолчанию перемешивания нет;StratifiedKFold: сохраняет доли классов в каждом фолде.cross_val_scoreс классификатором и целымcvберёт его сам;GroupKFold: когда у одного пользователя много строк и они не должны попасть одновременно в обучение и в проверку;TimeSeriesSplit: для временных рядов, обучение всегда на прошлом, проверка на будущем;- leave-one-out: k равно числу объектов. Дорого и с большой дисперсией оценки, оправдано только на очень маленьких данных.
В коде это cross_val_score(model, X, y, cv=5, scoring="roc_auc") или cross_validate, если нужно несколько метрик сразу. Предобработку (масштабирование, отбор признаков, заполнение пропусков) кладите в Pipeline: тогда она обучается внутри каждого фолда на его обучающей части. Для подбора гиперпараметров нужна вложенная схема: GridSearchCV во внутреннем цикле, внешний цикл оценивает всю процедуру целиком.
Где спотыкаются
Масштабируют или отбирают признаки на всём датасете до разбиения. Статистики тестовых фолдов протекают в обучение, и метрика на кросс-валидации выходит лучше, чем будет на реальных данных.
Перемешивают временной ряд обычным KFold. Модель учится на будущем и предсказывает прошлое, оценка получается красивой и бесполезной.
Подбирают гиперпараметры по той же кросс-валидации, чей результат потом называют итоговым качеством. Нужна либо вложенная схема, либо отложенная тестовая выборка, которую никто не трогал до самого конца.