Честная проверка модели

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, эта гарантия нарушена для всего теста целиком.