Как происходило разбиение данных на train и test?
Что проверяют
Понимаете ли вы, что оценка модели честная только тогда, когда тест похож на будущие данные, а в обучение не просочились подсказки из теста. Следом почти всегда спрашивают про утечки и про то, как вы делили данные со временем или с повторяющимися пользователями.
Как отвечать
Начните со своего проекта: что за данные, сколько строк, как устроена целевая переменная. Потом объясните выбор схемы:
- случайное разбиение:
train_test_splitиз scikit-learn по умолчанию перемешивает данные и отдаёт в тест 25%. Фиксируйтеrandom_state, чтобы результат воспроизводился; - стратификация:
stratify=yсохраняет долю классов в обеих частях, это важно при дисбалансе, когда редкого класса несколько процентов; - по времени: если данные временные (продажи, транзакции, отток), обучаетесь на прошлом, проверяетесь на будущем. Для кросс-валидации есть
TimeSeriesSplit; - по группам: если у одного клиента много строк, они должны целиком попасть в одну часть. Для этого
GroupShuffleSplitиGroupKFold, иначе модель запоминает клиента, а не закономерность; - три части, а не две: гиперпараметры подбираются на валидации или кросс-валидацией по train, а тест открывается один раз в самом конце.
Отдельно скажите про утечки. Масштабирование, заполнение пропусков и target encoding обучаются только на train, удобнее всего через Pipeline, который кросс-валидация переобучает на каждом фолде. Дубликаты убираются до разбиения.
Пропорции вроде 80/20 не догма: на миллионах строк тесту хватит нескольких процентов, а на тысяче строк важнее кросс-валидация.
Где спотыкаются
Делают StandardScaler().fit на всём датасете, а потом делят. Статистики теста уже попали в обучение, и метрика завышена.
Перемешивают временной ряд. На случайном разбиении модель показывает отличный результат, а на реальных новых данных проседает.
Многократно смотрят на тест и подбирают под него параметры. Тест превращается во вторую валидацию, и честной оценки больше нет.