Как разбивать данные: по времени или случайно перемешивать?
Что проверяют
Понимаете ли вы, что валидация должна повторять условия продакшена: модель учится на прошлом и предсказывает будущее. Следом обычно спрашивают, как устроить кросс-валидацию на временных данных и зачем нужен зазор между train и тестом.
Как отвечать
Короткий ответ: по времени, если модель будет применяться к будущим данным и в них есть дрейф или временная структура. Случайно, если наблюдения действительно независимы и порядок ни на что не влияет.
- когда по времени: прогноз спроса, отток, скоринг, рекомендации, антифрод, почти любые данные о поведении пользователей. Случайное разбиение здесь пускает будущее в обучение, и метрика получается выше, чем будет в проде;
- когда случайно: классификация изображений, тексты без привязки к дате, лабораторные замеры. Если у одного объекта много строк, случайно, но по группам (
GroupKFold); - кросс-валидация по времени:
TimeSeriesSplitв scikit-learn даёт растущее окно обучения и следующий за ним отрезок для проверки, параметрgapзадаёт пропуск между ними; - зазор: если таргет смотрит вперёд, например «уйдёт ли клиент за 30 дней», между концом train и началом теста оставляют окно не меньше горизонта. Иначе метки обучения перекрываются с периодом теста;
- комбинированная схема: последний период откладывают как финальный out-of-time тест, а на остальном времени делают кросс-валидацию по времени.
Хорошо добавить, что временной сплит заодно показывает, как быстро модель деградирует. Если качество на каждом следующем месяце падает, это аргумент за регулярное переобучение и мониторинг дрейфа.
Где спотыкаются
Разбивают по времени, но признаки считают на всём датасете. Скользящие средние, target encoding и нормализация видят будущее, и утечка остаётся.
Говорят, что перемешивание защищает от переобучения. Порядок строк в таблице градиентный бустинг не запоминает, а случайный сплит на временных данных как раз и даёт завышенную оценку.
Забывают про зазор при таргете с горизонтом. Последние недели train знают исход, который наступает уже в тестовом периоде, и метрика снова завышена.