train_test_split без рассинхронизации X и y
Содержание курса
Тестовая выборка только для оценки: запрет передачи X_test в fit
После разбиения у нас четыре переменных, и их назначение строго разделено: X_train и y_train идут в обучение, X_test и y_test — только в оценку после обучения. Правило записывается так:
model.fit(X_train, y_train) # правильно
# model.fit(X_test, y_test) # ошибка по смыслу
# model.fit(pd.concat([X_train, X_test]), ...) # тоже ошибка
Почему это важно? fit подстраивает параметры модели под те строки, которые она видит. Если в fit попадают строки из X_test, модель обучается на тех же объектах, на которых её потом будут оценивать. Тестовая выборка перестаёт быть независимой, и её метрика начинает отражать не способность модели обобщаться, а то, насколько хорошо она подогналась под конкретные строки.
Это называют утечкой тестовых данных (data leakage). Её эффект — оптимистическое смещение оценки: метрика на тесте может казаться лучше, чем покажет модель на реально новых данных. При этом смещение не обязательно будет большим — оно может быть небольшим и при этом вводить в заблуждение. Важно и то, что хорошая метрика на тесте сама по себе не означает отсутствия утечки: убедиться в корректности разбиения можно, только проверив состав данных, переданных в fit.
Тестовая выборка должна имитировать данные, которые модель встретит после деплоя — данные, которых она никогда не видела. Как только хотя бы одна строка из теста попала в fit, эта гарантия нарушена для всего теста целиком.
Проверка связи X и y после разделения
Представьте, что X содержит идентификатор объекта и его признаки, а y — целевое значение. Две независимые случайные перестановки X и y уничтожат соответствие строк, даже если размеры совпали. Передавайте связанные массивы в один split, затем проверьте несколько пар по исходным идентификаторам.
Для учебной самопроверки составьте пять строк с уникальным id и вручную известной целью, например удвоенным id. После разделения каждая цель должна по-прежнему соответствовать своему объекту. Число строк и отсутствие общих индексов не проверяют эту связь.
Если в данных несколько записей одного пользователя, продумайте групповой split. Если модель должна предсказывать будущее, проверяйте доступность признаков во времени и временную границу. Фиксированный random_state помогает повторить эксперимент, но сам по себе не предотвращает утечку. До сравнения моделей зафиксируйте один подходящий способ проверки.
Продолжите разбор: Утечка цели и неправильное разделение.
