Вы выбрали правильный способ избежать утечки данных, как говорите: вложенное резюме .
Дело в том, что во вложенном резюме вы оцениваете не реальную оценку, которую вы можете «держать в своих руках», а несуществующий «метаоценщик», который также описывает процесс выбора модели.
Значение - в каждом раунде внешней перекрестной проверки (в вашем случае, представленном cross_val_score ), оценщик clf_auc подвергается внутреннему CV, который выбирает лучшую модель из заданного сгиба внешнее резюме.
Таким образом, для каждого сгиба внешнего резюме вы выставляете оценку, выбранную внутренним резюме.
Например, в одном внешнем сгибе CV набранной моделью может быть тот, который выбрал параметр algo__min_child_weight равным 1, а в другой модели, который выбрал его равным 2.
Таким образом, оценка внешнего резюме представляет собой более высокую оценку: «насколько хорошо будет обобщена моя выбранная модель в процессе разумного выбора модели».
Теперь, если вы хотите завершить процесс с реальной моделью в руках, вам придется каким-то образом выбрать ее (cross_val_score не сделает этого за вас).
Способ сделать это - теперь приспособить вашу внутреннюю модель ко всем данным.
смысл выполнять:
clf_auc.fit(X, y)
Это момент, чтобы понять, что вы здесь сделали:
- У вас есть модель, которую вы можете использовать, которая соответствует всем имеющимся данным.
- Когда вас спрашивают "насколько хорошо эта модель обобщает новые данные?" ответ - это оценка, которую вы получили во время своего вложенного резюме, которое учитывало процесс выбора модели как часть оценки вашей модели.
А что касается Вопроса № 2 - если скейлер является частью конвейера, нет никаких причин манипулировать X_train извне.