Разбиение train / validation / test честно только тогда, когда один пользователь, документ или фото не сидит на обеих сторонах. Группирую по единице, которая утекла бы: аккаунт, цепочка заявок, исходный файл, кластер почти-дублей из дедупликации. Train, validation и test — замороженные файлы, а не новый случайный разрез на каждом прогоне.
Баланс классов проверяю, а не загадываю. Редкий класс стратифицирую, когда счётчики позволяют; когда нет, в отчёте написано, что тестовый срез слишком мал, чтобы ему верить. Задачи со временем режу по времени, а не перемешиванием, при котором следующая неделя учится на вчерашнем дне. Синтетические близнецы остаются со своим живым родителем на одной стороне.
Приёмка — манифест разбиения, ключ группировки, счётчики по срезам и классам и проверка утечки, которая падает, если нормализованный близнец пересёк границу. Разбиение уже чистого корпуса часто занимает 1–2 недели. Цифры затем входят в контроль качества датасета.
